Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.12.2012, 20:10
VarvarNet VarvarNet вне форума
Прохожий
 
Регистрация: 12.12.2012
Сообщения: 10
Репутация: 10
Вопрос нестандартные динамические массивы

Доброго времени суток всем!

Вот возник такой вопрос: реально ли в делфи создавать массивы, у которых индексом будет не цифра, а слово? Так, например в php есть возможность работать с массивами типа $arr['one']

Так же есть вопрос немного иного плана: подскажите пожалуйста, как создавать массивы во время выполнения программы? Допустим есть у меня массив массивов и нужно в него в процессе выполнения добавлять новые, созданные в зависимости от действий пользователя. Возможно ли это и как в такой случае под них правильно выделять память?

Заранее благодарю за любые советы.
Ответить с цитированием
  #2  
Старый 14.12.2012, 20:15
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от VarvarNet
Вот возник такой вопрос: реально ли в делфи создавать массивы, у которых индексом будет не цифра, а слово? Так, например в php есть возможность работать с массивами типа $arr['one']
Нет, слова не могут. Индексом у массивов может быть только перечислимый тип. Но в классах можно делать свойства у которых индексом могут быть и слова.
Цитата:
Сообщение от VarvarNet
Так же есть вопрос немного иного плана: подскажите пожалуйста, как создавать массивы во время выполнения программы? Допустим есть у меня массив массивов и нужно в него в процессе выполнения добавлять новые, созданные в зависимости от действий пользователя. Возможно ли это и как в такой случае под них правильно выделять память?
Возможно. Это динамические массивы:
Код:
var
  m: array of Integer;
...
begin
  SetLength(m, 100); // Задать размер этого массива равный 100 элементов
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
VarvarNet (14.12.2012)
  #3  
Старый 14.12.2012, 20:19
VarvarNet VarvarNet вне форума
Прохожий
 
Регистрация: 12.12.2012
Сообщения: 10
Репутация: 10
По умолчанию

Благодарю за ответ.
Но со вторым вопросом вы меня немного не поняли.
Вот есть у нас функция некая:
Код:
function bla(): bool;
var
arr1: array of integer;
begin

// работаем работаем и тут понимаем, что нам бы ещё один массивчик
// и каким-то волшебным образом его создаём не в блоке var а уже в процессе работы.
end;
Существует ли такая возможность?
Ответить с цитированием
  #4  
Старый 14.12.2012, 20:27
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от VarvarNet
Но со вторым вопросом вы меня немного не поняли.
Вот есть у нас функция некая:
Код:
function bla(): bool;
var
arr1: array of integer;
begin

// работаем работаем и тут понимаем, что нам бы ещё один массивчик
// и каким-то волшебным образом его создаём не в блоке var а уже в процессе работы.
end;
Существует ли такая возможность?
Не понял. Этот массивчик что, будет безымянным? А обращаться к нему как?

p.s. Это что, в php есть возможность создавать такие массивы? И в каких случаях могут быть полезны такого рода массивы?
Ответить с цитированием
  #5  
Старый 14.12.2012, 20:35
VarvarNet VarvarNet вне форума
Прохожий
 
Регистрация: 12.12.2012
Сообщения: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Не понял. Этот массивчик что, будет безымянным? А обращаться к нему как?

p.s. Это что, в php есть возможность создавать такие массивы? И в каких случаях могут быть полезны такого рода массивы?
в php такие массивы создавать нельзя, к сожалению или к счастью.
полезным... ну вот в процессе работы появляются некие значения, которым соответствуют по несколько других параметров.
Создаю я массив с именем равным этому значению и в него записываю соответствующие ему параметры. как-то так.
Я уже понял, что всё это как-то слишком абстрактно и проще создать свой класс и динамический массив этого класса, просто интересно было, реально ли это вообще.
Ответить с цитированием
  #6  
Старый 14.12.2012, 21:09
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Чтобы индексом было имя - стоит подумать. Подумать раз 50, прежде чем такое реализовывать.
Если индекс - число, то i - элемент массива получается так:
Код:
 element := (array + i * sizeof(element))^;
Одно умножение, одно сложение и одно взятие по адресу. 3 операции.
А если индекс - произвольные данные, то единственный способ использовать таков (на псевдокоде):
Код:
для каждого элемента из массива проверить
   если текущий_элемент.индекс = нужный_индекс то
      element := текущий_элемент
И посчитай количество операций, которое понадобится для получения значения, если будет массив например из 75000 элементов. И особенно это касается строк, т.к. сравнение строк - это сравнение всех их символов. Так что лишний раз не стоит это использовать и в пхп (хотя, наверное, там есть ускорение в виде хешей, однако это все равно далекоооо не 3 операции).

По поводу динамического создания массивов:
Ничто не мешает сделать
1) Создать массив/список указателей на массивы. Изначально все нули. По мере надобности создается массив и его адрес добавляется в этот массив/список.
2) Если нужно только временное пользование, то просто сделать один указатель на массив, для которого выделять память нужного размера.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 14.12.2012 в 21:13.
Ответить с цитированием
  #7  
Старый 14.12.2012, 22:30
VarvarNet VarvarNet вне форума
Прохожий
 
Регистрация: 12.12.2012
Сообщения: 10
Репутация: 10
По умолчанию

Да я пошёл уже по другому пути:
Код:
type Tmytype : record
index: widestring;
param1: integer;
...
end;
И далее просто объявил массив array of TMytype;
Ответить с цитированием
  #8  
Старый 14.12.2012, 22:44
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Была уже такая тема, на сколько я помню Феникс отвечал, смысл был в том чтобы юзать TStrings.Values
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #9  
Старый 17.12.2012, 10:19
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

аналогом ассоциативного массива php в Delphi может служить TStrings. ключом лучше использовать хэш значение строки.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 17.12.2012, 10:52
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

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  
Старый 11.08.2013, 22:33
ikv_2006 ikv_2006 вне форума
Прохожий
 
Регистрация: 06.05.2009
Сообщения: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от VarvarNet
Вот есть у нас функция некая:
Код:
function bla(): bool;
var
arr1: array of integer;
begin

// работаем работаем и тут понимаем, что нам бы ещё один массивчик
// и каким-то волшебным образом его создаём не в блоке var а уже в процессе работы.
end;

Можно сделать массив массивов:
Код:
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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:39.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter