#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, простое определение оператора, которое вы можете адаптировать к другому за секунду, вставив тип дважды. Разве это не лучшее решение, чем приведенная выше функция объединения?