Delphi-PRAXiS

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 18: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 19: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 20: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 20: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 20: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 21: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 21: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 21: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 21: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 22: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

Jelly 7. Okt 2004 22:26

Re: array addieren
 
Zitat:

Zitat von pajofego
Tja das geht nur, wenn man Operatoren überladen kann! Das ging zumindesten vor D7 nicht, ...

Das kann ich so nicht bestätigen. Irgendwann stand mal in der Zeitschrift "Der Entwickler" ein Beispiel drin, wie man mittels Operatorüberladen mit komplexen Zahlen arbeiten konnte... Ich such den Artikel mal raus, dann kann ich mehr zu sagen, wenns interessiert.

pajofego 7. Okt 2004 22:30

Re: array addieren
 
Sorry aber wie soll das denn überhaupt ohne Schleifen gehen? Selbst wenn man Operatoren überladen könnte, müsstes du dort eine Schleife einbauen. Eine Addition mit Vektoren größer 4 ohne Schleifen geht doch gar nicht! Die Sache mit den Sets ausgenommen. Warum willst du keine Schleifen benutzen gibt es da einen Grund?

dizzy 7. Okt 2004 22:34

Re: array addieren
 
Das Überladen im Zusammenhang mit den komplexen Zahlen ist glaube ich eine Variant-spezifische Sache, und wird so weit ich mich erinnern kann via Compilermagic gelöst.

Jelly 7. Okt 2004 22:36

Re: array addieren
 
Hier mal Der Entwickler Link

In der Ausgabe 6/2002 wurde die Vorgehensweise an Strings gezeigt... Kenn mich aber nicht mit den Dingen aus, um ehrlich zu sein, wollts eben nur mal erwähnt haben.

stoxx 15. Dez 2005 15:23

Re: array addieren
 
Zitat:

Zitat von pajofego
Ü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!

ähm, muss das Thema nochmal rauskramen, wie geht das mit dem SSE Befehlsatz genau ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 Uhr.

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