"Invald Pointer" при работе конструктора в компоне

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
TBackup
Сообщения: 6
Зарегистрирован: 09 окт 2006, 11:24
Контактная информация:

День добрый!

У меня такая задача: Не обходибо выделить память в байтах, после 1й байта этого куска памяти присвоить в переменную-указатель типа TDTime(свой формат, который применяется у нас на станции), и во второй указатель на массив типа TParameter(много объектов будет). Все не обходимо решить динамически, т.к. должна быть ф-ция (конструктор) которая зная сво-ва компонента будет создавать такой буфер и инициализоровать указатели.

Решением моей задачи на си будет таковым:

Код: Выделить всё

SizeOfBuf = sizoof(TDtime) + (sizeof(Tparameter)* CountParams);
char * aBuf = new char[SizeOfBuf];

TDtime * pDT = (TDtime *)aBuf;
Tparameter * pParams = (Tparameter *)((int)aBuf + sizeof(TDtime));

Прошу помочь мне решить эту небольшую задачку на дельфи!

Что пробовал:

Код: Выделить всё

    aBuf          : Pointer;
    dtime         : ^TDTime;
    params        : PParameters;
//  aBuf := GetMemory(SizeOf(TDTime) + (SizeOf(TParameter) * FCountParams));
//  dtime := aBuf;
//  params := Pointer(Integer(aBuf) + SizeOf(TDTime));
Это я сделал в конструкторе компонента, что же просиходит?

Я при использовании компонента, кидаю на форму, после File -> Close All получаю в Турбо Дельфи "Invalid Pointer"
ASUTP - Foreva
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Ну если ты делаешь ссылку тобишь указатель на тип ^TDTime то, капать нужно в ту сторону, здесь этого не видно, где описалово записи?...
TBackup
Сообщения: 6
Зарегистрирован: 09 окт 2006, 11:24
Контактная информация:

Duncon,
Это не Важно! Но если тебе это что-то даст для генерации ответа, пожаулуйста:

Код: Выделить всё

  TDTime = record
    {$A1+}
    FMin    : Byte;
    FHour   : Byte;
    FMs     : Byte;
    FSec    : Byte;
    FYear   : Word;
    FDay    : Byte;
    FMonth  : Byte;
    {$A1-}
  end;

  TParameter = record
    {A1+}
    FCode   : Word;
    FValue  : Single;
    FStatus : Word;
    {A1-}
  end;
Кажется я догадываюсь, дело в том что я объявляю указатель на массив структур! И не делаю его с SetLength(Массив,КОЛ-Во) возможно в этом!
ASUTP - Foreva
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Кажется я догадываюсь, дело в том что я объявляю указатель на массив структур! И не делаю его с SetLength(Массив,КОЛ-Во) возможно в этом!
Все у тебя нормально, только вот:

1. Не понятно, что за тип PParameters - должон быть Pointer'ом
2. Не забывай в деструкторе компонента освобождать выделенную тобой память
3. На всякий случай проверяй выход за пределы выделенной памяти

Особенно важно 2-ое, при File->Close All компонент убиваеться, а выделенная память висит.
Дельфа ее тоже хочет убить, но по каким-то причинам указатель на блок к тому времени меняется.

У меня раньше тоже самое было, пока вручную не стал убивать выделенную память.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Собственно доперло, тебе нужно обращяться к элементам записи а не к самой записи собственно вот так..
var
dtime: TDTime;
begin
dtime^.FHour;
TBackup
Сообщения: 6
Зарегистрирован: 09 окт 2006, 11:24
Контактная информация:

Duncon,
А проще синтаксис никак?
ASUTP - Foreva
TBackup
Сообщения: 6
Зарегистрирован: 09 окт 2006, 11:24
Контактная информация:

somewhere,
Ты задачу понял?

Вобщем в Констукторе я буфер порождаю, а в деструкторе его убиваю! Правила ООП понимаишь!
Надо породить кусок памяти, куда входит:
-первые байты это дата, это структура выше TDTime так сказать все эти первые байт это объект этой структуры!
-После этих первых байт начинается массив объектов структуры, которая содержит описание одного параметра

Вот и получается:
SizeOf(TDTime) равен 8 байт
SizeOf(TParameter) равен к примеру 10 байт( не считал)

Если у нас 15 параметров, то буфер должен быть:

8 + 10 * 16 байт = 168 байт !

т.е. надо задать указатель на дату и присвоить ему адрес 1го байта этого буфера, далее после даты это 9й байт присвоить указателю на массив объектов TParameter, для того чтобы в любой момен легко:

for I= 0 to 10-1 then
param.Value = CurrentValue;

мысль ясна?
ASUTP - Foreva
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

TBackup, ты занимаешся полнейшей ху*той, не поленись найди книжку и почитай про типизированные указатели.
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Duncon, я на тебя зубов нарисовал :D
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

А да сорри, я опять за старое, сложно бороться с собой... :D
Ответить