Verketten von Arrays

Für Dinge zum Forum, Kritik, Verbesserungsvorschläge, Umfragen und ähnliches.

Verketten von Arrays

Beitragvon ErnstVolker » 26. Jan 2019, 12:04 Verketten von Arrays

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
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 11:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon sstvmaster » 26. Jan 2019, 13:56 Re: Verketten von Arrays

Hi Volker, das mit Concat wird wohl erst mit FPC 3.2 gehen oder Trunk.
LG Maik
sstvmaster
 
Beiträge: 212
Registriert: 22. Okt 2016, 23:12
Wohnort: Dresden
OS, Lazarus, FPC: Windows 7 32bit (L 2.0.4 FPC 3.0.4) | 
CPU-Target: 32Bit
Nach oben

Beitragvon ErnstVolker » 26. Jan 2019, 14:18 Re: Verketten von Arrays

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
ErnstVolker
 
Beiträge: 212
Registriert: 17. Feb 2009, 11:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

• Themenende •

Zurück zu Allgemeines



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried