Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.01.2013, 20:34

Falsche Werte

Ich bin immer noch bei meinem alten Projekt und wollte einen Bug beheben, der dem Spieler eine falsche ID zuweißt.
Ich habe zwar den "Fehler" gefunden, jedoch ist mir unklar wie er entsteht bzw. wie man ihn lösen kann.

Ich habe einen int Wert "SkillID", der normaler weiße Werte von 100 - 899 annehmen sollte. Dieser Wert wird später per Auswahl vom Spieler einer dieser Zahlen zugewiesen. Dies klappt auch perfekt. Doch sobald ich den Wert einer Variable einer Klasse zuweißen will, bekommt die neue Variable einen komplett neuen Wert:


Ausschnitt der Funktion (extrem gekürzt):
http://pastebin.com/wTgfXbYS


[i][i][i]Die Ausgabe wäre:
nSkillID = 800
SkillID = 1134066152

Der selbe Fehler ist auch bei Health (auch 1134066152).

[/i][/i][/i][i]
[/i]
[i]ich hoffe auf Hilfe :this:

mfg. RunRanger
[/i]
Programmiersprache: C++
Fortschritt: Grundkenntnissse

Dieser Beitrag wurde bereits 15 mal editiert, zuletzt von »RunRanger« (03.01.2013, 21:05)


BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

2

03.01.2013, 20:45

Dass das überhaupt kompiliert wird...
Ändere Zeilen 9 und 10 zu:

C-/C++-Quelltext

1
2
std::cout << "SkillID = " << SkillID << std::endl;
std::cout << "nSkillID = " << nSkillID << std::endl;


Jetzt solltest du die richtigen Werte angezeigt bekommen.

3

03.01.2013, 20:50

Sry, das war ein Schreibfehler von mir :)
Im Original Code wurde es richtig geschrieben. Ich musste es nur hier neu schreiben, da irgendwie der Quellcode-Button nicht richtig funktioniert :D
Programmiersprache: C++
Fortschritt: Grundkenntnissse

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

03.01.2013, 20:52

Wieso heißt die Methode "GetFirstInfo"? Das sieht eher nach nem Setter aus...

Was soll das bringen:

C-/C++-Quelltext

1
2
3
4
for (int i = 0; i < 9; i++)
{
   m_WearID = EquipmentID ;
}

Du machst 9 mal die selbe Zuweisung...

Sorg bitte dafür, dass der Code richtig formatiert ist(notfalls über pastebin.com). So gehts ja garnicht...
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

5

03.01.2013, 21:03

C-/C++-Quelltext

1
2
for (int i = 0; i < 9; i++)
   m_WearID[i] = EquipmentID[i] ;

Hier schreibst du über das Ende von m_WearID hinaus.

Sicher, dass deine Integer 32 Bit groß sind?

6

03.01.2013, 21:04

K, ich glaub jetzt müsste alles richtig sein:
http://pastebin.com/fAGLE1xb



Die Funktion GetFirstInfo ([...]); überträgt alle wichtigen Infos, die für das Generieren der Klasse auf der Map wichtig sind.



@BurningWave:
Wie meinst du das, "über das Ende von m_WearID" hinaus? m_WearID hat mir noch keine Probleme bereitet.
Programmiersprache: C++
Fortschritt: Grundkenntnissse

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »RunRanger« (03.01.2013, 21:12)


BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

7

03.01.2013, 21:20

@BurningWave:
Wie meinst du das, "über das Ende von m_WearID" hinaus? m_WearID hat mir noch keine Probleme bereitet.


Doch tut es. In der Headerdatei ist definiert:

C-/C++-Quelltext

1
2
int m_WearID [8];
int SkillID; //Auswahl der Klasse

D.h. hat m_WearID 8 Elemente (0 bis 7).
Du schreibst aber mit

C-/C++-Quelltext

1
2
for (int i = 0; i < 9; i++)
   m_WearID[i] = EquipmentID[i];

9 Elemente (von 0 bis 8). Du überschreibst also an dieser Stelle vermutlich SkillID, das im Speicher genau hinter dem Array liegt.

Übrigens kannst du auch memcpy() o.ä. für das Kopieren des Arrays verwenden.

8

03.01.2013, 21:24

O_O
Ich hätte nicht gedacht, dass das Auswirkungen hat. :pinch:

Vielen, vielen Dank , das war der Fehler :D
Programmiersprache: C++
Fortschritt: Grundkenntnissse

Horni

Frischling

Beiträge: 21

Beruf: Student MB

  • Private Nachricht senden

9

03.01.2013, 22:12

Meinst du jetzt nur in diesem Fall oder Allgemein?

Mal abgesehen davon dass durch solche Fehler dein Programm abstürzen kann, kann es bei größeren Projekten schwer werden, solche Fehler überhaupt aufzudecken. Eventuell produzierst du damit sogar eine Endlosschleife. Außerdem ist Code mit Pufferüberlauf Hackeranfällig. Aber frag mich keine Details. Bei der Sache mit der Hackeranfälligkeit geb ich nur wider was ich gelesen hab :P

Also immer schön aufpassen mit Arrays ^^

MGBeginner

Frischling

Beiträge: 81

Wohnort: Limburg

  • Private Nachricht senden

10

04.01.2013, 01:24

Oder du vewendest gleich einen std::vector oder einen anderweitigen Container aus
der STL und durchläufst die Elemente mittels Iterator, der verhindert solche bösen Sachen! ;)

Habe auch bis vor einiger Zeit noch mit normalen Arrays herumgespielt und verwende
jetzt nur noch die STL-Container. Das ist ein Paradebeispiel, warum man heute
eigentlich keine normalen Arrays mehr verwenden sollte.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MGBeginner« (04.01.2013, 03:23)


Werbeanzeige