powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача массива параметром
25 сообщений из 44, страница 1 из 2
Передача массива параметром
    #39472074
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понадобилось написать процедуру для добавления элемента в массива. Как по феншую правильнее, передать параметром переменную-массив или пойнтер на него?
=================
Док.

Win7 Ultim x64/Deb 8.7 i386:
FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb),
Lazarus 1.9(r.55042); FPC 3.1.1 (r.36290), IBX by -Rik-; IBE 2017.4.19.2
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472084
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, по феншую переменная-массив и есть пойнтер на него.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472091
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM,

я не зря заострил внимание на слове феншуй
Я знаю, что это одно и то же. Как настоящие пац программисты пишут?
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472097
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокКак настоящие пац программисты пишут?
От задачи зависит. Задача же не в том, чтобы передать массив, это лишь вариант её реализации.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472100
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док,
Зависит от того, что хочешь получить.

Есть открытые массивы, как параметр. Можно фиксированной длинны, но целиком в стек запихать. А можно и поинтер, можно и динамический.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472101
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

т.е. с пойнтерами проще ошибиться и кода больше. Тогда предпочту переменную :)
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472108
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesWind,

у меня динамический
Код: pascal
1.
2.
3.
4.
5.
6.
7.
type
  TMyRec = packed record
    FInt: Integer;
    FBool: Boolean;
  end;

  TRecArr = Array of TMyRec;


Вообщем-то реализовал и так, и так. Оба способа рабочие. Но поинтересовался на всякий, что моветону не случилось :)
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472130
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, packed record, сделай так:
Код: pascal
1.
2.
3.
4.
5.
6.
type TMyData = record
 Inta : array of Integer;
 Bola : array of Boolean;
 function Add...
 function Get...
end;
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472134
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокDesWind,

у меня динамический
Код: pascal
1.
2.
3.
4.
5.
6.
7.
type
  TMyRec = packed record
    FInt: Integer;
    FBool: Boolean;
  end;

  TRecArr = Array of TMyRec;


Вообщем-то реализовал и так, и так. Оба способа рабочие. Но поинтересовался на всякий, что моветону не случилось :)

Упаковать можно так, всё это дело весит 9 байт ... Поинтер на Int64 и Extended обязательны! Эти типы очень медленно работают при выравнивании

Код: 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.
31.
32.
  TSPHPValue = packed record
    _Type: Byte;
    case Byte of
      0:
        (TByte: Byte);
      1:
        (TWord: WORD);
      2:
        (TCardinal: Cardinal);
      3:
        (TUInt64: UInt64);
      4:
        (TShortInt: ShortInt);
      5:
        (TSmallInt: SmallInt);
      6:
        (TInteger: NativeInt);
      7:
        (TInt64: PInt64);
      8:
        (TSingle: Single);
      9:
        (TDouble: Double);
      10:
        (TExtended: PExtended);
      11:
        (TCurrency: Currency);
      12:
        (TPointer: Pointer);
      13:
        (TBoxArray: PBoxArray);
  end;




А дальше можно написать уже функции по работе
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
type
  PBoxArray = ^TBoxArray;
  TBoxArray = array of Byte;

  TSPHPValue = packed record
    _Type: Byte;

    procedure StringAdd(const value: string); inline;
    procedure StringSet(const value: string); inline;

    // Вернёт длину и строку только для строки
    function StringLen(): integer; inline;
    function StringGet(): UnicodeString; inline;

    // Вернёт длину и строку для каждого типа
    function GetValueLen(): integer; inline;
    function GetValueString(): UnicodeString; inline;

    // Set
    procedure SetInteger(value: IntPtr); inline;
    procedure SetInt64(value: Int64); inline;
    procedure SetSingle(value: Single); inline;
    procedure SetDouble(value: Double); inline;
    procedure SetExtended(value: Extended); inline;
    procedure SetCurrency(value: Currency); inline;
    procedure SetPointer(value: Pointer); inline;

    // Set + Plus
    procedure SetIntegerPlus(value: IntPtr); inline;
    procedure SetInt64Plus(value: Int64); inline;
    procedure SetSinglePlus(value: Single); inline;
    procedure SetDoublePlus(value: Double); inline;
    procedure SetExtendedPlus(value: Extended); inline;
    procedure SetCurrencyPlus(value: Currency); inline;
    procedure SetPointerPlus(value: Pointer); inline;

    // Set + Minus
    procedure SetIntegerMinus(value: IntPtr); inline;
    procedure SetInt64Minus(value: Int64); inline;
    procedure SetSingleMinus(value: Single); inline;
    procedure SetDoubleMinus(value: Double); inline;
    procedure SetExtendedMinus(value: Extended); inline;
    procedure SetCurrencyMinus(value: Currency); inline;
    procedure SetPointerMinus(value: Pointer); inline;

    // Set + DIV
    procedure SetIntegerDIV(value: IntPtr); inline;
    procedure SetInt64DIV(value: Int64); inline;
    procedure SetSingleDIV(value: Single); inline;
    procedure SetDoubleDIV(value: Double); inline;
    procedure SetExtendedDIV(value: Extended); inline;
    procedure SetCurrencyDIV(value: Currency); inline;
    procedure SetPointerDIV(value: Pointer); inline;

    // Set + MUL
    procedure SetIntegerMUL(value: IntPtr); inline;
    procedure SetInt64MUL(value: Int64); inline;
    procedure SetSingleMUL(value: Single); inline;
    procedure SetDoubleMUL(value: Double); inline;
    procedure SetExtendedMUL(value: Extended); inline;
    procedure SetCurrencyMUL(value: Currency); inline;
    procedure SetPointerMUL(value: Pointer); inline;

    // Set + MOD
    procedure SetIntegerMOD(value: IntPtr); inline;
    procedure SetInt64MOD(value: Int64); inline;
    procedure SetSingleMOD(value: Single); inline;
    procedure SetDoubleMOD(value: Double); inline;
    procedure SetExtendedMOD(value: Extended); inline;
    procedure SetCurrencyMOD(value: Currency); inline;
    procedure SetPointerMOD(value: Pointer); inline;

    // Set + POW
    procedure SetIntegerPOW(value: IntPtr); inline;
    procedure SetInt64POW(value: Int64); inline;
    procedure SetSinglePOW(value: Single); inline;
    procedure SetDoublePOW(value: Double); inline;
    procedure SetExtendedPOW(value: Extended); inline;
    procedure SetCurrencyPOW(value: Currency); inline;
    procedure SetPointerPOW(value: Pointer); inline;


    // SetValue

    procedure SetValue(const value: string); overload; inline;

    procedure SetValue(value: IntPtr); overload; inline;
    procedure SetValue(value: Int64); overload; inline;
    procedure SetValue(value: Single); overload; inline;
    procedure SetValue(value: Double); overload; inline;
    procedure SetValue(value: Extended); overload; inline;
    procedure SetValue(value: Currency); overload; inline;
    procedure SetValue(value: Pointer); overload; inline;

    // SetValue + Plus

    procedure SetValuePlus(value: IntPtr); overload; inline;
    procedure SetValuePlus(value: Int64); overload; inline;
    procedure SetValuePlus(value: Single); overload; inline;
    procedure SetValuePlus(value: Double); overload; inline;
    procedure SetValuePlus(value: Extended); overload; inline;
    procedure SetValuePlus(value: Currency); overload; inline;
    procedure SetValuePlus(value: Pointer); overload; inline;

    // SetValue + Minus

    procedure SetValueMinus(value: IntPtr); overload; inline;
    procedure SetValueMinus(value: Int64); overload; inline;
    procedure SetValueMinus(value: Single); overload; inline;
    procedure SetValueMinus(value: Double); overload; inline;
    procedure SetValueMinus(value: Extended); overload; inline;
    procedure SetValueMinus(value: Currency); overload; inline;
    procedure SetValueMinus(value: Pointer); overload; inline;

    // SetValue + DIV

    procedure SetValueDIV(value: IntPtr); overload; inline;
    procedure SetValueDIV(value: Int64); overload; inline;
    procedure SetValueDIV(value: Single); overload; inline;
    procedure SetValueDIV(value: Double); overload; inline;
    procedure SetValueDIV(value: Extended); overload; inline;
    procedure SetValueDIV(value: Currency); overload; inline;
    procedure SetValueDIV(value: Pointer); overload; inline;

    // SetValue + MUL
    procedure SetValueMUL(value: IntPtr); overload; inline;
    procedure SetValueMUL(value: Int64); overload; inline;
    procedure SetValueMUL(value: Single); overload; inline;
    procedure SetValueMUL(value: Double); overload; inline;
    procedure SetValueMUL(value: Extended); overload; inline;
    procedure SetValueMUL(value: Currency); overload; inline;
    procedure SetValueMUL(value: Pointer); overload; inline;

    // SetValue + MOD

    procedure SetValueMOD(value: IntPtr); overload; inline;
    procedure SetValueMOD(value: Int64); overload; inline;
    procedure SetValueMOD(value: Single); overload; inline;
    procedure SetValueMOD(value: Double); overload; inline;
    procedure SetValueMOD(value: Extended); overload; inline;
    procedure SetValueMOD(value: Currency); overload; inline;
    procedure SetValueMOD(value: Pointer); overload; inline;

    // SetValue + POW

    procedure SetValuePOW(value: IntPtr); overload; inline;
    procedure SetValuePOW(value: Int64); overload; inline;
    procedure SetValuePOW(value: Single); overload; inline;
    procedure SetValuePOW(value: Double); overload; inline;
    procedure SetValuePOW(value: Extended); overload; inline;
    procedure SetValuePOW(value: Currency); overload; inline;
    procedure SetValuePOW(value: Pointer); overload; inline;

    function GetByte: UInt8; inline;
    function GetWord: UInt16; inline;
    function GetInteger: IntPtr; inline;
    function GetInt64: Int64; inline;
    function GetShortInt: Int8; inline;
    function GetSmallInt: Int16; inline;

    function GetSingle: Single; inline;
    function GetDouble: Double; inline;
    function GetExtended: Extended; inline;
    function GetCurrency: Currency; inline;
    function GetPointer: Pointer; inline;

    function IsEqual(value: IntPtr): Boolean; overload; inline;
    function IsEqual(value: Int64): Boolean; overload; inline;
    function IsEqual(value: Single): Boolean; overload; inline;
    function IsEqual(value: Double): Boolean; overload; inline;
    function IsEqual(value: Extended): Boolean; overload; inline;
    function IsEqual(value: Currency): Boolean; overload; inline;
    function IsEqual(value: Pointer): Boolean; overload; inline;

    function GetType: Byte; inline;

    function IsType(Typ: Byte): Boolean; inline;

    function IsNULL: Boolean; inline;
    function IsInteger: Boolean; inline;
    function IsInt64: Boolean; inline;
    function IsSingle: Boolean; inline;
    function IsDouble: Boolean; inline;
    function IsExtended: Boolean; inline;
    function IsCurrency: Boolean; inline;
    function IsPointer: Boolean; inline;

    function isset(): Boolean; inline;
    function empty(): Boolean; inline;

    case Byte of
      0:
        (TByte: Byte);
      1:
        (TWord: WORD);
      2:
        (TCardinal: Cardinal);
      3:
        (TUInt64: UInt64);
      4:
        (TShortInt: ShortInt);
      5:
        (TSmallInt: SmallInt);
      6:
        (TInteger: NativeInt);
      7:
        (TInt64: PInt64);
      8:
        (TSingle: Single);
      9:
        (TDouble: Double);
      10:
        (TExtended: PExtended);
      11:
        (TCurrency: Currency);
      12:
        (TPointer: Pointer);
      13:
        (TBoxArray: PBoxArray);
  end;

...
Рейтинг: 0 / 0
Передача массива параметром
    #39472166
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMДок, packed record, сделай так
зашел уточнить, а тут переписывать уже много чего надо. Так и на целый компонент можно написать
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472183
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокBred eFeM,

я не зря заострил внимание на слове феншуй
Я знаю, что это одно и то же. Как настоящие пац программисты пишут?

Ты зарплату за феншуй получаешь ?
Просто интересно...
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472191
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

В человеке коде все должно быть прекрасно... ©. Иначе мой перфекционизм не даст мне спать по ночам :)

зы. а зарплату я за другое получаю. Пока...
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472241
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокПонадобилось написать процедуру для добавления элемента в массива. Как по феншую...
Феншуйно & инлайново на 100%:
Код: pascal
1.
2.
SetLength(Arr, Length(Arr) + 1);
Arr[High(Arr)] := NewItem;


А когда нужно в цикле добавить 1000 элементов, то еще и быстро:
Код: pascal
1.
2.
3.
4.
i := Length(Arr);
SetLength(Arr, i + 1000);
for i := i to High(A) do 
  Arr[i] := GetNewItem()
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472269
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докschi,

...Иначе мой перфекционизм не даст мне спать по ночам :)



С этим спорить безусловно трудно :) А что, в самом Лазарусе нет примеров передачи массива ? Наверное там и есть феншуй, феншуйнее вроде некуда...
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472327
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если возникает вопрос регулярного добавления/удаление элементов из массива, то, обычно, логичнее использовать TList<T>
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472340
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Если возникает вопрос регулярного добавления/удаление элементов из массива, то, обычно, логичнее использовать TList<T>
+1
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472353
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДФеншуйно & инлайново на 100%
а если тебе надо вставить третий элемент? :)

schiА что, в самом Лазарусе нет примеров передачи массива ?
не нашел.

_Vasilisk_логичнее использовать TList<T>
это Лазарь, не дельфи

зы. короче, можно топ закрыть.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472370
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док_Vasilisk_логичнее использовать TList<T>
это Лазарь, не дельфи

В дельфи это есть.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472377
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докэто Лазарь, не дельфиТогда чуть более геморройно. TList + GetMem/FreeMem на добавление/удаление элементов. Я в D2006 так делал
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472379
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_+ GetMem/FreeMemА если элемент влазит в SizeOf(Pointer), то обычным кастом
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472382
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокчччДФеншуйно & инлайново на 100%
а если тебе надо вставить третий элемент? :)
...
Просто в этом случае старайся не использовать массивы.
Если "на выходе" все же требуется массив - сформируй его в момент, когда все данные уже стабильны.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472383
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_GetMem/FreeMem_Vasilisk_то обычным кастомне забывая про инициализацию/финализацию управляемых типов
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472385
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_TList + GetMem/FreeMem
Это еще более геморройнее, чем работа с указателями. Лучше не преумножать сущности без необходимости :)
НяшикВ дельфи это есть
у меня Лазарь.
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472388
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

У меня код
Код: pascal
1.
2.
3.
SetLength(A, 0);
for i := 0 to Count - 1 do
  SetLength(A, Length(A) + 1);

бросал Out of memory. При этом код
Код: pascal
1.
SetLength(A, Count);

работал на ура
...
Рейтинг: 0 / 0
Передача массива параметром
    #39472393
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док...
НяшикВ дельфи это есть
у меня Лазарь.

http://wiki.freepascal.org/Templates
...
Рейтинг: 0 / 0
25 сообщений из 44, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача массива параметром
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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