Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];

Вниз

Динамические массивы в Паскале - структура?   Найти похожие ветки 

 
Maks Realov   (2003-11-12 19:51) [0]

Когда я использую статический массив для передачи его по-значению в процедуру BlockWrite все значения записываются нормально, а когда использую динамический массив - пишется бред, хотя дебагер показывает, что при разъименовании ссылки на дин. массив значения в нём верные.
Я почитал, что паскалевские динамич. массивы (LongString-и, к примеру), содержат в себе 32 бита инфы о размере и 32 бита - счётчик ссылок. Где эта инфа хранится? В начале? И что, мне теперь делать BlockWrite для каждого эл-та динамич. массива (есесенно BlockWrite(fFile, pData^[0],...) канает)?


...
PData1 = ^TData1;
TData1 = array of integer;
...
procedure TForm1.Button4Click(Sender: TObject);
var
fFile: file;
pData: PData1;
begin
New(pData);
SetLength(pData^, 2);
pData^[0]:= 128;
pData^[1]:= 256;
try
AssignFile(fFile, "FileNameToSave");
FileMode := FmOpenWrite;
Rewrite(fFile, 1);
BlockWrite(fFile, pData^, SizeOf(Integer)*Length(pData^));
finally
CloseFile(fFile);
end;
Dispose(pData);
end;


 
yo   (2003-11-12 20:15) [1]

Вся доп. инфа обычно хранится по отрицательному смещению и
к твоеё проблеме никакого отношения не имеет.

Дело в том, что адресом статического массива и адрес его
первого элемента - одно и тоже.
Поэтому можно написать как
BlockWrite(fFile, StatArr{здесь хоть и не пишется @, но передача происходит через var, т.е. фактически по указателю,
а @StatArr = @StatArr[0]}, N); //
так и
BlockWrite(fFile, StatArr[0], N);

Адрес же динамического массива - это адрес указателя,
который указывает на первый элемент массива,
т.е @DynArr <> @DynArr[0].
@DynArr[0] - это по сути адрес буфера, в котором хранятся
сами данные, который и требуется BlockWrite (только без @).

Поэтому будет правильно
BlockWrite(fFile, DynArr[0], Length(DynArr)); // Пишется весь массив, а не 1й эл-т

var
fFile: file;
Data: TData1; //PData1;
begin
//New(pData); - нафиг. зачем выделять память под 4х байтовый указатель???
SetLength(Data, 2);
Data[0]:= 128;
Data[1]:= 256;
try
AssignFile(fFile, "FileNameToSave");
FileMode := FmOpenWrite;
Rewrite(fFile, 1);
BlockWrite(fFile, Data[0], SizeOf(Integer)*Length(Data));
finally
CloseFile(fFile);
end;
//Dispose(pData);
end;


 
Palladin   (2003-11-12 20:16) [2]

преременная объявленная дин массивом является ссылкой на начало массива, данные об использовании и размере идут на 8 байт раньше адреса начала данных, ну в принципе тебе это не надо

вся твоя конструкция заменяется в результате вышесказанного на
Data:array of integer;
BlockWrite(fFile,Data[0],length(Data)*sizeof(integer))


 
Maks Realov   (2003-11-13 10:51) [3]

Cпасибо.
Я просто повёлся на то, что под дебагом Watcher показывает, что pData^ содержит элементы массива, а фактически записывался адрес.
Вот блин, не подскажете, в какой книге грамотно описанны структуры данных в Delphi, описанна работа менеджеров памяти и т.д? А то всё, что я нашёл в магазинах - хлам полный :(
Ещё раз спасибо.


 
Юрий Зотов   (2003-11-13 10:57) [4]

> Maks Realov (13.11.03 10:51) [3]

> в какой книге грамотно описанны структуры данных в Delphi,
> описанна работа менеджеров памяти и т.д?

Посмотрите книгу Стива Тейксейры и Ксавье Пачеко. Можно найти в Сети в электронном виде. На русском языке.

> А то всё, что я нашёл в магазинах - хлам полный :(

Увы, много такого. Поэтому никогда не берите книги, на обложке которых написано "за 21 день". Или в которых встречаются фразы типа "щелкните левой кнопкой мыши по кнопке с надписью <Вася>".


 
Тимохов   (2003-11-13 12:14) [5]

По поводу хорошой документации - все (или почти все) есть в хелпе по дельфи в разделе "Object Pascal Reference".

Как ни удивительно (обычно штатные хелпы к программам не очень хороши), но там есть ответы почти на все вопросы.


 
Maks Realov   (2003-11-13 12:14) [6]

Ещё одно НО по поводу комментария yo про невыделение памяти под указатель.
Попробовал не распределять явно память под переменную типа указателя на динамический массив of integer. Тут же при попытке установить его длину (SetLength) получил AV по опред. адресу.

...
PArrayData = ^TArrayData;
TArrayData = array of integer;
...
procedure TForm.ApplyButtonClick(Sender: TObject);
var
CheckedBoxes: PArrayData;
begin
// New(CheckedBoxes);
...
SetLength(CheckedBoxes^, 2); // AV here
...


 
Тимохов   (2003-11-13 12:16) [7]

To Maks.
Есть есть указательно, то память под него выделять надо.
Строчка new(checkedboxes) нужна.


 
Тимохов   (2003-11-13 12:16) [8]

Непонятно зачем ты пользуешь указатель на массив?


 
Maks Realov   (2003-11-13 12:25) [9]

2 Тимохов:
да на самом деле у меня была структура, которая впоследствии выродилась в дин. массив. Так что тут конечно смысла нет указатель использовать, т.к. получается указатель на указатель 8)


 
Anatoly Podgoretsky   (2003-11-13 12:33) [10]

Если структура, то смысл есть.
Но тебе надо читать книги про программирования и не лезть во внутреннее устройство, сегодян оно одно, завтра другое.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
1-79036
Sveta
2003-11-13 15:51
2003.11.24
Работа с txt-файлами


1-79021
ChecheNeC
2003-11-14 22:41
2003.11.24
RxRichEdit


1-78921
JS
2003-11-12 11:36
2003.11.24
inline-функции


14-79101
gestern
2003-11-02 16:23
2003.11.24
Это всё от бардака в стране


4-79216
Iron Maiden
2003-09-28 16:50
2003.11.24
Создание рисованной программы.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский