Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Arrays kopieren mit Hindernissen (https://www.delphipraxis.net/2514-arrays-kopieren-mit-hindernissen.html)

KeeN 27. Jan 2003 14:25


Arrays kopieren mit Hindernissen
 
Hallo nochmal +g+

Also ich habs geschafft die Arrays zu sortieren und auf Doppelte zu untersuchen +freu+ Ok jetzt zum nächsten Problem, ich will das eine Array in das andere kopieren.

Code:
for i:=0 to High(List1) do
begin
 List2[i]:=List1[i];
end;
Es wird zwar kopiert aber nicht alles. Nämlich die letzte Zahl bleibt immer weg. Soll heißen 5 Zahlen im ersten, 4 Zahlen im zweiten Array. Und nu????

MfG
KeeN

Luckie 27. Jan 2003 14:43

Geht das nicht:
Code:
List2 := List1;
Vorraussetzung ist allerdings, dass die Arrays gleich groß sind.

Oder irgenmdwie mit move oder so?

KeeN 27. Jan 2003 15:26

Arrays kopieren
 
Also das mit
Zitat:

List1:=List2
geht nicht, da heißt es sind inkompatible typen vorhanden. die arrays sind beide auf der gleichen größe. auch mit move gehts nicht:

Code:
for i:=0 to High(List1) do
begin
 move(List1, List2, i)
end;
+sfz+ ich verzweifel nochma ... +g+

Christian Seehase 27. Jan 2003 15:40

Moin Keen,

wie ist denn List1 deklariert?

KeeN 27. Jan 2003 15:58

aaaaalso

Deklaration:

Code:
  list1: array of integer;
  list2: array of integer;
Und da das ganze zwei dynamische Arrays sind...

Code:
 SetLength(List1, strtoint(edit1.text));
 SetLength(List2, strtoint(edit1.text));

Christian Seehase 27. Jan 2003 16:07

Moin Keen,

also das versteh' ich jetzt aber nicht.

High(List1) ist ja gleich Length(List1)-1, müsste also in Deinem Beispiel = 4 sein.

Lass Dir doch vor der Schleife mal anzeigen, welchen Wert High(List1) hat.
Wenn da 4 steht, und es trotzdem nicht funktioniert... *VorerstMalSchulterZuck*

KeeN 27. Jan 2003 16:33

Hab ich gemacht kommt bei jedem 4 raus. Egal bei welcher Liste. Irgendwie blick ich net ganz durch +g+ shi* muss ich morgen mal die Leutz bei uns Fragen ... ich hoff ich find die Lösung. Ich hab übrigens auch schon probiert den letzten Wert "manuell" zu kopieren, aber nada.

KeeN

jbg 27. Jan 2003 16:36

Da du schon dynamische Arrays einsetzt, kannst du auch gleich die Erweiterte Copy Funktion nutzen:
Delphi-Quellcode:
List2 := Copy(List1);
Ein Setzen der Länge von List2 ist nicht nötig, da es sonst doppelt gemacht würde.

KeeN 27. Jan 2003 17:35

Naja wär ja ganz nett, wenns funktionieren würde. Aber es kommt immer die Fehlermeldung "Incompatible Types" ich frag mich aber warum, denn es sind ja beides Integer-Arrays ...

Daniel 27. Jan 2003 17:39

Hallo,

dann erstelle doch vorher einfach einen Typ:

Delphi-Quellcode:
type
  tmyIntArray : Array of Integer;
Und nun deklariere Deine beiden Variablen als Typ 'tmyIntArray'. Ich sitz' nun gerade im Büro und kann es deswegen nicht länger austesten, aber ich denke, dass sollte Deine Typ-Probleme beheben. (Nur Figurprobleme -sofern vorhanden- löst dieser Tipp natüplich nicht... :mrgreen:)

Grinse-Michel korrigiert - Luckie

Brüggendiek 27. Jan 2003 18:06

Hallo KeeN!

Die inkompatiblen Tpyen kommen daher:
Zitat:

Zitat von KeeN
Code:
  list1: array of integer;
  list2: array of integer;

Dadurch sind zwei Arrays mit unterschiedlichem Typ deklariert!
Lösung: entweder, wie schon vorgeschlagen, einen Typ deklarieren, oder:
Code:
list1, list2: array of integer;
Dann ist der Typ gleich!

Klingt komisch, ist aber so in der Hilfe beschrieben!

Gruß

Dietmar Brüggendiek

KeeN 27. Jan 2003 18:06

+muah+ ich kriech die krise! das funktioniert zwar jetzt mit copy aber der macht trotzdem wieder nur 4 von 5 zahlen... :freak: :wall:

Brüggendiek 27. Jan 2003 18:21

Hallo KeeN!

Ich habe das gerade bei mir (D5 Standard) mal ausprobiert - keine Probleme (mit meiner Deklaration in einem Durchgang).

Bist Du sicher, daß Dein Ausgangsfeld Länge 5 ist und alle 5 Werte belegt hat???

@Christian Seehase: Length(dynArray) ist immer 4 (weil ein Pointer)!!

Gruß

Dietmar Brüggendiek

KeeN 27. Jan 2003 18:26

ja bin ich. also ich hab zwei listboxen. listbox1 gibt die in array1 (list1) generierten zufallszahlen aus. und das sind 5. listbox2 gibt die dinger sortiert aus. und da sind es immer nur 4. ich hab auch schon probiert list1 in list2 zu kopieren und dann in listbox2 auszugeben, das gleich ergebnis ... wieder nur 4.

KeeN

Brüggendiek 27. Jan 2003 18:55

Hallo nochmal!

Zitat:

Zitat von Luckie
Geht das nicht:
Code:
List2 := List1;

Das geht definitiv nicht - jedennfalls nicht so, wie man sich das normalerweise wünscht! Dann sind nämlich beide Felder dasselbe und Änderungen am einen betreffen auch das andere!
Dynamische Arrays sind (wie Strings) Pointer. Mit Deiner Zuweisung werden beide Pointer auf dasselbe Array gesetzt - und dazu muß List2 nicht einmal initialisiert sein!!!

Es bleibt allerdings dabei, daß ich das hier vorhandene Problem nicht nachvollziehen kann.
Die einzig mögliche Ursache ist, daß List1 4 statt 5 Elemente hat.

Mein Testcode, ganz schnell zusammengeklopft:
Code:
var a,b:array of integer;
p:byte;

begin
setlength(a, 5);
setlength(b, 5);

for p:=0 to High (a) do
begin
a[p]:=random (100);
end;

for p:=0 to High (a) do
begin
b[p] := a[p];
end;


end;
Da enthalten beide Felder dann dieselben 5 Werte.

Gruß

Dietmar Brüggendiek

KeeN 27. Jan 2003 19:02

+hihi+ bei mir leider nicht. ich glaub langsam das liegt am kylix ich werd mich mal nach nem update umtun ...

danke trotzdem
KeeN

jbg 27. Jan 2003 20:01

Zitat:

Zitat von Brüggendiek
@Christian Seehase: Length(dynArray) ist immer 4 (weil ein Pointer)!!

Falsch! Was du meinst ist SizeOf(dynArray).

Christian Seehase 27. Jan 2003 22:27

Moin Keen,

lass' doch mal in der Schleife einen Zähler mitlaufen, und gebe dessen Wert nach Beendigung der Schleife aus, oder vielleicht sogar immer in der Schleife zusammen mit den jeweiligen Werten.

Das einzige was mir sonst noch einfällt:

Wenn List2 die Werte sortiert enthält: Wie sortierst Du?
Ist es im Bereich des Möglichen, dass Du in List2 nur deshalb nur vier Werte stehen hast, weil zwei der Werte in List1 gleich sind, und doppelte Werte bei Deinem Algo aussortiert werden?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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-2025 by Thomas Breitkreuz