Entwickler-Ecke

Sonstiges (Delphi) - Error bei einer kennt-Beziehung


xCyBeRx - Mo 14.03.11 10:45
Titel: Error bei einer kennt-Beziehung
Hallo :)
Ich habe aus Langeweile mal ein Programm geschrieben in dem man eine Kugel durch ein Tor steuern muss und dabei einer anderen Kugel ausweichen muss.
Nun habe ich das Problem, dass immer wenn ich eine Variable aus der Klasse TKugel aufrufen möchte ich einen Error bekomme und ich habe keine Ahnung woran das liegt.
Ich hänge einfach mal meinen Projektordner an und ich würde mich freuen wenn ihr mir helfen könnt :)
Nicht schimpfen wenn mal etwas schlecht geschrieben ist, weil ich Delphi erst seit einem halben Jahr in Informatik gabe.
(Wir benutzen da mSum,mListe,mUhr)

Edit: Die Namem Snake und TSchlange kommen übrigens daher das es ursprünglich mal Snake werden sollte aber mir dann doch zu kompliziert war :D


Nersgatt - Mo 14.03.11 10:48

Ohne jetzt das Projekt angeschaut zu haben: wie lautet denn die Fehlermeldung? Das ist sehr wichtig.


xCyBeRx - Mo 14.03.11 10:54

Exception EAccess in module Snake.exe at 000550C5.
Access violation at adress 004550C5 in module Snake.exe. Read of adress 00000000.


Nersgatt - Mo 14.03.11 10:59

Vermutlich hast Du keine Instanz Deiner Klasse erstellt.

Beispielhaft, wie so ein Fehler auftritt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  x : TKlasse;
begin

  x.WasAuchImmer := 0;
  x.Free

end;


Hier fehlt vorher die Erstellung der Instanz. So wäre es richtig:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  x : TKlasse;
begin

  x := TKlasse.Create;
  x.WasAuchImmer := 0;
  x.Free

end;


(ja, ich weiß, dass der Ressourcenschutzblock fehlt. es geht ums Prinzip)


elundril - Mo 14.03.11 11:00

Da anscheinend einiges User verlernt haben neue Mitglieder zu begrüßen (böser Blick Richtung Nersgatt :evil:) wünsch ich dir mal ein "Hallo und :welcome: im Delphi-Forum!"

Zu deinem Problem: Von welcher Klasse aus rufst du die Variable von TKugel schicken auf? Aus der Klasse TKugel selbst oder aus einer anderen Klasse? In welcher Zeile tritt der Fehler auf? Solche Dinge sind immer sehr hilfreich beim Fehler finden, da wir uns sonst wie in deinem Fall durch mehrere Unit wühlen müssen, was ja auch nicht gerade lustig ist. ;)

lg elundril


Nersgatt - Mo 14.03.11 11:04

Hallo und :welcome: im Delphi-Forum! :oops:


xCyBeRx - Mo 14.03.11 11:05

Also genau genommen rufe ich in der Klasse TSchlange die Funktion GibYPos und GibXPos (aus TKugel) auf um den Abstand der HauptKugel und der Kugel, die man nicht berühren darf, zu berrechnen.
Der Fehler ist dann wieder weg wenn ich den Befehl berechneAbstand3 rausnehme.(Dann hat natürlich auch eine Kollision keine Wirkung.)


elundril - Mo 14.03.11 11:20

Mhm und die Kugel die in kenntKugel gespeichert ist wurde auch vorher korrekt erzeugt und vor dem ersten aufrufen der routine in kenntKugel gespeichert?

also mit


Delphi-Quelltext
1:
2:
NeueKugel := TKugel.Create();
Schlange.lerneKugelKennen(NeueKugel);


Beide Teile sind wichtig und sollten erfolgt sein bevor das erste Mal Schlange.berechneAbstand3() aufgerufen wird. Ansonsten zeigt kenntKugel auf einen "leeren" Speicherplatz und in Delphi fliegen die Fetzen das sich die Schlange am liebsten verkriechen würde. ;)

lg elundril


OlafSt - Mo 14.03.11 11:23

So ein Fehler ist zu 99,99995652% ein nicht initialisiertes Objekt, auf das dann zugegriffen wird. Allerspätestens, wenn man liest "Read of address 00000000" ist es sonnenklar.

In deinem Fall ist es offensichtlich: kenntTor.GibX löst eine solche Schutzverletzung aus, ergo ist kenntTor nicht initialisiert. Schaut man sich in deinem Code etwas um, dann sieht man:

- kenntTor ist vom Typ TTor
- kenntTor.Create wird NICHT in TSnake.pas aufgerufen
- die Routine lerneTorkennen wird nie aufgerufen. Im ganzen Programm nicht.

Da liegt dein Problem.


elundril - Mo 14.03.11 11:27

user profile iconOlafSt hat folgendes geschrieben Zum zitierten Posting springen:
So ein Fehler ist zu 99,99995652% ein nicht initialisiertes Objekt, auf das dann zugegriffen wird. Allerspätestens, wenn man liest "Read of address 00000000" ist es sonnenklar.

In deinem Fall ist es offensichtlich: kenntTor.GibX löst eine solche Schutzverletzung aus, ergo ist kenntTor nicht initialisiert. Schaut man sich in deinem Code etwas um, dann sieht man:

- kenntTor ist vom Typ TTor
- kenntTor.Create wird NICHT in TSnake.pas aufgerufen
- die Routine lerneTorkennen wird nie aufgerufen. Im ganzen Programm nicht.

Da liegt dein Problem.


StringReplace(QuotedText, "Tor", "Kugel", [rfReplaceAll, rfIgnoreCase]);


xCyBeRx - Mo 14.03.11 11:33

user profile iconOlafSt hat folgendes geschrieben Zum zitierten Posting springen:
So ein Fehler ist zu 99,99995652% ein nicht initialisiertes Objekt, auf das dann zugegriffen wird. Allerspätestens, wenn man liest "Read of address 00000000" ist es sonnenklar.

In deinem Fall ist es offensichtlich: kenntTor.GibX löst eine solche Schutzverletzung aus, ergo ist kenntTor nicht initialisiert. Schaut man sich in deinem Code etwas um, dann sieht man:

- kenntTor ist vom Typ TTor
- kenntTor.Create wird NICHT in TSnake.pas aufgerufen
- die Routine lerneTorkennen wird nie aufgerufen. Im ganzen Programm nicht.

Da liegt dein Problem.


Ehm mit dem Tor habe ich aber überhaupt kein Problem? Damit funktioniert alles super! -.-

Und dickes Danke an elundril ich hab den Fehler gefunden der Befehl Schlange.lerneKugelkennen fehlte :D jetzt funktionierts!! DAAAAANKE :)


elundril - Mo 14.03.11 11:40

Kein Problem. ;)

Zu OlafSt verteidigung: Er hat vermutlich das gleiche gemeint wie ich und hat sich einfach nur beim Variablen und Methodennamen vertan. Ist mir auch passiert, aber ich habs halt bemerkt bevor ich meinen Post abgeschickt hab. ;)


xCyBeRx - Mo 14.03.11 11:49

Eine Frage hab ich noch :D
Ich habe in TSchlange dei VAriavle Score. Kann ich die irgendwie während des Spiels anzeigen lassen?


elundril - Mo 14.03.11 11:53

Bitte erstell für jede Frage einen neuen Thread. Das erhöht die Übersichtlichkeit der Diskussion und entspricht auch den Forenregeln.

lg elundril