Форум: "Основная";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
ВнизДинамические массивы в делфи Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.044 c