Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
nigs Super JLI'ler
Anmeldedatum: 19.12.2002 Beiträge: 359
Medaillen: Keine
|
Verfasst am: 17.10.2004, 17:33 Titel: Programm stürzt ab |
|
|
Menschenskind!
Ich progg gerade wieder an meinem alten Game.
Aber jetzt komm ich nichtmehr weiter.
Also:
Ich habe eine Funktion:
Code: | void offset(CBunker &obj, bool b); |
Diese Funktion sollte eigentlich eine Klasse offseten, wie man am Namen erkennen kann.
Normal wird sie immer so aufgerufen:
Code: | offset(BO[0], true); |
Das ging bis jetzt auch immer blendend.
Jetzt der Haken an der Sache:
Wenn ich die Funktion so aufrufe:
Code: | offset(BO[1], true); |
Kackt das Programm ab, sobald sie aufgerufen wird.
ABBEER:
Die ersten Zeilen der Funktion sehen wie folgt aus:
Code: | obj.SR.left = 0;
obj.SR.right = 12;
obj.SR.top = 1;
obj.SR.bottom = 13; |
WENN ich aber jetzt die letzten 2 auskommentiere:
Code: | obj.SR.left = 0;
obj.SR.right = 12;
// obj.SR.top = 1;
// obj.SR.bottom = 13; |
Wenn ich diese 2 Linien auskommentiere Funzt auch der ganze Rest, indem noch einige mal einer top und bottom Variable eines Rects ein Wert zugewiesen wird.
Ich verstehe das nicht.
Sowas nenne ich unlogisch hoch 10.
Aber wie gesagt, wenn ich das ganze mit Code: | offset(BO[0], true); |
aufrue klappt alles.
K, wenn die ganze Funktion dann nicht gehen würde wäre es eine Sache.
Aber wenn ich diese blöden 2 Linien auskommentiere Funzt alles.
Jemand ne Ahnung?! An solchen blöden Sachen, verliere ich immer die Lust  |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.10.2004, 18:13 Titel: |
|
|
Was ist offset(...) ?
und was ist BO[...] ? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 17.10.2004, 18:29 Titel: |
|
|
äh, allerhöchstens Arrayüberschreitungen, aber das wäre wohl zu simpel.Ganz vieleicht liegt es an der Quellcode optimierung bei mir funktioniert manchmal die Debug aber nicht die Release oder so und ich hab keine Ahnung woran das liegt. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 17.10.2004, 18:35 Titel: |
|
|
Bei der Debug werden um Arrays (soweit ich weis) noch "Sicherheitsbytes" außenrum angelegt, so dass, wenn du über arraygrenzen hinausschreibst, nicht in benutzten speicher geschrieben wird. _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
 |
nigs Super JLI'ler
Anmeldedatum: 19.12.2002 Beiträge: 359
Medaillen: Keine
|
Verfasst am: 17.10.2004, 18:57 Titel: |
|
|
FallenAngel84 hat Folgendes geschrieben: | Was ist offset(...) ?
und was ist BO[...] ? |
offset setet die Variablen einer Klasse off^^
Also, sie initialisiert sie mit verschiedenen Werten.
BO[] ist, wie du aus dem Code entnehmen kannst eine Instanz der Klasse CBunker. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.10.2004, 19:04 Titel: |
|
|
Ist offset ne selbstgemachte Funktion von dir ?
Kannste mal die definition und deklaration von BO zeigen ?
Kannste mal den Code der Funktion offset zeigen ? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
nigs Super JLI'ler
Anmeldedatum: 19.12.2002 Beiträge: 359
Medaillen: Keine
|
Verfasst am: 17.10.2004, 19:49 Titel: |
|
|
FallenAngel84 hat Folgendes geschrieben: | Ist offset ne selbstgemachte Funktion von dir ?
Kannste mal die definition und deklaration von BO zeigen ?
Kannste mal den Code der Funktion offset zeigen ? |
Jo, alles selbstgemacht.
So wird BO dekleriert:
Hier offset:
Code: | bool offset(CBunker &obj, bool b)
{
obj.SR.left = 0;
obj.SR.right = 12;
obj.SR.top = 1;
obj.SR.bottom = 13;
obj.SRB.left = 0;
obj.SRB.right = 35;
obj.SRB.top = 30;
obj.SRB.bottom = 45;
obj.EXPLOD.left = 40;
obj.EXPLOD.right = 54;
obj.EXPLOD.top = 0;
obj.>EXPLOD.bottom = 12;
int r = rand()%800;
if(b == true)
{
//P.p.x = r+12;
//P.p.y = LS.LS[r]-15;
obj.DEB.left = r;
obj.DEB.right = r+35;
obj.DEB.top = Landsc[r]-15;
obj.DEB.bottom = Landsc[r];
}
obj.DE.left = 100;
obj.DE.right = 113;
obj.DE.top = 167;
obj.DE.bottom = 179;
//P.l = 20;
//obj.velocity = 20;
//obj.angle = 45;
//obj.rebound = 20; Bezieht sich auf ältere Versionen, als es noch einen Rebound gab(Hopsball-mäßiger Aufprall...)
obj.bx = 100;
obj.by = 167;
obj.time = 0;
obj.explodetime = 0;
obj.end = true;
obj.EXPLODING = false;
return true;
} |
Hier die Definiton der Klasse:
Code: | class CObject //Hauptklasse für Objekte
{
public:
RECT DE; //Ziel-Rechteck für Render-vorgang
RECT SR; //Source-Rechteck auf der Surface für das Objekt
RECT DEB;
RECT SRB;
RECT EXPLOD; //Source-Rechteck auf der Surface für die Explosion
bool end; //Entscheidet ob das OBjekt noch berechnet wird
bool EXPLODING; //Ist bei einer Explosion true
float explodetime;
float explodbegin;
LPDIRECTDRAWSURFACE7 *Surface; //Die Source-Surface die die Sprites enthält
float time; //Zeit wie lang das Objekt besteht
bool Draw(LPDIRECTDRAWSURFACE7 &Destination);
bool Calculate(void);
private:
protected:
};
//Kinderklassen - Sie enthalten Objekt-spezifische Elemente
class CBunker : public CObject //Klasse für die Bunker, abgeleitet von CObject
{
public:
Point P1; //Erste koordinate des Kanonen-Rohres
Point P2; //Zweite koordinate des Kanonen-Rohres
int angle; //Speichert den Winkel des Kanonen-Rohres
int velocity; //Geschwindigkeit mit dem das Geschoß abgeschoßen werden soll
int lifepoints; //Energie des Bunkers
int bx;
int by;
bool DrawPipe(void);
private:
protected:
}; |
Also CBunker wird von CObject abgeleitet.
Am Anfang wird global 2 Typen(BO[0] und BO[1]) der Klasse CBunker dekleriert(oder definiert?!).
Das komische ist ja, dass es mit BO[0] EINWANDFREI läuft, mit BO[1] stürzt es aber nach dem Aufruf der Funktion ab.
Und noch komischer ist, dass es mit BO[1] geht, wenn ich die 3. und 4. Zeile innerhalb der Funktion Offset auskommentiere! |
|
Nach oben |
|
 |
HotAcid Super JLI'ler

Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 17.10.2004, 19:58 Titel: |
|
|
äh, nur mal so nebenbei, "offset" bedeutet etwa soviel wie "Abstand". Fürs setzen von Variablen benutzt man den Konstruktor oder eine init()-Methode. Wenn mans unkonventionell mag, kann man die Methode auch "setVariables()" nennen. offset ist da ziemlich ungeeignet...
soviel zum Thema "Programmierstil"
greetz
Felix _________________ StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.10.2004, 20:02 Titel: |
|
|
Böser Programmierfehler:
CBunker BO[1] stellt nur ein Arrayfeld zur Verfügung das heisst es kann kein B[1] angesprochen werden da ja BO[0] das einzige zur Verfügung stehende Feld ist. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
nigs Super JLI'ler
Anmeldedatum: 19.12.2002 Beiträge: 359
Medaillen: Keine
|
Verfasst am: 17.10.2004, 20:03 Titel: |
|
|
HotAcid hat Folgendes geschrieben: | äh, nur mal so nebenbei, "offset" bedeutet etwa soviel wie "Abstand". Fürs setzen von Variablen benutzt man den Konstruktor oder eine init()-Methode. Wenn mans unkonventionell mag, kann man die Methode auch "setVariables()" nennen. offset ist da ziemlich ungeeignet...
soviel zum Thema "Programmierstil"
greetz
Felix |
grml wusste das sowas kommt
Entschuldigung, aber als ich das Klassentemplate geschrieben habe, war ich 10
Ich kann von Glück reden dass ich Off mit 2 f geschrieben habe.
Und nachdem ich den Thread eröffnet habe, habe ich das als Funktion in die Klasse gepackt.
Ist eben nen kleines DX-game, dass ich als ich mir JLI1 gekauft habe, angefangen habe, und halbfertig rumgammeln hab lassen.
Ich bin grad dabei den Code zu restaurieren
Außerdem find ich die Kommentare die ich damals setzte süß
Im letzten Post musste ich das ganze sogar noch schnell umsetzen, weil ich es ja schon in der Klasse hatte, aber ich hier nicht 2 mal nen anderen Code präsentieren wollte.
P.S.: Aber in der Klasse gepackt, kommen genau die gleichen Sachen wie so. |
|
Nach oben |
|
 |
nigs Super JLI'ler
Anmeldedatum: 19.12.2002 Beiträge: 359
Medaillen: Keine
|
Verfasst am: 17.10.2004, 20:06 Titel: |
|
|
FallenAngel84 hat Folgendes geschrieben: | Böser Programmierfehler:
CBunker BO[1] stellt nur ein Arrayfeld zur Verfügung das heisst es kann kein B[1] angesprochen werden da ja BO[0] das einzige zur Verfügung stehende Feld ist. |
Check ich nicht ganz
Ich habe immer gelernt das wenn ich z.B. "int array[1]" mache, mir array[0] und array[1] zur Verfügung stehen.
So hat das auch immer geklappt.
Kannst mir das genauer erklären??
Aso: Und wie soll ich das jetzt beheben?! "CBunker BO[2]" oder wie?! |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.10.2004, 20:11 Titel: |
|
|
Von wem auch immer du das gelernt hast erschlag ihn ^^
Du gibst bei Objekt foo[anzahl] an das ein Feld vom Typ Objekt mit anzahl elementen erzeugt wird. Wenn du dann darauf zugreifen willst über foo[index] kann index dann im Bereich von 0 bis anzahl-1 sein.
mit CBunker BO[2] solltest du dein Problem lösen können _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 17.10.2004, 20:11 Titel: |
|
|
Wenn du ein Array deklarierst, dann musst du in den eckigen Klammern angeben, wie viele Elemente es haben soll.
Das der Index beim Zugriff bei 0 begint liegt dadran, dass ein array wie ein pointer funktioniert. BO ist sozusagen der Zeiger auf das erste Element => (BO+0) oder BO[0]. (BO+1) oder BO[1] somit auf das zweite usw. _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.10.2004, 20:12 Titel: |
|
|
lol, ich sehe wir ergänzen uns perfekt  _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 17.10.2004, 20:13 Titel: |
|
|
Hehe, perfekte abgepasst ^^ _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
 |
|