Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi array addieren (https://www.delphipraxis.net/31341-array-addieren.html)

trifid 7. Okt 2004 17:02


array addieren
 
Wie kann man 2 array einfach addieren?
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
   var a : array[1..3] of integer;
   var b : array[1..2] of integer;
   var c : array[1..5] of integer;
begin
   a[1] := 1;
   a[2] := 2;
   a[3] := 3;

   b[1] := 5;
   b[2] := 9;

   c := a + b; //  in c sollte dann [1,2,3,5,9] stehen
end;
a) ich möchte keine Schleifen verwenden
Delphi-Quellcode:
for n := 0 to High (a) do
   c[n] := a[n];
for n := High (a) to High (a) + High (c) do
   c[n] := b[n];
b) Array a und Array b können auch ein dyn.Array sein
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
   var a : array of integer;
   var b : array of integer;
   var c : array of integer;
begin
   SetLength (a, 3);
   a[0] := 1;
   a[1] := 2;
   a[2] := 3;

   SetLength (b, 2);
   b[0] := 5;
   b[1] := 9;

   SetLength (c, High (a) + High (b));
   c := a + b; //  in c sollte dann [1,2,3,5,9] stehen
end;
irgendeiner eine Idee ?

pajofego 7. Okt 2004 18:33

Re: array addieren
 
Tja das geht nur, wenn man Operatoren überladen kann! Das ging zumindesten vor D7 nicht, aber wie das jetzt mit dem .Net Kram aussieht weiss ich nicht so genau!

Üblich ist ja immer eine "Add" Funktion in einer Vektor Klasse zu implementieren, aber ganz ohne Schleife kommst du nicht aus, es sei denn du benutzt 128 Bit Vektoren aus dem SSE Befehlssatz. Die haben aber max. 4 Komponenten!

Oxmyx 7. Okt 2004 19:01

Re: array addieren
 
Mit "Move" kannst du die Daten des einen Arrays ohne Schleifen in ein zweites Array kopieren. In der Form c := a + b geht es aber nicht, wie schon gesagt (bzw. nur in Delphi8).

pajofego 7. Okt 2004 19:44

Re: array addieren
 
Könnte man nicht eine Klasse mit freepascal (Operatorüberladung möglich) erstellen, die das kann und dann in Delphi einbinden? Würde mir persönlich auch interessieren wie das geht.

Oxmyx 7. Okt 2004 19:47

Re: array addieren
 
Wie soll das gehen? Ist doch wurscht, ob du die Klasse mit Delphi, der Freepascal-IDE oder mit Notepad schreibst. Entscheidend ist, ob der Compiler das auch versteht, was du geschrieben hast. Und der Delphi-Compiler kennt keine überladenen Operatoren.

pajofego 7. Okt 2004 20:07

Re: array addieren
 
Ich ging ja davon aus, dass ich die Klasse mit freepascal compiliere und sozusagen das "dcu"-File, falls so etwas in der Art existier, in mein Delphi Projekt einbinde. Ob das in dieser Form oder anders geht ist meine Frage. Notfalls kann man sicherlich eine DLL erstellen. Dass müsste ja dann schon gehen.

dizzy 7. Okt 2004 20:15

Re: array addieren
 
Wenn es in Summe nacher nicht mehr als 256 Element sind, dann arbeite doch mit Sets! Dann gehts auch mit dem +-Operator!
Delphi-Quellcode:
type
  TSet = set of 0..255;
.
.
var
  s1, s2, s3: TSet;
.
.
  s1 := [1, 3, 5];
  s2 := [1, 2, 4];
  s3 := s1 + s2;

Oxmyx 7. Okt 2004 20:22

Re: array addieren
 
Zitat:

Zitat von pajofego
Ich ging ja davon aus, dass ich die Klasse mit freepascal compiliere und sozusagen das "dcu"-File, falls so etwas in der Art existier, in mein Delphi Projekt einbinde. Ob das in dieser Form oder anders geht ist meine Frage. Notfalls kann man sicherlich eine DLL erstellen. Dass müsste ja dann schon gehen.

Nicht in Delphi, denn Delphi kann keine Klassen in DLLs exportieren bzw. importieren. (Ok, kann man schon, aber nur mit viel Tricksereien).
Die arithmetischen Operatoren bleiben mit dem Delphi32-Compiler den Standard-Datentypen vorbehalten. ;-)

nailor 7. Okt 2004 20:38

Re: array addieren
 
a) schleifen nehmen
b) delphi .net nehmen
c) ander sprache nehmen

d) sets können das mit gewissen (heftigen) einschränkungen, und sind auch noch dezent langsam

trifid 7. Okt 2004 21:02

Re: array addieren
 
Weitere Einschränkungen
Ich möchte keine TArrayKlasse bauen, weil dann kann ich gleich eine ObjectListe (Dictionary) verwenden.
Es soll nicht unter .net sein
nicht unter "freepascal"
Keine Mengen (TSet) hab auch schon daran gedacht meine Code umzustricken.
Aber es sind etliche mehrdimensionale Array's, der einfachheithalber habe ich es erst mal mit einen einfachen integer-array probiert
Operatoren überladen ala c++ geht halt nicht
soll als win32-Applikation laufen
>c) ander sprache nehmen
welche? kann nur Delphi - nein, aber der Aufwand ist zu groß
dynamische Arrays an irgendwelchen DLL's übergeben?
>d) sets können das mit gewissen (heftigen) einschränkungen, und sind auch noch dezent langsam
das auch noch

aber ich hab ein wenig rumgebastelt und auch etwas gefunden, it's magic
nur bekomme ich eine Speicherschutzverletzung und die Variablen werden überschrieben :oops:
Delphi-Quellcode:
type
   TTestArray = array of integer;

procedure TForm1.Button3Click(Sender: TObject);
   var a, b, c : TTestArray;

   var x, y, z : String;

   function MyCopyArray (Dest, Source, typeInfo : Pointer; Count:Integer): Pointer; assembler;
   asm
       PUSH Count

       CALL System.@CopyArray
   end;
begin
   SetLength (a, 3);
   a[0] := 1;
   a[1] := 2;
   a[2] := 3;

   SetLength (b, 3);
   b[0] := 5;
   b[1] := 9;

   SetLength (c, 3);

   x := 'abc';
   y := '123';
   z := '';
   
   MyCopyArray (@z, @x, TypeInfo(String), 5);

   MyCopyArray (Addr (c), Addr (b), TypeInfo(TTestArray), 2);
   // MyCopyArray (@c, @b, TypeInfo(TTestArray), 2);
   // MyCopyArray (@c[0], @b[0], TypeInfo(TTestArray), 2);
end;
Für die strings funktioniert es, aber nicht für die Array's


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz