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

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

1

17.11.2013, 23:01

Ganz leicht erklärlicher Fehler in C++ [solved]

Nabend,

Ich führe folgenden code aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void AMap::Init(Map &map)
{
    //Aussenrum alles blocken
    for(int i = 0; i < GetWidth();i++)
    {
        atiles[i][0] = ATile(blocked);
        atiles[i][GetHeight()] = ATile(blocked);
    }
    for(int i = 0; i < GetHeight();i++)
    {
        atiles[0][i] = ATile(blocked);
        atiles[GetWidth()][i] = ATile(blocked);
    }
    //normale Map in AStar Map übertragen
    for(int x = 0; x < GetWidth();x++)
    {
        for(int y  = 0; y < GetHeight();y++)
        {
            atiles[x+1][y+1] = ATile(map.tiles[x][y].GetProperty());
        }
    }
}


Der Konstruktor der für die ATiles aufgerufen wird.

C-/C++-Quelltext

1
2
3
4
5
ATile::ATile(TileProperty p)
{
    prop = p;
    list = No;
}


Diese Funktion erstellt eine Map für den A*. Dafür wird die normale Map (Map &map) benutzt. Diese wird nur zum Auslesen benutzt, damit in der Pathfinding Map nicht begehbare Tiles verzeichnet sind usw.

Nun ist das problem, dass nach dem letzten Durchlauf der ersten Schleife die Variable "Nullpunkt" und nach dem letzten Durchlauf der zweiten Schleife das Tile[0][0] verändert werden.

Das Bild "Debug" zeigt diese Veränderungen nochmal im Debuggen.

Das Bild "error" zeigt die Fehlermeldung, die dann später dadurch ausgeworfen wird. (Bei späterem Zugriff auf die Tiles)


Nun ist einfach das Problem, dass ich diese Variablen niemals verändern möchte und eigentlich auch nie verändere, aber sie werden geändert und ich weiss nicht wieso.

Ich hoffe mir kann da Jemand weiterhelfen.
»ERROR« hat folgende Bilder angehängt:
  • Debug.png
  • error.PNG

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ERROR« (17.11.2013, 23:37)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

17.11.2013, 23:12

C-/C++-Quelltext

1
2
atiles[i][GetHeight()] = ATile(blocked);
atiles[GetWidth()][i] = ATile(blocked);


Da sind deine Fehler.
Mehr sage ich nicht (und ich bitte auch sonst niemanden dies zu tun, sonst geht der Lerneffekt verloren).

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

3

17.11.2013, 23:19

Also ehrlich gesagt erkenne ich da jetzt keinen Fehler.

Der Sinn dieser beiden Schleifen ist es ja, Alle äusseren Tiles als unbegehbar (blocked) zu markieren.

Da ist doch nirgendwo ein zugriff auf das Übergebene Objekt &map oder bin ich grade total blind?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

17.11.2013, 23:26

Zitat von »"ERROR"«

Also ehrlich gesagt erkenne ich da jetzt keinen Fehler.

Ein Array[N] geht von 0 bis ...?

Zitat von »"ERROR"«

Da ist doch nirgendwo ein zugriff auf das Übergebene Objekt &map oder bin ich grade total blind?

Nicht direkt. Aber im Speicher liegt das alles hintereinander. Wenn du also auf eine Variable über die Grenzen hinaus zugreifst, kommst du plötzlich in die im Speicher benachbarte Variable hinein.

Genug Hinweise?

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

5

17.11.2013, 23:32

Och ne oder?!

Zitat

Ein Array[N] geht von 0 bis ...?


N-1 natürlich. :dash: :dash: Dumme Anfänger Fehler :fie:


Zitat

Aber im Speicher liegt das alles hintereinander

Also das ist ja echt dumm von mir gewesen :D
Ich muss ja ehrlich sein und sagen ich sass da grade über 60 Minuten dran und habe das übersehen :(

Danke dir David :) Jetzt kann ich beruhigt schlafen

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

17.11.2013, 23:37

Happens...ich hab mir an einem ähnlich simplen Fehler mal ein Jahr lang die Zähne ausgebissen...dafür wirst du es nun garantiert nie wieder falsch machen... ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

17.11.2013, 23:38

Echt, sowas passiert dem Großmeister dot?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

17.11.2013, 23:38

Ich war auch mal Anfänger... ;)

Werbeanzeige