Есть ли в Free Pascal способ объединения массивов?

#arrays #concatenation #freepascal

#массивы #конкатенация #freepascal

Вопрос:

Очевидно, что в Pascal есть конкатенация строк, но есть ли у него общая конкатенация для любого типа массива?

Комментарии:

1. Нет. Обратите внимание, что большинство ваших последних вопросов можно найти в руководстве.

2. Я бы не знал, где искать в руководстве ответы на подобные вопросы. Если бы существовала общая конкатенация, было бы легко найти в Google «free pascal concatenate».

3. Попробуйте ознакомиться с главой «Массивы» в справочнике по языку.

4. В каком руководстве их несколько. Ах, справочное руководство по языку . Раздел: Массивы . В документе не указан метод конкатенации, только метод копирования, который теоретически можно было бы использовать для написания пользовательской функции конкатенации, если бы в fpc stable были общие версии Delphi.

5. К вашему сведению: начиная с версии FPC 3.2.0 , доступен встроенный оператор объединения динамических массивов.

Ответ №1:

Это не так, но вы можете создать свою собственную функцию, я закодировал это за 5 минут…я уверен, что есть лучший метод, но сейчас я понятия не имею.

 type
 TBArray = array of byte;  

function ConcArray(arr1,arr2:TBArray):TBArray;
begin
    SetLength(Result,Length(arr1)   Length(arr2));
    ZeroMemory(@Result[0],Length(arr1)   Length(arr2));
    CopyMemory(@Result[0],@arr1[0],Length(arr1));
    CopyMemory(@Result[Length(arr1)],@arr2[0],Length(arr2));
end; 
  

Комментарии:

1. Это работает для байтов, но как вы пишете ConcArray для произвольных типов (целых чисел, коротких чисел, массивов массивов байтов и т. Д.)?

2. Общего метода для этого не существует.

Ответ №2:

Как насчет этого? Если вам нужно объединить во многих местах, оператор выглядит довольно красиво, ИМХО.

   program ConCatTest;

  type
  SomeRec = record
      s: AnsiString;
      i: Longint;
  end;
  SomeArr = array of SomeRec;

    operator   (a, b: SomeArr) c: SomeArr;
    var
  i: Longint;
    begin
  SetLength(c, Length(a)   Length(b));
  for i := 0 to High(a) do
      c[i] := a[i];
  for i := 0 to High(b) do
      c[i   Length(a)] := b[i];
    end;

    var
  a1, a2, a3: SomeArr;
  i: Longint;
    begin
  SetLength(a1, 3);
  SetLength(a2, 2);
  a1[0].s := 'a';
  a1[0].i := 0;
  a1[1].s := 'a';
  a1[1].i := 1;
  a1[2].s := 'a';
  a1[2].i := 2;
  a2[0].s := 'b';
  a2[0].i := 0;
  a2[1].s := 'b';
  a2[1].i := 1;

  a3 := a1   a2;

  for i := 0 to High(a3) do
      WriteLn(a3[i].s, a3[i].i);
  ReadLn;
  end.
  

Комментарии:

1. Работает ли это для массивов любого типа или только SomeRec специально? Я ищу общий способ объединения двух массивов одного и того же типа.

2. Он специфичен для SomeRec, но все, что вам нужно сделать, чтобы использовать его для любого другого типа записи / массива, — это сделать копию и изменить первую строку объявления оператора, вставив другой тип. Я бы предпочел, если бы я мог сделать это для всех видов массивов сразу, но это настолько близко, насколько я могу получить.

3. Спасибо, но меня не интересует функция для объединения типов A вместе. Меня интересует общий метод для объединения любых двух массивов одного и того же типа элементов вместе, без необходимости изменения кода.

4. Я это понимаю, и мне бы тоже этого хотелось. Мое решение настолько близко, насколько вы можете получить AFAIK, простое определение оператора, которое вы можете адаптировать к другому за секунду, вставив тип дважды. Разве это не лучшее решение, чем приведенная выше функция объединения?