powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать Асоциативный многомерный массив
25 сообщений из 75, страница 3 из 3
Как сделать Асоциативный многомерный массив
    #39986551
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Den_Z_

А я всего-то поинтересовался, как используете.

Да так же, как в вашем описании из документации, где get/set: что-то собираю/группирую.
В контексте скрипта присутствует одна глобальная переменная типа "словарь", или можно создать сколько угодно - чтобы у "переменных" было разное пространство имен.
Почти как у вас, только быстро и чтобы переменные не сериализовались всякий раз, когда при разработке ctrl+s жмешь.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986553
ъъъъъ

VarArrayCreate()


Вот по этому я против типа variant и топлю за TValue

Ибо пока разберёшься, привыкнешь и изучишь. Слишком много времени. А там раз, и пользуешься.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986559
ъъъъъ,

Какой ты злой, прям руку по локоть скушаешь,,, лишь бы откусить. И опять мы бредим.

Прям по первой ссылке из гугла в

FastScript поддерживает все типы массивов: статические (одномерные,многомерные), динамические, вариантные. Вот пример скрипта, использующеготри массива целых чисел, объявленных разным способом:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
  ar1: array[0..2] of Integer;
  ar2: array of Integer;
  ar3: Variant;

SetLength(ar2, 3);
ar3 := VarArrayCreate([0, 2], varInteger);
ar1[0] := 1;
ar2[0] := 1;
ar3[0] := 1;



А это значит что, что бы узнать размер массива VarArrayCreate надо применить те же самые манипуляции, что и при обычном массиве
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986571
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
А это значит что, что бы узнать размер массива VarArrayCreate надо применить те же самые манипуляции, что и при обычном массиве

К сожалению, VarArrayCreate единственная зарегистрированная функция. Остальные функций работы с массивом нужно добавлять вручную
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986576
DimaBr,

То есть, в fastreport нету совершенно функции Length для всех 3 вариантов. Ну в принципе ладно.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986587
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
GrigoriyFomin
К чему это - в пхп это делается красиво и удобно, в дельфе из коробки решения нет,
Как-то странно сравнивать компилируемый и интерпретируемые языки.

Хорошо, Делфи отстой. Приведите пример решения на Java. Напомню требования

1. Ключами массива могут быть строки и/или числа
2. Строковой индекс, который может быть преобразован к числу, должен быть преобразован к числу
3. Массив должен сохранять порядок добавления элементов
4. Должен быть быстрый поиск по ключу
5. Элементами массива могут быть любые типы, в том числе и массивы
6. Все преобразования типов должны происходить под капотом
да, та ещё дилема
LinkedHashMap завезли, а вот Variant нет

в дельфи придётся написать LinkedHashMap - что в принципе не так сложно
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986591
kealon(Ruslan)

LinkedHashMap завезли, а вот Variant нет

в дельфи придётся написать LinkedHashMap - что в принципе не так сложно


Завезли более чем 8 лет назад. 2020Г - Придётся написать в Delphi.

Звучит абсурдно. Ну и Java разработчики не жалуются на отсутствие Variant. Хороший пример реализация JPHP где есть массивы как в PHP и переменные. И управления типами - точно такое же. И даже массивы хранят свой порядок добавления элементов :D Но язык посредственный.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986592
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
DimaBr,
То есть, в fastreport нету совершенно функции Length для всех 3 вариантов. Ну в принципе ладно.

Length есть
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  if MethodName = 'LENGTH' then
  begin
    v := Caller.Params[0];
    if VarIsArray(v) then
      Result := VarArrayHighBound(v, 1) - VarArrayLowBound(v, 1) + 1
    else
      Result := Length(v)
  end
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986593
DimaBr,

Ну вот. Развели ор, раньше гор. Хотя и так всё из коробки есть для базового уровня.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986596
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
kealon(Ruslan)

LinkedHashMap завезли, а вот Variant нет

в дельфи придётся написать LinkedHashMap - что в принципе не так сложно


Завезли более чем 8 лет назад. 2020Г - Придётся написать в Delphi.

Звучит абсурдно. Ну и Java разработчики не жалуются на отсутствие Variant. Хороший пример реализация JPHP где есть массивы как в PHP и переменные. И управления типами - точно такое же. И даже массивы хранят свой порядок добавления элементов :D Но язык посредственный.
что абсурдно звучит? что в стандартной поставке RTL от дельфи нет TLinkedDictionary?
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986597
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
DimaBr,
Ну вот. Развели ор, раньше гор. Хотя и так всё из коробки есть для базового уровня.

Это не я придумывал собственный механизм. Мне TfrxVariable вполне хватает.
К сожалению, VarArrayCreate единственная зарегистрированная функция. Остальные функций работы с массивом нужно добавлять вручную
из этого набора только VarArrayCreate зарегистрированна
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
function VarIsArray(const A: Variant): Boolean; overload;
function VarIsArray(const A: Variant; AResolveByRef: Boolean): Boolean; overload;

function VarArrayCreate(const Bounds: array of Integer; AVarType: TVarType): Variant;
function VarArrayOf(const Values: array of Variant): Variant;

function VarArrayRef(const A: Variant): Variant;

function VarTypeIsValidArrayType(const AVarType: TVarType): Boolean;
function VarTypeIsValidElementType(const AVarType: TVarType): Boolean;

{ The following functions will handle normal variant arrays as well as
  variant arrays references by another variant using byref }

function VarArrayDimCount(const A: Variant): Integer;
function VarArrayLowBound(const A: Variant; Dim: Integer): Integer;
function VarArrayHighBound(const A: Variant; Dim: Integer): Integer;

function VarArrayLock(const A: Variant): Pointer;
procedure VarArrayUnlock(const A: Variant);

function VarArrayAsPSafeArray(const A: Variant): PVarArray;

function VarArrayGet(const A: Variant; const Indices: array of Integer): Variant;
procedure VarArrayPut(var A: Variant; const Value: Variant; const Indices: array of Integer);

{ Variant Arrays <--> Dynamic Arrays }

procedure DynArrayToVariant(var V: Variant; const DynArray: Pointer; TypeInfo: Pointer);
procedure DynArrayFromVariant(var DynArray: Pointer; const V: Variant; TypeInfo: Pointer);

...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986602
DimaBr,

Я понимаю что не ты придумал. Я даже знал что есть.

Кстати, видел ещё вызов VarArrayOf так что не единственная. Скорее всего там предусмотрена проверка что переменная является массивом. Так что функция VarIsArray не нужна. VarArrayRef тоже не нужна. VarTypeIsValidArrayType и VarTypeIsValidElementType тоже не нужны. VarArrayLock и VarArrayUnlock тоже не нужны. VarArrayAsPSafeArray тоже не нужна.
Функции VarArrayGet и VarArrayPut реализованы через [idx] + := val. Так же не нужны DynArrayToVariant и DynArrayFromVariant и опять же реализованы VarArrayLowBound и VarArrayHighBound


Больше нечего добавлять. Всё нужное есть. Так что и жаловаться не на что.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986610
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Кстати, видел ещё вызов VarArrayOf так что не единственная

VarArrayOf - не зарегистрированна
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986612
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
демка 6.5.0
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986613
DimaBr,

Значит они решили что она не нужна.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986618
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
и опять же реализованы VarArrayLowBound и VarArrayHighBound

На самом деле VarArrayCreate - это не настоящая VarArrayCreate из Delphi. Сюрпайз!!!
Фастовская VarArrayCreate создаёт массив размерностью 0..HighBound. Захотел создать массив [3..5] - пиши свою реализацию
И узнать нижнюю/верхнюю границу стандартными средствами нельзя.
Разработчики считают, что раз создаётся только массивы от НУЛЯ, то и границы массивов определять не нужно (достаточно Length), хотя именно в Lengh написано (Result := VarArrayHighBound(v, 1) - VarArrayLowBound(v, 1) + 1), то есть из верхней границы вычитается нижняя (хотя она же нулевая).
По факту, Length работает для всех массивов, а VarArrayCreate - только "собственных"
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
else if MethodName = 'VARARRAYCREATE' then
    Result := VArrayCreate(Caller.Params[0], Caller.Params[1])

function VArrayCreate(Args: Variant; Typ: Integer): Variant;
var
  i, n: Integer;
  ar: array of {$IFDEF FPC}SizeInt{$ELSE}Integer{$ENDIF};
begin
  n := VarArrayHighBound(Args, 1) + 1;
  SetLength(ar, n);
  for i := 0 to n - 1 do
    ar[i] := Args[i];

  Result := VarArrayCreate(ar, Typ);
  ar := nil;
end;


Обман кроется в мелочах
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986620
DimaBr,

Опять индусы писали код
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986643
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr,

Функция работает так же как и в Delphi, никакого обмана в ней нет.
Код: pascal
1.
2.
3.
  ar := VarArrayCreate([1, 3, 3, 5], varInteger);
  ar[1, 4] := 1;
  ar[3, 3] := 2;



Приведенный код просто копирует параметр с открытым массивом , из array of variant (используемый в скрипте) в array of Integer(который принимает VarArrayCreate).
Вот, Low/High действительно не хватает из коробки. Спасибо.

ъъъъъ, Спасибо. Т.е. нужна структура быстрого доступа виде Arr['Ключ1', 'Ключ2', ... 'КлючN'] из коробки по аналогии с переменными.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986666
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Den_Z_
ъъъъъ, Спасибо. Т.е. нужна структура быстрого доступа виде Arr['Ключ1', 'Ключ2', ... 'КлючN'] из коробки по аналогии с переменными.

Да в общем-то достаточно одного ключа (один параметр), т.к. всегда склеить строки можно.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986676
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Den_Z_
DimaBr,
Функция работает так же как и в Delphi, никакого обмана в ней нет.

Значит был не прав. Не допонял для чего такой странный механизм копирования
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986701
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ,

Понял. Я просто пытаюсь обобщить задачу(с нашей стороны), чтобы ее конкретизировать для реализации. Хотелось бы иметь контейнер, в который можно свернуть, к примеру таблицу, а потом обращаться arr[<Line>, FieldName]. т.к. давно спрашивают об организации пользовательских данных, хранящихся не в БД. Поэтому и спрашивал у вас об использовании, хотелось бы обобщить в универсальное решение.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39986939
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Den_Z_
ъъъъъ,

Понял. Я просто пытаюсь обобщить задачу(с нашей стороны), чтобы ее конкретизировать для реализации. Хотелось бы иметь контейнер, в который можно свернуть, к примеру таблицу, а потом обращаться arr[<Line>, FieldName]. т.к. давно спрашивают об организации пользовательских данных, хранящихся не в БД. Поэтому и спрашивал у вас об использовании, хотелось бы обобщить в универсальное решение.
гугли "LINQ Delphi"
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39988543
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
ВсеРазумный,
TValue - тормоз.
Ты уверен?

http://docwiki.embarcadero.com/Libraries/XE2/en/System.Rtti.TValue Represents a lightweight version of the Variant type.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39988645
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Это результат моих тестов.
...
Рейтинг: 0 / 0
Как сделать Асоциативный многомерный массив
    #39988714
Квейд,

Медленнее! На много. На целых 0.000097 сек. Я считаю что это показатель не использовать TValue (Рофл)
...
Рейтинг: 0 / 0
25 сообщений из 75, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать Асоциативный многомерный массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]