![]() |
array addieren
Wie kann man 2 array einfach addieren?
Delphi-Quellcode:
a) ich möchte keine Schleifen verwenden
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;
Delphi-Quellcode:
b) Array a und Array b können auch ein dyn.Array sein
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];
Delphi-Quellcode:
irgendeiner eine Idee ?
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; |
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! |
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).
|
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.
|
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.
|
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.
|
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; |
Re: array addieren
Zitat:
Die arithmetischen Operatoren bleiben mit dem Delphi32-Compiler den Standard-Datentypen vorbehalten. ;-) |
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 |
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:
Für die strings funktioniert es, aber nicht für die Array's
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; |
Re: array addieren
Zitat:
|
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?
|
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.
|
Re: array addieren
Hier mal
![]() 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. |
Re: array addieren
Zitat:
|
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