Страница 1 из 1

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

Добавлено: 09 окт 2006, 11:42
TBackup
День добрый!

У меня такая задача: Не обходибо выделить память в байтах, после 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"

Добавлено: 09 окт 2006, 19:59
Duncon
Ну если ты делаешь ссылку тобишь указатель на тип ^TDTime то, капать нужно в ту сторону, здесь этого не видно, где описалово записи?...

Добавлено: 10 окт 2006, 08:18
TBackup
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(Массив,КОЛ-Во) возможно в этом!

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

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

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

У меня раньше тоже самое было, пока вручную не стал убивать выделенную память.

Добавлено: 10 окт 2006, 09:56
Duncon
Собственно доперло, тебе нужно обращяться к элементам записи а не к самой записи собственно вот так..
var
dtime: TDTime;
begin
dtime^.FHour;

Добавлено: 10 окт 2006, 10:58
TBackup
Duncon,
А проще синтаксис никак?

Добавлено: 10 окт 2006, 12:03
TBackup
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;

мысль ясна?

Добавлено: 10 окт 2006, 18:07
Duncon
TBackup, ты занимаешся полнейшей ху*той, не поленись найди книжку и почитай про типизированные указатели.

Добавлено: 10 окт 2006, 18:51
AiK
Duncon, я на тебя зубов нарисовал :D

Добавлено: 10 окт 2006, 22:19
Duncon
А да сорри, я опять за старое, сложно бороться с собой... :D