PDA

Просмотр полной версии : Массив записей (проблема с доступом) [Delphi]


mr. ZetRikS
29.03.2010, 20:22
Вот собственно суть проблемы есть несколько типов:

//тип 1
type
TTMyType1 = Record
isLinked: SmallInt;
ToT: string;
ToC: Integer;
end;

//тип 2
type
PMyType2 = ^TMyType2;
TMyType2 = record
CNa: string;
CTy: SmallInt;
isa: SmallInt;
Sa: TTMyType1;
end;

//тип 3
type
PMyType3 = ^TMyType3;
TMyType3 = record
ExName: string;
ExParam: array [0..100] of PMyType2;
end;


Вот... далее создаём глобальную переменную типа массив PMyType3, и пытаемся поюзать...

var
qwerty: array [0..10] of PMyType3; //создали массив записей типа PMyType3

и далее где угодно в программе пытаемся поюзать
qwerty[i].ExName:= 'текст_значения';
и так далее, но вот трабл, при таком обращении программка говорит Access violaton бла бла бла, в общем на сколько я понял, объект вроде как есть, но память под него не выделена, хотя он не динамичен, то есть размеры объявлены заранее...

варианты решения проблемы?
заранее спс...

Chrome~
29.03.2010, 22:39
Нужно выделять память с помощью процедуры New, и освобождать с помощью Dispose.
То есть:
var
test: PMyType3;
begin
New(test);
test.ExName:= 'текст_значения';
...
Dispose(test);
end;
По моему так должно быть, хотя точно не уверен.

maestro-ant
30.03.2010, 00:32
Chrome~
Неправильно подсказываешь! Память у него уже выделена.

mr. ZetRikS
проблема в том что ты создаешь массив из указателей на указатели. и пытаешься к нему обратится на прямую.

вот так объяви массив
qwerty: array [0..10] of TMyType3;
и будет все гуд

ЗЫ Пользуйтесь отладчиками

Chrome~
30.03.2010, 01:05
Да нет же, maestro-ant, это ты не умеешь правильно работать с динамической памятью.

Посмотри, как правильно должно быть реализовано в данном случае:

http://slil.ru/28877453
http://rapidshare.com/files/369686671/Test.rar.html

mr. ZetRikS
30.03.2010, 01:40
Так и есть, вопрос исчерпан...

правд ещё косяк был, пришлось в типе 3 вместо PMyType2 использовать так же тип, а не указатель на него...

Всегда так работал (за пять лет таких проблем не случалось), а тут подсказали мол лучше использовать указатели на тип... Для чего особо не понял, но вот собственно и парился пару дней, кстати с типом пробовал, но так как в типе 3 есть переменная ууказателя на тип, вот тут косяк и не увидел, только сейчас когда подсказали узрел...

Спасибо что уделили время моей проблеме... поставил + обим...