![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамические массивы в делфи [D7, WinXP]
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]?
да.........