Verketten von Arrays

Für Dinge zum Forum, Kritik, Verbesserungsvorschläge, Umfragen und ähnliches.
Antworten
ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Verketten von Arrays

Beitrag von ErnstVolker »

Guten Morgen,

ich möchte gerne Arrays miteinander verketten

Code: Alles auswählen

A := Concat([1,2,3],[4,5,6]); //A will become [1,2,3,4,5,6]
( http://docwiki.embarcadero.com/Librarie ... tem.Concat ), aber es funktioniert nicht. Die Funktion "Concate" arbeitet in Lazarus bzw. FreePascal scheinbar nur mit Strings, obwohl es laut dem hier: http://lists.freepascal.org/pipermail/f ... 53891.html wohl doch funktioniert. Nur bei mir nicht.

Weiters suchen brachte mich auf "rosettacode". Da habe ich folgendes gefunden:

Code: Alles auswählen

type
  TReturnArray = array of integer; //you need to define a type to be able to return it
 
function ConcatArray(a1,a2:array of integer):TReturnArray;
var
  i,r:integer;
begin
  { Low(array) is not necessarily 0 }
  SetLength(result,High(a1)-Low(a1)+High(a2)-Low(a2)+2); //BAD idea to set a length you won't release, just to show the idea!
  r:=0; //index on the result may be different to indexes on the sources
  for i := Low(a1) to High(a1) do begin
    result[r] := a1[i];
    Inc(r);
  end;
  for i := Low(a2) to High(a2) do begin
    result[r] := a2[i];
    Inc(r);
  end;
end;


Das funktioniert für zwei arrays. Wie kann man es umbauen, dass es für eine beliebige Anzahl von "Eingabe-Arrays" (a1, a2,...an) funktioniert?

Was zu folgender Anschlussfrage führt:
Wie kann man generell Prozeduren und Funktionen bauen die mit einer beliebigen Anzahl von Eingabeparametern zurechtkommen? Bei Scilab nimmt man "varargin". Gibt es sowas für FreePascal auch?

Vielen Dank und viele Grüße

Volker

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Verketten von Arrays

Beitrag von sstvmaster »

Hi Volker, das mit Concat wird wohl erst mit FPC 3.2 gehen oder Trunk.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Verketten von Arrays

Beitrag von ErnstVolker »

Hallo Zusammen,

ich habe es glaube ich geschafft mir selber was zu Basteln. Grundlage ist der Code von "ConcatArray".

Code: Alles auswählen

type TVektor = array of Double;


Code: Alles auswählen

function TVekt.Verkette(Eingaben: array of TVektor): TVektor; 
var i, j, k, Laenge: Integer;
begin
   Laenge := 0;
   for i:=Low(Eingaben) to High(Eingaben) do Laenge := Laenge + High(Eingaben[i]) - Low(Eingaben[i]) + 1;
   SetLength(Verkette, Laenge);
   k := 0;
   for j:=Low(Eingaben) to High(Eingaben) do begin
     for i:=Low(Eingaben[j]) to High(Eingaben[j]) do begin
       Verkette[k] := Eingaben[j][i];
       inc(k);
     end;
   end;
end;


Der zugehörige Programmcode zum Testen:

Code: Alles auswählen

begin
   vekt := TVekt.Create;
   v := vekt.arange(0.0, 1.0, 5.0);
   w := vekt.arange(6.0, 1.0, 10.0);
   z := vekt.arange(0.0, 0.1, 2);
   writeln('Hallo Volker, hier der Testvektor:=');
   writeln('========================');
 
   u := vekt.Verkette([v,w,z]);
 
   for i:=0 to High(u) do writeln(u[i]:3:5);
   vekt.Destroy;      
end.


Die Ausgabe:
0.00000
1.00000
2.00000
3.00000
4.00000
5.00000
6.00000
7.00000
8.00000
9.00000
10.00000
0.00000
0.10000
0.20000
0.30000
0.40000
0.50000
0.60000
0.70000
0.80000
0.90000
1.00000
1.10000
1.20000
1.30000
1.40000
1.50000
1.60000
1.70000
1.80000
1.90000
2.00000

Vielleicht kann jemand damit was anfangen. Mal sehen ob's mich weiter bringt. Bin für Verbesserungen dankbar.

Viele Grüße

Volker

Antworten