|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.09.2011, 00:03 | #1 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
незаполненные массивы и память
Здрастуйте =)
у меня вот какой вопрос: допустим есть array of TStrings. что будет если я SetLength(array,1000), а потом array[999]:=TStringList.Create; ? т.е. по-идее я создам один единственный TStringList, но как это скажется на памяти, с учетом того что он 999-й в массиве? весь остальной массив пустой. p.s. пытаюсь придумать систему хранения табличных данных. кроме как array of TStrings ничего не придумал. может есть у кого гениальные идеи на этот счет? Как бы это сделал "правильный" програмер? Последний раз редактировалось xrob; 03.09.2011 в 00:05. |
03.09.2011, 00:10 | #2 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
да собственно после SetLength вы уже выделили память на 1000 указателей(помним что объекты по ссылкам хранятся)
или ччего вы ожидаете? лишь один элемент массива будет указывать на объект, остальные мусор. Цитата:
тут или массив списков или список списков. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 03.09.2011 в 00:12. |
|
03.09.2011, 00:11 | #3 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
SetLength(array,1000) и отведет память для 1000 указателей на TStrings. array[999]:=TStringList.Create запишет указатель в ранее отведенное место.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
03.09.2011, 00:12 | #4 | ||
Форумчанин
Регистрация: 24.11.2006
Сообщений: 108
|
Цитата:
SetLength(array, 0); Цитата:
База данных? не? |
||
03.09.2011, 00:27 | #5 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
да, вот как раз я и подумал потом про указатели.
и если следовать логике указателей, то array[x]:=TStringList.Create; равно s:=TStringList.Create; array[x]:=s; да? а что вы можете сказать вот об этом? type TXStrings = array of string; var Test:array of TXStrings; т.е. массив массивов из строк... такое вообще допустимо? компилится нормально. только я вообще не понял как с этим работать... Test[x][y] - ведь не так же??? а после SetLength(array, 0); насколько я могу понимать, выделится память под 0 элементов массива. при этом то что было им раньше занято останется, пока не будет перезаписано чем-то другим. а если еще после этого снова сделать SetLength(array, 999); то все вернется на свои места, или перезапишется в null, я прав? ViktorXP, ну мою задачу я озвучил - реализовать систему хранения табличной информации. т.е. типа того: "что-то" "нечто" "ничего" "еще что-нибудь" "что-то" "нечто" "ничего" "еще что-нибудь" и т.д. база данных это или нет - вопрос субъективный. для кого-то это база, для кого-то это смех веселый =) вот как-то так. |
03.09.2011, 00:33 | #6 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Цитата:
Вот скелет: Код:
|
|
03.09.2011, 00:36 | #7 | |||
Форумчанин
Регистрация: 24.11.2006
Сообщений: 108
|
Цитата:
Цитата:
Test[x,y]компилятор поймет. Да (хотя скорее в nil ) Цитата:
если у тебя ниже тогда посмотри в сторону TBucketList из модуля Contnrs (TBucketList не так удобно как сие можно реализовать на TDictionary) Последний раз редактировалось ViktorXP; 03.09.2011 в 00:40. |
|||
03.09.2011, 00:47 | #8 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
Add(aDB); это видимо функция описанная в классе, от которого вы унаследовали TMyDBList, да?
а TMyDB содержит TStringList. а функция Add(aDB); кладет куда-то в TMyDBList экземпляр TMyDB, так? по сути это то же самое что и array of TStrings, только основано на более высокоуровневых объектах. или я не прав? мне кажется вы слишком сложно завернули для моей задачи. и слова страшные используете: MyDB, ListDB... "список баз данных"... у меня вызывает оочень "тяжелые" ассоциации =) а я хочу сделать легкий доступ к своим данным типа как Cells[x,y] в StringGrid. но за идею спасибо =) ViktorXP, у меня Delphi 10 lite )))) там даже TWebBrowser нету - достал из Delphi 7, на форму ручками прописываю, через Create )) ---------------------- а array of string; тоже указатели? я надеюсь SetLength(array,1000); не займет 255*1000 памяти? Последний раз редактировалось xrob; 03.09.2011 в 01:06. |
03.09.2011, 01:10 | #9 | |
Форумчанин
Регистрация: 01.12.2009
Сообщений: 569
|
Цитата:
Да и доступ примерно тот же. Код:
|
|
03.09.2011, 01:13 | #10 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
с массивами можно таких дел наворотить...
Комментирую: Код:
А ообще это даже выше и проще массивов.. С масивами всегда много проблем(Особенно с многомерными). Массив может быть каким угодно: Код:
Почитайте блог gunsmoker'а там много чего есть и про переменные и про массивы, в общем куча полезной информации=) Последний раз редактировалось Человек_Борща; 03.09.2011 в 01:18. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Виртуальная память | ordoss | Общие вопросы C/C++ | 1 | 12.01.2011 18:00 |
Динамическая память. | spotmc13 | Паскаль, Turbo Pascal, PascalABC.NET | 5 | 20.09.2010 17:08 |
память процесса | T_I_T_A_N | Общие вопросы Delphi | 7 | 28.06.2010 13:52 |
Память | Ghennadiy | Общие вопросы Delphi | 9 | 25.08.2009 09:23 |
динамическая память | aka_faith | Общие вопросы C/C++ | 47 | 12.06.2009 12:35 |