| Autor |
Nachricht |
schumann.vas
      
Beiträge: 43
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Mi 14.12.11 19:24
Hey,
ich habe ein kleines Spiel geschrieben, die Auswahl der Level macht mir im moment Probleme..
Ich erhalte immer eine Fehlermeldung das eine Zugriffsverletzung vorliegt und der Debugger spuckt aus,
dass iwas mit Treads nicht passt.
Erstmal der Quellcode:
Form1, Hauptseite:
Form2, Einstellungsseite
Unit Schwein:
Unit Spielfeld:
Der Fehler betrifft die Level-Auswahl , also Form2.Schw sowie TSchwein.SetzeA und damit indirekt auch das Schwein selbst...meine Vermutung...die Koordinaten werden dem Schwein zugewiesen obwohl das Schwein noch nicht existiert bzw. das Schwein ist einfach nicht bekannt...ich weiß nur nicht wie ichs ändere...LG :) Moderiert von Th69: Topic aus Open Source Projekte verschoben am Mi 14.12.2011 um 18:59Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Mi 14.12.2011 um 21:44
|
| |
|
|
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
|
|
Xion
       

Beiträge: 1754
Erhaltene Danke: 62
Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
|
Verfasst: Mi 14.12.11 19:41
So wie ich das sehe ist es ein ganz klassischer Fall:
Du erzeugst dein Objekt nicht und kannst entsprechend nicht drauf zugreifen:
Tip: Breakpoints helfen
PS: Die Einrückung in TForm2.Schw ist total irreführend 
_________________ a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
Für diesen Beitrag haben gedankt: schumann.vas
|
| |
|
|
schumann.vas 
      
Beiträge: 43
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Mi 14.12.11 19:58
Mein Objekt erzeug ich ja schon..nur nicht an der stelle..das schwein..es muss ja das selbe sein, wenn ich es hier neu erstelle...dann hab ich doch noch eins..und das andre kann ich doch damit auch net verändern oder?!...und die breakpoints..da hat er überall nen häckchen gemacht...*verwirrt* 
|
| |
|
|
Xion
       

Beiträge: 1754
Erhaltene Danke: 62
Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
|
Verfasst: Mi 14.12.11 21:20
"Schwein" erzeugst du nirgends, nur "Sau", was Teil vom Spielfeld ist.
An das kommst du aber niemals wieder ran, da es private ist. Du kannst also von einer Klasse außerhalb von TSpielfeld nicht darauf zugreifen.
Wenn du es public machst, dann könntest du mit Spielfeld.Sau drauf zugreifen, und das dann auch in Unit2 verwenden. Wenn man davon absieht, dass Spielfeld in Unit1 definiert ist und Unit1 nicht in Unit2 eingebunden ist (unter "implementation", sonst gibt ne zirkuläre Referenz) 
_________________ a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
Für diesen Beitrag haben gedankt: schumann.vas
|
| |
|
|
schumann.vas 
      
Beiträge: 43
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Do 15.12.11 07:37
So..ich habe jetzt die Sau in der Unit mSchwein public gemacht...und in der Unit2 siehts wiefolgt aus:
Jetzt müsste das doch funzen?..tut es aber nicht! ._. *zu blöd bin*
|
| |
|
|
Xion
       

Beiträge: 1754
Erhaltene Danke: 62
Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
|
Verfasst: Do 15.12.11 08:22
Nein, kann es nicht, da du erst Form2.Schw aufrufst und dann dein Objekt erzeugst
Es ist übrigens ganz schlecht, dass du jedesmal wenn du Form2.Schw aufrufst das Spielfeld neu erzeugst  Wenn dann müsstest du wenigstens vorher das Spielfeld freigeben(glaube aber nicht, dass du das willst).
_________________ a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
Für diesen Beitrag haben gedankt: schumann.vas
|
| |
|
|
schumann.vas 
      
Beiträge: 43
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Do 15.12.11 15:26
Okee...wiefolgt abgeändert:
Iwas stimmt aber immernoch nich 
|
| |
|
|
Xion
       

Beiträge: 1754
Erhaltene Danke: 62
Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
|
Verfasst: Do 15.12.11 19:03
schumann.vas hat folgendes geschrieben : | Iwas stimmt aber immernoch nich  |
Welcher Fehler kommt denn?
Also die Zeile ist komisch...ich kann garnicht sagen was da letztendlich eigentlich passiert, aber den Constructor solltest du auf keinen Fall so von Hand aufrufen (Zeile einfach weglassen).
Klar muss dir sein dass du jedesmal bei Button2.OnClick dein Spielfeld neu initialisierst (d.h. alles alte ist damit weg).
_________________ a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
Für diesen Beitrag haben gedankt: schumann.vas
|
| |
|
|
schumann.vas 
      
Beiträge: 43
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Do 15.12.11 20:08
Stimmt..das mit dem Spielfeld.Create ist mir jetzt auch schleierhaft..
Button2Click ist ein Button um ein neues Spiel zu beginnen..wenn entweder das eine Gewonnen ist oder so..
Der ist also durchaus so gewollt (hätt ich natürlich eher sagen können^^)..
Der Fehler der auftaucht ist immernoch der gleiche:
| Zitat: | | Zugriffsverletzung bei Adresse 00549326 in Modul "Edit.exe". Lesen von Adresse 000003B0. |
Danke erstmal für die bisherigen Bemühungen! 
|
| |
|
|
Xion
       

Beiträge: 1754
Erhaltene Danke: 62
Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
|
Verfasst: Fr 16.12.11 00:59
Poste bitte nochmal deine Unit2, da sollte sich ja einiges geändert haben. Dann gucke ich nochmal drüber 
_________________ a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
Für diesen Beitrag haben gedankt: schumann.vas
|
| |
|
|
schumann.vas 
      
Beiträge: 43
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Fr 16.12.11 07:22
Unit 2 alleine hat sich ja nicht soo viel geändert...ich poste fix noch mal alles^^
Unit1:
Unit2:
mSchwein:
mSpielfeld:
Es ist halt immernoch der gleiche Fehler, der schon von Anfang an auftrat ._.
|
| |
|
|
Xion
       

Beiträge: 1754
Erhaltene Danke: 62
Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
|
Verfasst: Fr 16.12.11 16:34
Du weißt aber schon wie das mit Klassen und Objekten funktioniert?
Du hast ja jetzt 2 Spielfelder (die nichts miteinander zu tun haben). Das in Unit2 erzeugst du aber nie => Access Violation
Ich vermute mal, dass du das Spielfeld aus Unit1 verwenden möchtest. Dazu musst du nur Unit1 einbinden (mit uses Unit1 unter implementation, sonst gibts ne zirkuläre Referenz). Das sollte ausreichen.
_________________ a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
Für diesen Beitrag haben gedankt: schumann.vas
|
| |
|
|
schumann.vas 
      
Beiträge: 43
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Fr 16.12.11 17:08
Zu deiner Frage..ich bin Schüler und wir sind vor kurzem zum OOP übergegangen..vorher lief noch alles super..aktuell tu ich mich nen bisschen schwer, wie man merkt
Hab das geändert...Fehler kommt am Programmstart immernoch und zwars, wenn in Unit1 Form2.Schw ausgeführt wird..
Ich glaub ich habe auch den Fehler schon entdeckt (die Lösung ist dann aber noch weit weg^^)..ich Erstelle das Schwein, mit zufallswerten aus einem Bereich von XX..und der wird ja erst in Form2.Schw definiert oder? Dh. er bekommt die Werte nicht, die er braucht, richtig?..und würde ich es einfach tauschen..dann würde das Schwein noch nicht existieren und ich erhalt auch nur Fehler^^
|
| |
|
|
Xion
       

Beiträge: 1754
Erhaltene Danke: 62
Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
|
Verfasst: Fr 16.12.11 18:05
Die Werte, die du im Constructor von TSchwein benutzt, sind alle 0. random(0) gibt keinen Fehler (auch wenn es nicht viel Sinn macht). Du kannst ja mal statt "GibA" einfach a reinschreiben (ist ja das selbe), aber ich glaube nicht dass das deswegen einen Fehler gibt.
Du kannst mir auch mal das ganze Projekt schicken (z.B. als PN), dann kann ichs selbst mal compilieren und mit Breakpoints gucken. ich glaub das wäre schneller als hier rumzuraten 
_________________ a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
Für diesen Beitrag haben gedankt: schumann.vas
|
| |
|
|
Xion
       

Beiträge: 1754
Erhaltene Danke: 62
Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
|
Verfasst: Fr 16.12.11 21:52
Ah, ok, da wäre ich niemals drauf gekommen:
Du rufst im constructor von Form1 (OnCreate) Form2.Schw auf. Du willst dort auf RadioButton3 zugreifen, aber Form2 (und alles darauf) ist zu diesem Moment noch nicht erzeugt worden (Es wird zuerst Form1 und dann Form2 erzeugt). Unter D2005 kommst du zu dem Code mit F8 hin. Dort steht:
Vertauschst du diese beiden Befehle, läuft es. Alternativ kannst du Form2.Schw aus Form1.OnCreate entfernen oder gleich statt OnCreate OnShow benutzen.
_________________ a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
|
| |
|
|
schumann.vas 
      
Beiträge: 43
Win 2000, Win XP, Win 7; Ubuntu
Delphi 7, Delphi XE2, C
|
Verfasst: Mo 19.12.11 20:58
Vielen Dank...
funktioniert alles Wunderbar 
|
| |
|
|
jaenicke
      
Beiträge: 15841
Erhaltene Danke: 741
XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
|
Verfasst: Di 20.12.11 10:20
Xion hat folgendes geschrieben : |
Also die Zeile ist komisch...ich kann garnicht sagen was da letztendlich eigentlich passiert |
Als Ergänzung:
Es wird versucht den Konstruktor als Methode des Objekts in Spielfeld aufzurufen. Existiert das Objekt noch nicht, gibt es eine Zugriffsverletzung.
Beim korrekten Aufruf Spielfeld := TSpielfeld.Create; wird hingegen der Konstruktor der Klasse aufgerufen. Sozusagen als Klassenmethode. Daher muss hier kein Objekt existieren, sondern nur die Klasse. Und das tut sie ja. 
|
| |
|
|
|