Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.16;
Скачать: CL | DM;

Вниз

Динамические массивы в делфи   Найти похожие ветки 

 
Vitaliy   (2005-09-24 19:01) [0]

Вопрос скорее даже по object паскалю.
Нужно переделать прогу со статики на динамику.
То что бы на Си выглядело бы как:

int ** m;
...
m=new int*[Nx];
for (int i=0; i<Nx; i++)
m[i]=new int Ny;

Нужно реализовать в делфи.

Напишите, какого типа объявлять переменную и как эту структуру инициализировать (матрица целых чисел Nx * Ny).


 
Virgo_Style ©   (2005-09-24 19:30) [1]

var M: Array of array of integer;

см. SetLength, Length, High, Low.


 
Vitaliy   (2005-09-24 22:29) [2]

Нет, это конечно здорово, что вы предлагаете, но мне надо эту структуру использовать многократно. То есть загружать в нее матрицы различной размерности (несколько раз во время работы). Вопрос:  SetLength может урезать (если указать меньше, чем уже выделено) с освобождением памяти?
И какой синтаксис когда массив двумерный?
Да, можно ли к динамическому массивы обращаться M[i][j]?


 
wicked ©   (2005-09-24 22:31) [3]


> Вопрос:  SetLength может урезать (если указать меньше, чем
> уже выделено) с освобождением памяти?

да, rtfm...


> И какой синтаксис когда массив двумерный?

SetLength(arr, dim1, dim2)....... rtfm, источник знаний.....


> Да, можно ли к динамическому массивы обращаться M[i][j]?

да.........


 
Vitaliy   (2005-09-24 22:37) [4]

Большое спасибо, сейчас помучаю :)
А rtfm - это что? Что-то типа МСДН для делфи? И где взять?


 
Kolan ©   (2005-09-24 22:49) [5]

rtfm - Read The Fucking Manual ;)


 
wicked ©   (2005-09-24 22:49) [6]


> А rtfm - это что? Что-то типа МСДН для делфи? И где взять?

это настоятельная просьба почитать справку.... там всё есть именно по интересующему вопросу - раздел справки: Object Pascal Reference -> Data types, variables, and constants -> Structured types -> Arrays -> Dynamic Arrays....


 
Vitaliy   (2005-09-24 22:51) [7]

Так, опять не пойму. Там кроме данных в файле есть текстовая информация, "шапка". Ее надо сохранить в памяти на время работы. Думал можно опять массивом строк. Вроде тут не ругался, но:


Head,Tail:array of string;
...
i:=1;
readln(f,s);
while (pos("Кол источников",s)<>1) do begin
  SetLength(Head,i);
  Head[i]:=s;
  inc(i);
  readln(f,s);
end;


На чтении 3-й строки из файла вылетает с ошибкой "access violation at..."
Что бы это могло быть? Если поставить перед циклом чтение еще одной строки - вылетает на 4-й строке файла.


 
Vitaliy   (2005-09-24 22:53) [8]

> rtfm - Read The Fucking Manual ;)
Ах мануал, ну так бы сразу и сказали :)


 
wicked ©   (2005-09-24 22:56) [9]

> Vitaliy   (24.09.05 22:51) [7]
читать о TStringList....
кому сдался этот анахронизм, readln?...


 
Vitaliy   (2005-09-24 22:59) [10]

Кому-кому... Я на Си в основном пишу. Как тогда надо?
За стуктурку спасибо, с ней проще будет, наверное.
Так что вместо readln?


 
wicked ©   (2005-09-24 23:05) [11]


> Кому-кому... Я на Си в основном пишу.

я тоже..... на чем придется.... ;)


> Как тогда надо?

спросить....


> За стуктурку спасибо, с ней проще будет, наверное.
> Так что вместо readln?

в данном случае - TStringList... он умеет LoadFromFile делать...


 
Kolan ©   (2005-09-24 23:08) [12]

Тебе массив строк?

Используй TStringlis
Пример:
var
 Strings: TStrings;
begin
 Strings := TStringList.Create;
 try
   Strings.Add("Строка");
 finally
   Strings.Free;
 end;

Правда на самом деле это не массив но для работы со строками самое то.


 
Vitaliy   (2005-09-24 23:08) [13]

LoadFromFile не пойдет - надо лишь часть файла грузить. Не урезать же потом! Кстати, после подключения этой структуры ошибка с файлом пропала :)
Мистика какая-то!


 
Vitaliy   (2005-09-24 23:12) [14]

Что то не пойму по своей аглицкой "fm", TStringList.Free память самих строк освободит? Или там TStringList.Clear - что нужно делать, чтобы быть уверенным, что память полностью освобождается?


 
Джо ©   (2005-09-24 23:14) [15]


> память самих строк освободит?

Да


 
Kolan ©   (2005-09-24 23:17) [16]

Clear - отчистка.
Free проверит указатель на nil если нет то вызавет Destroy класса.

Чё сделать надо раскажи...


 
Vitaliy   (2005-09-24 23:24) [17]

Что сделать? Писал же: несколько раз в эту структуру данные загружать.
После загрузки - надо очищать. Думаю, .Free надо использовать, я прав?


 
Vitaliy   (2005-09-24 23:37) [18]

Ладно, спасибо всем, принявшим участи в этой дискуссии, завтра может мы еще вернемся к этой теме. Наверняка еще что-нибудь всплывет.


 
Kolan ©   (2005-09-24 23:42) [19]

Что то я запутался -  в посте [0]

Напишите, какого типа объявлять переменную и как эту структуру инициализировать (матрица целых чисел Nx * Ny).

Далее в [7]

Так, опять не пойму. Там кроме данных в файле есть текстовая информация, "шапка". Ее надо сохранить в памяти на время работы. Думал можно опять массивом строк. Вроде тут не ругался, но:

Вот и скажи шо тебе надо сделать, что за файл, как он устроен...


 
Vitaliy   (2005-09-25 08:20) [20]

Да, путаница вышла :)
С файлом я и сам разберусь, ну в двух словах:
1) Сначала "шапка". Ее надо сохранить и потом записать в результирующий файл (конечно, можно и сразу в результирующий писать, но надо имя запросить и т.д., поэтому просто в памяти пока подержать).
2) Потом в довольно хитрозадом текстовом формате записана матрица целых чисел. Читать уж как-нибудь разберусь, мне в динамику надо прогу переделывать, так-то она работает. Просто матриц много и надо память освобождать. Появились большие - статика уже не интересна (от 10 до 1000000 элементов - что, 10 хранить в миллионе?). Тут еще, возможно, потребуется несколько сразу в памяти держать, так что надо разобраться как с динамическими структурами в делфи общаться.
3) Ну и хвостик в файле текстовый есть. Его, в принципе, можно и сразу писать в результирующий файл, это на мое усмотрение.

Да, это не копирование файлов :) Матрица преобразованная записываться  будет.


 
Kolan ©   (2005-09-25 11:18) [21]

Потом в довольно хитрозадом текстовом формате записана матрица целых чисел

Противоречие??
Вообщем  как я понял файл такой:

Шапка  - текст.
Матрица - текст.
И в конце тоже ТЕкст.

Читай весь файл в StringList. Заведи еще 3 туда скопируй Шапку, матрицу, и конец.

Делай с ними что хочешь.
Потом сохрани.

Еще посмотри TFileStream.

А со строками(strings) тебе не надо о выдилении памяти парится они с управляемым временем жизни...


 
Vitaliy   (2005-09-25 13:01) [22]

> Еще посмотри TFileStream.

А зачем с текстовым файлом прямым доступом работать?
Нет, ошибка пропала, что-то там с памятью не так было, когда Array of string делал. Сейчас и readln не глючит.

Файл ты понял правильно, только хранить 1000000 чисел в тексте я не буду, читать приходится построчно и записывать в нормальную матрицу. Их же обрабатывать потом надо!



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

Текущий архив: 2005.10.16;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.045 c
6-1119601823
Соловьев
2005-06-24 12:30
2005.10.16
EasyMail при посылке по SMTP не игнорируется DSN


2-1126848784
Lady
2005-09-16 09:33
2005.10.16
Запрос


2-1126872993
out
2005-09-16 16:16
2005.10.16
DBGrid


9-1118217775
lex(x)
2005-06-08 12:02
2005.10.16
Передвижение камеры!


6-1120095885
vidiv
2005-06-30 05:44
2005.10.16
освобождение памяти после gethostbyname