Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Inkompatible Typen (https://www.delphipraxis.net/205266-inkompatible-typen.html)

wiwa53 19. Aug 2020 12:40

Delphi-Version: 10.1 Berlin

Inkompatible Typen
 
Hallo, bin neu hier und möchte Eure Hilfe.
Ich spiele ein bisschen mit OOP und baue ein Objekt für ein Kartenspiel.
Das Objekt (TCard) kann ich initialisieren (create) und ein Blatt-Array (vom Type TCard) von mehreren Karten generieren, mischen und rudimentär darstellen.
Um das Blatt auf mehrere Stapel/Spieler aufzuteilen nutze ich mehrere Blatt-Arrays, denen ich per Copy(Blatt-Array, Index, Anzahl) einen Kartenstapel zuweise, dabei bekomme ich einen Fehler "Inkompatible Typen" obwohl die vom gleichen Type sind.
Kann mir das jemand erklären?

Hier folgen Auszüge meines Quellcodes:

type
CardWert = (ass,zwei,drei,vier,fuenf,sechs,sieben,acht,neun,z ehn,bube,dame,koenig,jokerw);
CardFarbe = (kreuz,pik,herz,karo,jokerf);
CardMotiv = TBitmap;

TCard = class(TObject)
private
{ private declarations }
Farbe : CardFarbe;
Wert : CardWert;
Count : Integer;
Motiv :CardMotiv;
MotivBack : CardMotiv;
path:string;
Zahl:integer;

protected
{ protected declarations }
public
{ public declarations }
constructor Create(CWert:CardWert; CFarbe : CardFarbe; CCount : Integer; CMotiv, BMotiv :CardMotiv; pa:string; za:integer);
published
{ published declarations }
end;

...
...
...

var
Form1: TForm1;
Blatt: array of TCard; // alle Karten
a , b : array of TCard;
tb : array of TCard;


implementation

...

es folgen der constructor create ....

und weitere prozeduren ...

...

dann kommt die Prozedur mit dem Fehler:

procedure TForm1.Abheben;
var a,t,zz,i : integer;

begin
zz:=0;
repeat
randomize;
a:=random(length(blatt));

inc(zz);
until ((a > 30) and (a < 90)); // Abheben min. 30 max. 90 Karten von 109

setlength(tb,a);
tb:= copy(blatt,0,a-1); {inkompatible typen????}
{ TODO : Aufklärung "Inkompatible Typen" ???? }
end;

KodeZwerg 19. Aug 2020 12:52

AW: Inkompatible Typen
 
Willkommen in der DP!

Sorry für alten link, sollte dennoch seine Gültigkeit haben.
Lese mal was Copy macht.
Daraus sollte sich ergeben was das eigentliche Problem ist. (Copy arbeitet mit Strings oder eingeschränkt auch Arrays)

Erwartet wird aber ein Typ TCard.

Dalai 19. Aug 2020 13:07

AW: Inkompatible Typen
 
Ich glaube nicht, dass das Problem das Copy ist.

Delphi-Quellcode:
array of TCard
ist nicht unbedingt
Delphi-Quellcode:
array of TCard
, jedenfalls nicht für den Compiler. Definiere einen weiteren Typ, z.B.
Delphi-Quellcode:
TCardArray = array of TCard
und nutze diesen in der Variablendeklaration. Dann sollte es funktionieren. Auch wenn ich weiß, dass es so ist, kann ich nicht erklären warum (aber himitsu oder jemand anders kann das sicher).

Grüße
Dalai

himitsu 19. Aug 2020 13:18

AW: Inkompatible Typen
 
Jupp,
Delphi-Quellcode:
array of ...
als Typ definiert immer wieder einen eigentändigen Typ.
Über den generic
Delphi-Quellcode:
TArray<...>
ist das nicht so, da werden alle "gleichen" Typen global geshared, so als wenn man selber einen Typen definieren und überall verwenden würde.

haentschman 19. Aug 2020 13:50

AW: Inkompatible Typen
 
Hallöle...8-)
Delphi-Quellcode:
type
CardWert = (ass,zwei,drei,vier,fuenf,sechs,sieben,acht,neun,z ehn,bube,dame,koenig,jokerw);
CardFarbe = (kreuz,pik,herz,karo,jokerf);
CardMotiv = TBitmap;

TCard = class(TObject)
private
{ private declarations }
Farbe : CardFarbe;
Wert : CardWert;
Count : Integer;
Motiv :CardMotiv;
MotivBack : CardMotiv;
path:string;
Zahl:integer;
Du hast in deinem Quellcode "syntaktische" Fehler.
Delphi-Quellcode:
type
CardWert
muß heißen:
Delphi-Quellcode:
type
  TCardWert
Schau dir mal den Delphi StyleGuide an. https://www.delphi-treff.de/object-pascal/styleguide/
Das ist eine Art Respekt an die das lesen sollen/müssen... :zwinker:

PS: Bitte kein denglisch verwenden. :zwinker:
Delphi-Quellcode:
TCardWert besser TCardValue
...
PS1:
Delphi-Quellcode:
var a,t,zz,i : integer;
...
Heute braucht man nicht mit Buchstaben geizen... In 2 Monaten weißt du im Quelltext nicht mehr was "a" bedeutet. Sprechende Namen sind besser. :thumb:

PS2:
Bitte formatiere dir deinen Quelltext mit dem "Helm Symbol" im Editor. Das ist einfach übersichtlicher. :wink:

Ansonsten viel Spaß hier...:dp:

Jumpy 19. Aug 2020 14:51

AW: Inkompatible Typen
 
Dann vielleicht noch ein Typ zur Zufalls-Generierung:
"randomize" brauchst du nur 1x für die ganze Anwendung aufrufen, z.B. im FormCreate oder so.
Wenn du eine Zufallszahl zw. 30 und 90 willst kannst du auch in etwa das Folgende schreiben und dir die Schleife sparen:
a:=31+random(59);

Andreas13 19. Aug 2020 15:08

AW: Inkompatible Typen
 
Willkommen im Club, Wiwa53,
Du kannst Deinen QuellCode hier mit Hilfe des Delphi-Symbols (= Helm mit rotem Kamm gleich über der ersten Zeile im Editor) richtig formatieren, damit er besser lesbar ist.
Gruß, Andreas

haentschman 20. Aug 2020 07:02

AW: Inkompatible Typen
 
Moin...8-)

Diese Logic verstehe ich nicht...
Delphi-Quellcode:
a:=random(length(blatt)); // ermittlung der Karte aus dem Blatt (Integer zwischen 0 und 109)

inc(zz); // Anzahl der Karten
until ((a > 30) and (a < 90)); // Abheben min. 30 max. 90 Karten von 109 // ??? müßte das nicht statt a zz heißen

setlength(tb,a);// ??? müßte das nicht statt a zz heißen
Wie ist eigentlich dein Kenntnisstand bei Delphi?

Ich würde 2 Listen benutzen (TObjectList<TCard>). Die erste Liste mit dem gesamten Blatt füllen. Von der ersten Liste die gezogenen Karten in die andere Liste verschieben... :wink:

wiwa53 20. Aug 2020 07:52

AW: Inkompatible Typen
 
Hallo alle miteinander.
Erst einmal vielen vielen Dank für die netten Hinweise und Tipps. :-D
Ich spiele seit Turbo Pascal Zeiten (1980' Jahre) mehr oder weniger hobbymäßig mit dieser Sprache herum und weiß Gott bin ich vom Titel "Programmierer" weit entfernt. Habe in meiner beruflichen Laufbahn (bin inzwischen "Privatier" 8-) ) als IT-Admin so einige Tools im Delphi geschrieben, meist System-relevante Sachen wie, Registry im Netzwerk ändern, Netzwerk-Clients auflisten, User-Interface für AD Benutzerverwaltung unter Beachtung Firmenspezifischer Vorgaben und Einstellungen (das allerdings in C#). Eigentlich bin ich eher ein GUI Programmierer. Deshalb wage ich mich nun (recht verspätet) mal an die höhere Logik des OOP heran.

haentschman: Ich habe vor einen Kartenstapel abzuheben und die unterschiedlichen Stapel vermischt zusammenzuführen. Ist nur ein Test für späteres Aufteilen in verschiedene Spielerstapel. Dabei mache ich einen repeat bis die Stapelgröße >30 <90 entspricht. Diese Menge weise ich dem neuen TCard-Array zu. Dann entsteht der Fehler.

Das mit dem CardWert -> TCardWert bzw. TCardValue ist aber nur Style und führt sicher nicht zu dem Fehler (ich weiß schön, lesbar nach einiger Zeit ist mein Code noch nicht)

Jumpy: Cool, das mit dem a:=31+random(59), sowas hab ich noch nicht gesehen.



Dalai und himitsu: Danke, den Tipp werde ich ausprobieren.

KodeZwerg: Das mit dem Copy für dynamische Arrays habe ich in der offiziellen Delphi Hilfe gefunden. Dort steht sowas wie: Beim Zuweisen von einem dyn. Array zum anderen wird nur der Zeiger übergeben und referenziert den selben Wert, d.h. ändere ich dann den Wert im 2. Array wird die Änderung im 1. Array auch sichtbar. Deshalb empfiehlt die Hilfe Copy.

Danke nochmals, war alles sehr informativ.

wiwa53 20. Aug 2020 08:09

AW: Inkompatible Typen
 
Dalai und himitsu: Danke so gehts:
Type
TCardArray = Array of TCard;

Happy :-D


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:27 Uhr.

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