Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.04 c
3-1125631152
DrAndrey
2005-09-02 07:19
2005.10.16
GETDATE() внутри User Defined Functions


2-1126785349
Vad_
2005-09-15 15:55
2005.10.16
про грид


3-1125483316
Alex Kryuchkov
2005-08-31 14:15
2005.10.16
"Мусор" в полях типа text на БД Sybase


1-1127421199
Евгений Р.
2005-09-23 00:33
2005.10.16
Сумма прописью на английском


14-1127651029
alsov
2005-09-25 16:23
2005.10.16
Компонент - кнопка с 4 положениями (Up, MouseMove, Down, Disable)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский