|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
нестандартные динамические массивы
Доброго времени суток всем!
Вот возник такой вопрос: реально ли в делфи создавать массивы, у которых индексом будет не цифра, а слово? Так, например в php есть возможность работать с массивами типа $arr['one'] Так же есть вопрос немного иного плана: подскажите пожалуйста, как создавать массивы во время выполнения программы? Допустим есть у меня массив массивов и нужно в него в процессе выполнения добавлять новые, созданные в зависимости от действий пользователя. Возможно ли это и как в такой случае под них правильно выделять память? Заранее благодарю за любые советы. |
#2
|
||||
|
||||
Цитата:
Цитата:
Код:
var m: array of Integer; ... begin SetLength(m, 100); // Задать размер этого массива равный 100 элементов |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
VarvarNet (14.12.2012)
|
#3
|
|||
|
|||
Благодарю за ответ.
Но со вторым вопросом вы меня немного не поняли. Вот есть у нас функция некая: Код:
function bla(): bool; var arr1: array of integer; begin // работаем работаем и тут понимаем, что нам бы ещё один массивчик // и каким-то волшебным образом его создаём не в блоке var а уже в процессе работы. end; |
#4
|
||||
|
||||
Цитата:
p.s. Это что, в php есть возможность создавать такие массивы? И в каких случаях могут быть полезны такого рода массивы? |
#5
|
|||
|
|||
Цитата:
полезным... ну вот в процессе работы появляются некие значения, которым соответствуют по несколько других параметров. Создаю я массив с именем равным этому значению и в него записываю соответствующие ему параметры. как-то так. Я уже понял, что всё это как-то слишком абстрактно и проще создать свой класс и динамический массив этого класса, просто интересно было, реально ли это вообще. |
#6
|
||||
|
||||
Чтобы индексом было имя - стоит подумать. Подумать раз 50, прежде чем такое реализовывать.
Если индекс - число, то i - элемент массива получается так: Код:
element := (array + i * sizeof(element))^; А если индекс - произвольные данные, то единственный способ использовать таков (на псевдокоде): Код:
для каждого элемента из массива проверить если текущий_элемент.индекс = нужный_индекс то element := текущий_элемент По поводу динамического создания массивов: Ничто не мешает сделать 1) Создать массив/список указателей на массивы. Изначально все нули. По мере надобности создается массив и его адрес добавляется в этот массив/список. 2) Если нужно только временное пользование, то просто сделать один указатель на массив, для которого выделять память нужного размера. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 14.12.2012 в 21:13. |
#7
|
|||
|
|||
Да я пошёл уже по другому пути:
Код:
type Tmytype : record index: widestring; param1: integer; ... end; |
#8
|
||||
|
||||
Была уже такая тема, на сколько я помню Феникс отвечал, смысл был в том чтобы юзать TStrings.Values
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#9
|
||||
|
||||
аналогом ассоциативного массива php в Delphi может служить TStrings. ключом лучше использовать хэш значение строки.
Пишу программы за еду. __________________ |
#10
|
||||
|
||||
2:
Код:
uses IniFiles, var h: TStringHash; begin h:=TStringHash.Create; h.Add('ab cd', 1); h.Add('q=z', 22); h.Add('3', 333); ShowMessage(IntToStr(h.ValueOf('ab cd'))); ShowMessage(IntToStr(h.ValueOf('q=z'))); ShowMessage(IntToStr(h.ValueOf('3'))); h.Free; end; 3: http://www.delphikingdom.com/asp/vie...?catalogid=868 Пишу программы за еду. __________________ |
#11
|
|||
|
|||
Цитата:
Можно сделать массив массивов: Код:
arr1: array of array of integer; ///// SetLength (arr1, 1); SetLength (arr1[0], 2); arr1[0][0] := x; arr1[0][1] := y; // а потом решили ещё одну точку запомнить SetLength (arr1, 2); SetLength (arr1[0], 2); arr1[1][0] := x; arr1[1][1] := y; |