Incompatible types: 'Char' and 'Pointer'

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Incompatible types: 'Char' and 'Pointer'

    Ich wollte mal wieder Delphi programmieren, komme aber leider nicht weit - TList will Pointer und die kann ich zwar unter C(++) aber in Delphi funktionierts nicht so richtig.

    Kann mir jemand sagen was ich falsch mache? Ich denk mal der Quellcode unten enthällt alles relevante.

    >>Delphi 6 Personal<<


    Quellcode

    1. type
    2. Mission = class
    3. title: string;
    4. deskription: TStrings;
    5. wavefile: string;
    6. parameterfile: string;
    7. playlist_normal: string;
    8. playlist_boss: string;
    9. player_ship: string;
    10. end;
    11. THauptF = class(TForm)
    12. //...
    13. procedure SpeedButton1Click(Sender: TObject);
    14. procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    15. procedure SpeedButton2Click(Sender: TObject);
    16. procedure POPAusbClick(Sender: TObject);
    17. procedure BitBtn1Click(Sender: TObject);
    18. procedure SpeedButton3Click(Sender: TObject);
    19. private
    20. Missionen: TList;
    21. { Private declarations }
    22. public
    23. { Public declarations }
    24. end;
    Alles anzeigen


    Quellcode

    1. procedure THauptF.BitBtn1Click(Sender: TObject);
    2. var
    3. myMission: ^Mission;
    4. begin
    5. new(myMission);
    6. myMission^.Create;
    7. myMission^.title := misTitel.Text;
    8. myMission^.deskription := misDes.Lines;
    9. myMission^.wavefile := misWave.Text;
    10. myMission^.parameterfile := misParam.Text;
    11. myMission^.playlist_normal := misNorPlst.Text;
    12. myMission^.playlist_boss := misBossPlst.Text;
    13. myMission^.player_ship := SHIP_FN.Text;
    14. Missionen.Add(myMission);
    15. end;
    16. procedure THauptF.SpeedButton3Click(Sender: TObject);
    17. var
    18. myMission: ^Mission;
    19. begin
    20. myMission := ^Mission(Missionen.Items[0]); //<- ist Zeile 136
    21. misTitel.Text := myMission^.title;
    22. misDes.Lines := myMission^.deskription;
    23. misWave.Text := myMission^.wavefile ;
    24. misParam.Text := myMission^.parameterfile ;
    25. misNorPlst.Text := myMission^.playlist_normal ;
    26. misBossPlst.Text := myMission^.playlist_boss ;
    27. SHIP_FN.Text := myMission^.player_ship ;
    28. end;
    Alles anzeigen


    [Error] UHaupt.pas(136): Incompatible types: 'Char' and 'Pointer'
    [Fatal Error] Editor.dpr(7): Could not compile used unit 'UHaupt.pas'
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Folgendes:

    1: Delphi ist kein C, dass ^ überall weg weg und benutze TObjectList. Zeiger sind nichts, womit man sich in modernen Sprachen nicht rumplagen sollte (auch wenn sie manchmal unverzichtbar sind).

    2. Ersetze das new(myMission); durch myMissionen:=Mission.Create; denn Objekte sollten immer! so erstellt werden. Beim erstellen einer Klasse wird der Speicher ebenfalls reserveriert und es wird zusätzlich der Konstruktor aufgerufen wo verschiedene Dinge gemacht werden können (Variablen initialisieren, etc...). In deinem Falls ist es egal, weil du keinen Konstruktor hast aber dazu: siehe 3.

    3. Deine Klasse ist nur ein Record - gebündelte Variablen. Dadurch dass du es aber als class deklarierst erbst du von TObject und bekomst ein Objekt später und kein Record, obwohl du die Klassen-Möglichkeiten nicht nutzt -> Resourcenverschwendung. Wenn da noch Funktionen etc. kommen lass es als Klasse und beachte 2. sonst mach es zum Record.

    4. myMission.description ist eine StringList, die nie instanziert wird -> Exception zur Laufzeit (beachte 2.). Sowas macht man, wenns eine Klasse ist im Konstruktor, beim Record einmal am Anfang.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Die Verwendung von Klassen ist wohl auf meine C++ - Gewohnheiten zurückzuführen wo zwischen struct und class der Unterschied gering ist.

    TObjectList wäre mir sowieso viel lieber gewesen (Delphi + Pointer hab ich noch überhaupt nicht verwendet) allerdings habe ich das nicht gefunden.

    Dummerweise geht es da meinem Compiler genauso. Ab welcher Delphi-Version ist das verfügbar?

    //E: Gefunden - da muss man ja eine Unit einbinden - aber TObjectList speichert keine Records oder?

    Quellcode

    1. type
    2. Mission = record
    3. title: string;
    4. deskription: TStrings;
    5. wavefile: string;
    6. parameterfile: string;
    7. playlist_normal: string;
    8. playlist_boss: string;
    9. player_ship: string;
    10. end;
    11. THauptF = class(TForm)
    12. //...
    13. procedure SpeedButton1Click(Sender: TObject);
    14. procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    15. procedure SpeedButton2Click(Sender: TObject);
    16. procedure POPAusbClick(Sender: TObject);
    17. procedure BitBtn1Click(Sender: TObject);
    18. procedure SpeedButton3Click(Sender: TObject);
    19. private
    20. Missionen: TObjectList;
    21. { Private declarations }
    22. public
    23. { Public declarations }
    24. end;
    Alles anzeigen

    Quellcode

    1. procedure THauptF.BitBtn1Click(Sender: TObject);
    2. var
    3. myMission: Mission;
    4. begin
    5. myMission.deskription := TStrings.Create;
    6. myMission.title := misTitel.Text;
    7. myMission.deskription := misDes.Lines;
    8. myMission.wavefile := misWave.Text;
    9. myMission.parameterfile := misParam.Text;
    10. myMission.playlist_normal := misNorPlst.Text;
    11. myMission.playlist_boss := misBossPlst.Text;
    12. myMission.player_ship := SHIP_FN.Text;
    13. Missionen.Add(myMission);
    14. end;
    Alles anzeigen

    [Error] UHaupt.pas(74): Undeclared identifier: 'TObjectList'
    [Warning] UHaupt.pas(120): Constructing instance of 'TStrings' containing abstract method 'TStrings.Clear'
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Nein, TObjectList kann nur Klasseninstanzen speichern. Wenn du aufs Record umsteigst, behalt die TList bei, aber auch da brauchst du glaub ich keine ^, der Compiler selber unterstützt einen schon recht viel.

    Achso das hatte ich beim ersten mal überlesen. TStrings ist eine abstrakte Klasse von der keine Instanzen gezogen werden sollen. Du solltest TStringList verwenden, deswegen die Warning vom Compiler.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Bin zuerst nicht dazu gekommen und hatte dan Linux laufen - als ich das heute dann aktualisieren wollte habe ich festgestellt, dass es nicht so ganz funktioniert.

    SeBa schrieb:

    TStringList ist quasi 100% "kompatibel" zu TStrings du kannst das also trotzdem zwischen speichern.


    Ich kann der StringList allerdings keine Strings zuweisen - muss ich da zeilenweise kopieren?

    Quellcode

    1. procedure THauptF.BitBtn1Click(Sender: TObject);
    2. var
    3. myMission: Mission;
    4. begin
    5. myMission.deskription := TStringList.Create;
    6. myMission.title := misTitel.Text;
    7. myMission.deskription := misDes.Lines;
    8. myMission.wavefile := misWave.Text;
    9. myMission.parameterfile := misParam.Text;
    10. myMission.playlist_normal := misNorPlst.Text;
    11. myMission.playlist_boss := misBossPlst.Text;
    12. myMission.player_ship := SHIP_FN.Text;
    13. Missionen.Add(myMission);
    14. end;
    Alles anzeigen


    Meldet er bei add
    incompatible Types: 'Mission' and 'Pointer'
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Also Klassen direkt einander zuweisen soll man sowieso nicht, das sollte immer mit assign() geschehen, da ist es dann egal ob es TStrings oder TStringList ist:

    mission.title.assign(misTitle.Lines);

    Aber bei TStrings oder TStringlist kannst du es auch so machen:

    mission.title.text:=misTitel.Text;

    Zu dem anderen Fehler: Berücksichtige aber das deine Variable nicht auf dem Heap lieg, sondern auf dem Stack und der automatisch am ende einer Prozedur aufgeräumt wird. Ich denke eher den Recordspeicher solltest du dir mit new() schaffen. Wahrscheinlich brauchst du dann doch ^ weil TList das so möchte.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Ist es zuviel verlangt wenn du mir zu dem Codeausschnitt die paar passenden Codezeilen Postest?

    Ich blick langsam aber sicher nicht mehr durch

    Kannst auch gerne haben was ich mittlerweile hab
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Quellcode

    1. procedure THauptF.BitBtn1Click(Sender: TObject);
    2. var
    3. myMission: ^Mission;
    4. begin
    5. new(myMission);
    6. myMission.deskription := TStringList.Create;
    7. myMission.title := misTitel.Text;
    8. myMission.deskription.assign(misDes.Lines);
    9. myMission.wavefile := misWave.Text;
    10. myMission.parameterfile := misParam.Text;
    11. myMission.playlist_normal := misNorPlst.Text;
    12. myMission.playlist_boss := misBossPlst.Text;
    13. myMission.player_ship := SHIP_FN.Text;
    14. Missionen.Add(myMission);
    15. end;
    Alles anzeigen


    Hab jetzt nix getestet, sondern das nur ausm Bauch aufgeschrieben.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • ok dann hab ich schon mal ein Problem mit meinem Code gefunden - new wird hier etwas anders verwendet wie in C++

    Und wie bekomm ich das aus der Liste wieder raus?
    Folgendes wil er nicht: Invalid typecast

    Quellcode

    1. var
    2. myMission: ^Mission;
    3. begin
    4. myMission := ^Mission(Missionen.Items[0]);
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Ich würds mitm Zwischentyp machen, sorry hätte ich in meinem Code gleich schon machen sollen. Das sorgt für erheblich mehr Übesicht, funktionieren sollte das natürlich auch ohne:

    Quellcode

    1. PMission = ^Mission;
    2. ...
    3. procedure THauptF.BitBtn1Click(Sender: TObject);
    4. var
    5. myMission: PMission;
    6. begin
    7. ...
    8. end;
    9. ...
    10. var
    11. myMission: PMission;
    12. begin
    13. myMission := Missionen.Items[0];
    14. ShowMessage(myMission^.title);
    15. ...
    16. end;
    Alles anzeigen


    Ist alles schon ein Weilchen her, aber so erinnere ich das. Ansonsten guck mal inder Delphi Hilfe zu TList, da ist iirc ein Beispiel.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]