AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Inkompatible Typen

Ein Thema von wiwa53 · begonnen am 19. Aug 2020 · letzter Beitrag vom 20. Aug 2020
Antwort Antwort
wiwa53

Registriert seit: 19. Aug 2020
Ort: Berlin
3 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Inkompatible Typen

  Alt 19. Aug 2020, 12:40
Delphi-Version: 10.1 Berlin
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;
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Inkompatible Typen

  Alt 19. Aug 2020, 12:52
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.
Gruß vom KodeZwerg

Geändert von KodeZwerg (19. Aug 2020 um 12:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.593 Beiträge
 
Delphi 5 Professional
 
#3

AW: Inkompatible Typen

  Alt 19. Aug 2020, 13:07
Ich glaube nicht, dass das Problem das Copy ist.

array of TCard ist nicht unbedingt array of TCard , jedenfalls nicht für den Compiler. Definiere einen weiteren Typ, z.B. 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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.604 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Inkompatible Typen

  Alt 19. Aug 2020, 13:18
Jupp, array of ... als Typ definiert immer wieder einen eigentändigen Typ.
Über den generic 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.798 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: Inkompatible Typen

  Alt 19. Aug 2020, 13:50
Hallöle...
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...

PS: Bitte kein denglisch verwenden.
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.

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

Ansonsten viel Spaß hier...

Geändert von haentschman (19. Aug 2020 um 13:53 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.696 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Inkompatible Typen

  Alt 19. Aug 2020, 14:51
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);
Ralph

Geändert von Jumpy (19. Aug 2020 um 15:30 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
431 Beiträge
 
Delphi XE5 Professional
 
#7

AW: Inkompatible Typen

  Alt 19. Aug 2020, 15:08
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
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher.
John C. Cornelius
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.798 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: Inkompatible Typen

  Alt 20. Aug 2020, 07:02
Moin...

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...
  Mit Zitat antworten Zitat
wiwa53

Registriert seit: 19. Aug 2020
Ort: Berlin
3 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

AW: Inkompatible Typen

  Alt 20. Aug 2020, 07:52
Hallo alle miteinander.
Erst einmal vielen vielen Dank für die netten Hinweise und Tipps.
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" ) 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.
  Mit Zitat antworten Zitat
wiwa53

Registriert seit: 19. Aug 2020
Ort: Berlin
3 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

AW: Inkompatible Typen

  Alt 20. Aug 2020, 08:09
Dalai und himitsu: Danke so gehts:
Type
TCardArray = Array of TCard;

Happy
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 05:42 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