Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамические массивы в делфи [D7, WinXP]


Страницы:   1 2

Vitaliy ©   (2005-09-24 19:01:00) 

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

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

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

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


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

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

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

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


Kolan   (2005-09-25 11:18:00) [2]

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

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

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

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

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

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

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


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

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

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


Kolan   (2005-09-24 23:42:00) [4]

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

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

Далее в [7]

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

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


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

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


Vitaliy   (2005-09-24 23:24:00) [6]

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


Kolan   (2005-09-24 23:17:00) [7]

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

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


Джо   (2005-09-24 23:14:00) [8]


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

Да


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

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


Kolan   (2005-09-24 23:08:00) [10]

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

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

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


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

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


wicked   (2005-09-24 23:05:00) [12]


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

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


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

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


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

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


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

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


wicked   (2005-09-24 22:56:00) [14]

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


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

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


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

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


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-й строке файла.


wicked   (2005-09-24 22:49:00) [17]


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

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


Kolan   (2005-09-24 22:49:00) [18]

rtfm - Read The Fucking Manual ;)


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

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


wicked   (2005-09-24 22:31:00) [20]


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

да, rtfm...


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

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


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

да.........


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо