Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавить элемент к динамическому массиву / 25 сообщений из 35, страница 1 из 2
26.05.2017, 11:24:01
    #39460269
sql.ru/forum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
Вот тебе задачка. Реализовать функцию, которая заменяла бы такой код:

Код: pascal
1.
2.
setlength(arr, length(arr) + 1);
arr[high(arr)] := item;



Сложная, не правда ли? Массив должен быть динамическим, а не открытым. Содержит элементы любого типа - от integer до record или ссылки на объект.
...
Рейтинг: 0 / 0
26.05.2017, 11:43:28
    #39460289
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
sql.ru/forumВот тебе задачка. Реализовать функцию, которая заменяла бы такой код:

Код: pascal
1.
2.
setlength(arr, length(arr) + 1);
arr[high(arr)] := item;



Сложная, не правда ли? Массив должен быть динамическим, а не открытым. Содержит элементы любого типа - от integer до record или ссылки на объект.

Размер вознаграждения ?
...
Рейтинг: 0 / 0
26.05.2017, 12:15:14
    #39460316
sql.ru/forum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
schi, возможность загружать анимированный аватар в профиль.
...
Рейтинг: 0 / 0
26.05.2017, 13:36:25
    #39460408
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
Код: 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.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
unit ArrayEx;

interface

uses
  Generics.Defaults, Generics.Collections, System.SyncObjs, System.SysUtils;

type
  // Типы компаратора
  TCompareResult = (crLess,crEqual,crMore);
  TCompareMode = (cmAscending, cmDescending);
  // Типы функций пользовательского компаратора
  TCompareValue<T> = reference to function(const Item1,Item2: T): TCompareResult;

  // -------------------------------------------------------------------------
  // ------------------- TArrayEx (Расширенный массив) -----------------------
  // -------------------------------------------------------------------------

  {$REGION 'TArrayEx'}

  TArrayEx<T> = record
  public
    // Доступ к элементам напрямую (unsafe)
    Items      : array of T;
    // Пользовательский Тэг
    Tag        : integer;
    // Признак необходимости освобождать элементы при удалении
    DoFreeData : Boolean;
    FEnumInit  : string;
  private
    var
      FIndexMod     : integer;                      // Размер индекса
      FIndexArray   : array of array of integer;    // Элементы индекса
      FComparer     : IEqualityComparer<T>;         // Компаратор

    function GetItems(Index: integer): T; inline;
    procedure SetItems(Index: integer; const Value: T); inline;
    procedure QuickSortA(const Comparer: IComparer<T>; L, R: Integer);
    procedure QuickSortB(L, R: Integer; CompareEvt: TCompareValue<T>; Less, More: TCompareResult);
    function GetIndexMod: integer; inline;
    procedure SetIndexMod(Value: integer); inline;
    procedure HashClear(NewIndexMod: integer); inline;
    procedure HashAdd(const Value: T; Index: integer); inline;
    function GetHash(const Value: T): integer; inline;
    procedure SetIndex(Index: Integer; const Value: T); inline;
    procedure SetCount(const Value: integer); inline;
    function GetCount: integer; inline;
    function GetHigh: integer; inline;
    procedure SetHigh(const Value: integer); inline;
    function GetLow: integer; inline;
    procedure FreeElement(Num: integer); inline;
  public
    // Конструкторы
    constructor Create(DoFreeData: boolean);

    // Доступ к элементам по умолчанию
    property Elements[Index: integer]: T read GetItems write SetItems; default;

    // Очистка массива
    procedure Clear; overload;

    // Добавление элемента(ов) в конец
    function Add(Value: T): integer; overload; inline;
    function Add(Values: array of T): integer; overload;
    function AddUnique(Value: T): integer;

    // Вставка элемента по индексу
    procedure Insert(Index: integer; Value: T); overload; inline;
    procedure Insert(Index: integer; Values: array of T); overload;

    // Удаление элемента по индексу
    procedure Delete(Index: integer); inline;
    procedure DeleteRange(Index, Count: integer); inline;

    // Создание индекса по массиву
    procedure CreateIndex(IndexMod: integer = -1);
    // Уничтожение индекса по массиву
    procedure DropIndex;

    // Кол-во элементов массива
    property Count: integer read GetCount write SetCount;
    // Индекс нижнего элемента массива
    property Low: integer read GetLow;
    // Индекс верхнего элемента массива
    property High: integer read GetHigh write SetHigh;

    // Поиск значения(ий) в массиве
    function Exists(Value: T): boolean; overload;
    function Exists(Values: array of T; NeedAllValues: boolean = False): boolean; overload;
    // Индекс(ы) значения в массиве
    function IndexOf(Value: T): integer;
    function IndexesOf(Value: T): TArrayEx<integer>;

    // Сортировка
    procedure Sort(Comparer: IComparer<T> = nil); overload;
    procedure Sort(CompareEvt: TCompareValue<T>; Mode: TCompareMode = cmAscending); overload;

    // Сериализатор в строку
    function ToString: string; overload;
    function ToString(Delimeter : string): string; overload;

    class operator Add(const A,B: TArrayEx<T>): TArrayEx<T>; overload;
    class operator Add(const A: TArrayEx<T>; const B: array of T): TArrayEx<T>; overload;
    class operator Add(const A: array of T; const B: TArrayEx<T>): TArrayEx<T>; overload;
    class operator Implicit(const A: TArrayEx<T>): TArray<T>;
    class operator Equal(const A,B: TArrayEx<T>): Boolean;
    class operator NotEqual(const A,B: TArrayEx<T>): Boolean;
  end;
  {$ENDREGION}


implementation

uses TypInfo, Math, RTTI;

{ TArrayEx }

procedure TArrayEx<T>.SetCount(const Value: integer);
begin
  System.SetLength(Items,Value);
  if GetIndexMod>0 then begin
    CreateIndex(Value);
  end;
end;

procedure TArrayEx<T>.SetHigh(const Value: integer);
begin
  System.SetLength(Items,Value-1);
  if GetIndexMod>0 then begin
    CreateIndex(Value-1);
  end;
end;

procedure TArrayEx<T>.SetIndex(Index: Integer; const Value: T);
begin
  if GetIndexMod<=0 then Exit;

  if Index>=GetIndexMod then begin
    CreateIndex(Index*2);
  end else begin
    HashAdd(Value,Index);
  end;
end;

function TArrayEx<T>.GetIndexMod: integer;
begin
  if Length(FIndexArray)=0 then begin
    FIndexMod:=0;
    FComparer:=TEqualityComparer<T>.Default;
  end;
  Result:=FIndexMod;
end;

procedure TArrayEx<T>.SetIndexMod(Value: integer);
begin
  FIndexMod:=Value;
  SetLength(FIndexArray,FIndexMod);
end;

function TArrayEx<T>.Add(Value: T): integer;
begin
  Result:=Length(Items);
  System.SetLength(Items,Result+1);
  Items[Result]:=Value;

  SetIndex(Result,Value);
end;

function TArrayEx<T>.Add(Values: array of T): integer;
var
  i: Integer;
begin
  Result:=Length(Items);
  System.SetLength(Items,Result+Length(Values));
  for i:=0 to System.High(Values) do begin
    Items[Result]:=Values[i];
    SetIndex(Result,Values[i]);
  end;
end;

procedure TArrayEx<T>.Delete(Index: integer);
var
  i: Integer;
begin
  if (Index<0) or (Index>High) then Exit;

  if DoFreeData and (PTypeInfo(TypeInfo(TValue)).Kind=tkClass) then begin
    FreeElement(Index);
  end;

  for i:=Index+1 to High do begin
    Items[i-1]:=Items[i];
  end;
  System.SetLength(Items,Length(Items)-1);

  CreateIndex(GetIndexMod);
end;

procedure TArrayEx<T>.DeleteRange(Index, Count: integer);
var
  i: Integer;
begin
  if (Count<1) or (Index<0) or (Index+Count>High) then Exit;

  if DoFreeData and (PTypeInfo(TypeInfo(TValue)).Kind=tkClass) then begin
    for i:=Index to Index+Count-1 do begin
      FreeElement(i);
    end;
  end;

  for i:=Index+Count to High do begin
    Items[i-Count]:=Items[i];
  end;
  System.SetLength(Items,Length(Items)-Count);

  CreateIndex(GetIndexMod);
end;

procedure TArrayEx<T>.DropIndex;
begin
  HashClear(0);
end;

function TArrayEx<T>.IndexesOf(Value: T): TArrayEx<integer>;
var
  i,j,m    : integer;
begin
  m:=GetIndexMod;

  if m=0 then begin
    CreateIndex;
    m:=GetIndexMod;
  end;

  m:=Abs(GetHash(Value) mod m);

  Result.Clear;
  for i:=0 to System.High(FIndexArray[m]) do begin
    if FComparer.Equals(Items[FIndexArray[m,i]],Value) then begin
      Result.Add(FIndexArray[m,i]);
    end;
  end;
  Result.Sort;
end;

function TArrayEx<T>.IndexOf(Value: T): integer;
var
  i,j,m    : integer;
begin
  m:=GetIndexMod;

  if m=0 then begin
    CreateIndex;
    m:=GetIndexMod;
  end;

  m:=Abs(GetHash(Value) mod m);
  for i:=0 to System.High(FIndexArray[m]) do
    if FComparer.Equals(Items[FIndexArray[m,i]],Value) then begin
      Exit(FIndexArray[m,i]);
    end;
  Result:=-1;
end;


procedure TArrayEx<T>.Insert(Index: integer; Values: array of T);
var
  i: Integer;
begin
  if (Index<0) or (Index>Count) then Exit;

  System.SetLength(Items,Length(Items)+length(Values));
  for i:=High downto Index+length(Values) do begin
    Items[i]:=Items[i-length(Values)];
  end;

  for i:=Index to System.High(Values) do begin
    Items[Index+i]:=Values[i];
  end;

  CreateIndex(GetIndexMod);
end;

function TArrayEx<T>.GetItems(Index: integer): T;
begin
  Result:=Items[Index];
end;

function TArrayEx<T>.GetLow: integer;
begin
  Result:=0;
end;

procedure TArrayEx<T>.HashClear(NewIndexMod: integer);
begin
  System.SetLength(FIndexArray,0);
  SetIndexMod(NewIndexMod);
end;

function TArrayEx<T>.GetCount: integer;
begin
  Result:=Length(Items);
end;

function TArrayEx<T>.GetHash(const Value: T): integer;
begin
  Result:=TEqualityComparer<T>.Default.GetHashCode(Value);
end;

function TArrayEx<T>.GetHigh: integer;
begin
  Result:=System.High(Items);
end;

procedure TArrayEx<T>.HashAdd(const Value: T; Index: integer);
var
  n,m     : integer;
begin
  try
    m:=Abs(GetHash(Value) mod GetIndexMod);
    n:=length(FIndexArray[m]);
  except
  end;

  System.SetLength(FIndexArray[m],n+1);
  FIndexArray[m,n]:=Index;
end;

procedure TArrayEx<T>.FreeElement(Num: integer);
begin
  try
    PObject(@Items[num])^.Free;
    Items[num]:=Default(T);
  except
  end;
end;

procedure TArrayEx<T>.Clear;
var
  i: Integer;
begin
  if DoFreeData and (PTypeInfo(TypeInfo(TValue)).Kind=tkClass) then begin
    for i:=0 to High do begin
      FreeElement(i);
    end;
  end;
  System.SetLength(Items,0);
  HashClear(GetIndexMod);
end;

constructor TArrayEx<T>.Create(DoFreeData: boolean);
begin
  Clear;
  DoFreeData:=DoFreeData;
end;

procedure TArrayEx<T>.CreateIndex(IndexMod: integer = -1);
var
  i : integer;
const
  DefaultIndexSize = 64;
begin
  if IndexMod=-1 then begin
    IndexMod:=DefaultIndexSize;
    if Count=0 then begin
      IndexMod:=DefaultIndexSize;
    end else begin
      IndexMod:=Count;
    end;
  end;
  HashClear(IndexMod);

  if IndexMod>0 then begin
    for i:=Low to High do begin
      HashAdd(Items[i],i);
    end;
  end;
end;

procedure TArrayEx<T>.Insert(Index: integer; Value: T);
var
  i: Integer;
begin
  if (Index<0) or (Index>Count) then Exit;

  System.SetLength(Items,Length(Items)+1);
  for i:=High downto Index+1 do begin
    Items[i]:=Items[i-1];
  end;
  Items[Index]:=Value;

  CreateIndex(GetIndexMod);
end;

procedure TArrayEx<T>.SetItems(Index: integer; const Value: T);
begin
  if (Index<0) or (Index>High) then Exit;
  Items[Index]:=Value;
end;

procedure TArrayEx<T>.QuickSortA(const Comparer: IComparer<T>; L, R: Integer);
var
  I, J: Integer;
  pivot, temp: T;
begin
  if (Length(Items) = 0) or ((R - L) <= 0) then
    Exit;
  repeat
    I := L;
    J := R;
    pivot := Items[L + (R - L) shr 1];
    repeat
      while Comparer.Compare(Items[I], pivot) < 0 do
        Inc(I);
      while Comparer.Compare(Items[J], pivot) > 0 do
        Dec(J);
      if I <= J then
      begin
        if I <> J then
        begin
          temp := Items[I];
          Items[I] := Items[J];
          Items[J] := temp;
        end;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSortA(Comparer, L, J);
    L := I;
  until I >= R;
end;

procedure TArrayEx<T>.Sort(Comparer: IComparer<T> = nil);
var
  OIndexMod: integer;
begin
  OIndexMod:=GetIndexMod;
  if OIndexMod>0 then DropIndex;

  if Comparer=nil then Comparer:=TComparer<T>.Default;
  QuickSortA(Comparer, 0, High);

  if OIndexMod>0 then CreateIndex(OIndexMod);
end;

procedure TArrayEx<T>.QuickSortB(L, R: Integer; CompareEvt: TCompareValue<T>; Less, More: TCompareResult);
var
  I, J: Integer;
  pivot, temp: T;
begin
  if (Length(Items) = 0) or ((R - L) <= 0) then
    Exit;
  repeat
    I := L;
    J := R;
    pivot := Items[L + (R - L) shr 1];
    repeat
      while CompareEvt(Items[I], pivot) = crLess do
        Inc(I);
      while CompareEvt(Items[J], pivot) = crMore do
        Dec(J);
      if I <= J then
      begin
        if I <> J then
        begin
          temp := Items[I];
          Items[I] := Items[J];
          Items[J] := temp;
        end;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSortB(L, J, CompareEvt, Less, More);
    L := I;
  until I >= R;
end;

procedure TArrayEx<T>.Sort(CompareEvt: TCompareValue<T>; Mode: TCompareMode = cmAscending);
var
  OIndexMod: integer;
  Less,More: TCompareResult;
begin
  OIndexMod:=GetIndexMod;
  if OIndexMod>0 then DropIndex;

  if not Assigned(CompareEvt) then Exit;

  case Mode of
    cmAscending: begin
      Less:=crLess;
      More:=crMore;
    end;
    cmDescending: begin
      Less:=crMore;
      More:=crLess;
    end;
  end;

  QuickSortB(Low,High,CompareEvt,Less,More);

  if OIndexMod>0 then CreateIndex(OIndexMod);
end;

function TArrayEx<T>.ToString(Delimeter: string): string;
var
  i : Integer;
  n : integer;
  s : string;
begin
  Result:='';
  for i:=Low to High do begin
    if (Result<>'') then begin
      s:=Delimeter+TValue.From<T>(Items[i]).ToString;
    end else begin
      s:=TValue.From<T>(Items[i]).ToString;
    end;

    n:=Length(Result);
    SetLength(Result,n+length(s));
    Move(s[1],Result[n+1],Length(s)*SizeOf(Char));
  end;
end;

function TArrayEx<T>.ToString: string;
begin
  Result:=ToString(';');
end;

function TArrayEx<T>.Exists(Value: T): boolean;
begin
  Result:=IndexOf(Value)>=0;
end;

function TArrayEx<T>.Exists(Values: array of T; NeedAllValues: boolean = False): boolean;
var
  i: Integer;
begin
  Result:=NeedAllValues;

  for i:=0 to System.High(Values) do begin
    if NeedAllValues then begin
      if IndexOf(Values[i])<0 then Exit(False);
    end else begin
      if IndexOf(Values[i])>=0 then Exit(True);
    end;
  end;
end;

class operator TArrayEx<T>.Add(const A, B: TArrayEx<T>): TArrayEx<T>;
begin
  Result.Clear;

  SetLength(Result.Items,A.Count+B.Count);
  Move(A.Items[0],Result.Items[0],A.Count*SizeOf(T));
  Move(B.Items[0],Result.Items[A.Count],B.Count*SizeOf(T));
  if length(A.FIndexArray)>0 then begin
    Result.CreateIndex;
  end;
end;


class operator TArrayEx<T>.Add(const A: TArrayEx<T>; const B: array of T): TArrayEx<T>;
begin
  Result.Clear;

  SetLength(Result.Items,A.Count+length(B));
  Move(A.Items[0],Result.Items[0],A.Count*SizeOf(T));
  Move(B[0],Result.Items[A.Count],length(B)*SizeOf(T));
  if length(A.FIndexArray)>0 then begin
    Result.CreateIndex;
  end;
end;

class operator TArrayEx<T>.Add(const A: array of T; const B: TArrayEx<T>): TArrayEx<T>;
begin
  Result.Clear;

  SetLength(Result.Items,length(A)+B.Count);
  Move(A[0],Result.Items[0],length(A)*SizeOf(T));
  Move(B.Items[0],Result.Items[length(A)],B.Count*SizeOf(T));
  if length(B.FIndexArray)>0 then begin
    Result.CreateIndex;
  end;
end;

function TArrayEx<T>.AddUnique(Value: T): integer;
begin
  Result:=IndexOf(Value);
  if Result<0 then begin
    Result:=Add(Value);
  end;
end;

class operator TArrayEx<T>.Implicit(const A: TArrayEx<T>): TArray<T>;
begin
  SetLength(Result,A.Count);
  Move(A.Items[0],Result[0],A.Count*SizeOf(T));
end;

class operator TArrayEx<T>.Equal(const A, B: TArrayEx<T>): Boolean;
var
  i        : integer;
  Comparer : IEqualityComparer<T>;
begin
  if length(A.Items)<>length(B.Items) then Exit(False);
  Comparer:=TEqualityComparer<T>.Default;

  for i:=0 to System.High(A.Items) do begin
    if Comparer.Equals(A.Items[i],B.Items[i]) then Exit(False);
  end;
  Result:=True;
end;

class operator TArrayEx<T>.NotEqual(const A, B: TArrayEx<T>): Boolean;
begin
  Result:=not (A=B);
end;

end.

...
Рейтинг: 0 / 0
26.05.2017, 13:50:23
    #39460420
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
Код: pascal
1.
2.
3.
4.
var
  Arr: TArrayEx<integer>;
begin
  Arr.Add(Item);
...
Рейтинг: 0 / 0
26.05.2017, 13:52:36
    #39460424
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
rgreat
Код: pascal
1.
2.
3.
4.
var
  Arr: TArrayEx<integer>;
begin
  Arr.Add(Item);

а ларчик просто открывался!
...
Рейтинг: 0 / 0
27.05.2017, 21:40:00
    #39460939
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
И где награда?
...
Рейтинг: 0 / 0
27.05.2017, 22:25:36
    #39460950
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
Чем стандартный TList<Integer> не устроил?
...
Рейтинг: 0 / 0
27.05.2017, 22:26:30
    #39460951
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
JaDi,

Дык это же не массив.
...
Рейтинг: 0 / 0
28.05.2017, 10:08:15
    #39461006
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
rgreatJaDi,

Дык это же не массив.
ведёт себя как массив, выглядит как массив -> наверное и есть массив
...
Рейтинг: 0 / 0
28.05.2017, 14:07:29
    #39461037
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
Что вы гоните

В новых версиях можно плюсовать массивы
А в старых (под дженерики) делается так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
type
  TArrayHeler = class helper for TArray
    class procedure Add<T>(var Items: TArray<T>; const Value: T); static;
  end;

class procedure TArrayHelper.Add<T>(var Items: TArray<T>; const Value: T);
var 
  Count: Integer;
begin
  Count := Length(Items);
  SetLength(Items, Count + 1);
  Items[Count] := Value;
end;



Для очень старых Delphi без дженериков есть целый модуль, принимающий в качестве параметра TypeInfo. Там и добавление, и вставка, и удаление. Но за дополнительную плату :)
...
Рейтинг: 0 / 0
28.05.2017, 16:08:27
    #39461060
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
kealon(Ruslan),

Что, и со
...
Рейтинг: 0 / 0
28.05.2017, 16:11:36
    #39461061
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
kealon(Ruslan)rgreatJaDi,

Дык это же не массив.
ведёт себя как массив, выглядит как массив -> наверное и есть массивЧто, прямо таки без Create и Free работает? ;)
...
Рейтинг: 0 / 0
28.05.2017, 16:24:07
    #39461064
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
rgreat,

Это мелочи по сравнению с тем, что придется в проект тащить левый код на сотню строк кода.
...
Рейтинг: 0 / 0
28.05.2017, 16:35:55
    #39461069
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
SOFT FOR YOUЧто вы гоните

В новых версиях можно плюсовать массивы
А в старых (под дженерики) делается так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
type
  TArrayHeler = class helper for TArray
    class procedure Add<T>(var Items: TArray<T>; const Value: T); static;
  end;

class procedure TArrayHelper.Add<T>(var Items: TArray<T>; const Value: T);
var 
  Count: Integer;
begin
  Count := Length(Items);
  SetLength(Items, Count + 1);
  Items[Count] := Value;
end;



Seattle.
Код: pascal
1.
2.
3.
4.
var
  x : TArray<integer>;
begin
  x.add(1);

- не работает.
[dcc32 Error] Unit12.pas(34): E2018 Record, object or class type required

Что я не так делаю?
...
Рейтинг: 0 / 0
28.05.2017, 16:37:04
    #39461070
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
JaDirgreat,

Это мелочи по сравнению с тем, что придется в проект тащить левый код на сотню строк кода.
А-ха-ха!
...
Рейтинг: 0 / 0
28.05.2017, 17:08:22
    #39461075
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
rgreat,

TArray.Add<Integer>(x, 1)

uses Generics.Collections
...
Рейтинг: 0 / 0
28.05.2017, 17:15:32
    #39461077
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
SOFT FOR YOUrgreat,

TArray.Add<Integer>(x, 1)

uses Generics.CollectionsА, вот что имелось в виду.
Ну, прямо скажем, это совсем не так удобно и наглядно как прямой x.add(1).
...
Рейтинг: 0 / 0
28.05.2017, 17:25:37
    #39461079
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
Код: pascal
1.
  TBoxValue = array of TValue;



http://docwiki.embarcadero.com/Libraries/XE2/en/System.Rtti.TValue
...
Рейтинг: 0 / 0
28.05.2017, 17:58:42
    #39461083
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
Няшик,

Уж лучше тогда variant.
...
Рейтинг: 0 / 0
28.05.2017, 18:28:51
    #39461086
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
rgreat,

Ну тогда подойдёт стандартный TList<T>
...
Рейтинг: 0 / 0
28.05.2017, 18:34:34
    #39461089
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
Когда пойдет, а когда и нет.

Я у себя в ПО вместо обычных массивов теперь TArrayEx пользую. Очень удобно, при сохранении плюсов обычного array.
...
Рейтинг: 0 / 0
28.05.2017, 18:52:05
    #39461094
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
rgreat,

И это ты говоришь автору Rapid.Generics :)
...
Рейтинг: 0 / 0
28.05.2017, 18:59:51
    #39461096
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
SOFT FOR YOU,

А у тебя там есть есть "неклассовые" контейнеры? :)
...
Рейтинг: 0 / 0
28.05.2017, 20:38:54
    #39461114
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элемент к динамическому массиву
SOFT FOR YOUЧто вы гоните

В новых версиях можно плюсовать массивы

походу я что-то пропустил.
Плюсовать массивы - это как?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавить элемент к динамическому массиву / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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