Speicherzugriffsfehler ?!



  • Hallo, wenn ich das code ausführe, dann funksionert diese Code nur für gleiche Start und Ziel werte. Für alle andere bekomme ich die Meldung: "Speicherzugriffsfehler"

    Kann mir bitte jemand sagen für liegt da Fehler?
    danke

    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    char labyrinth[50][50];
    
    void lesen()
    {
        FILE *pf;
        int zeile, spalte;
        char c;
    
        pf = fopen( "laby.txt", "r");
        for( zeile = 0, spalte = 0;;)
        {
            c = fgetc( pf );
            if( feof( pf) )
            {
                labyrinth[zeile][spalte] = 0;
                break;
            }
            labyrinth[zeile][spalte] = c;
            spalte++;
            if( c == '\n' )
            {
                zeile++;
                spalte = 0;
            }
        }
        fclose ( pf );
    }
    
    void ausgabe()
    {
        int zeile, spalte;
        char c;
    
        for( zeile = 0, spalte = 0; c = labyrinth[zeile][spalte];)
        {
            printf("%c", c);
            spalte++;
            if( c == '\n')
            {
                zeile++;
                spalte = 0;
            }
        }
    }
    
    int weg( int start_z, int start_s, int ziel_z, int ziel_s)
    {
        if ( (start_z == ziel_z) && ( start_s == ziel_s))
        {
            labyrinth[start_z][start_s] = '+';
            return 1;
        }
    
        if( labyrinth[start_z-1] [start_s] = ' ')
        {
            labyrinth[start_z][start_s] = '^';
            if(weg(start_z-1, start_s, ziel_z, ziel_s))
            return 1;
        }
    
         if( labyrinth[start_z+1] [start_s] = ' ')
        {
            labyrinth[start_z][start_s] = 'v';
            if(weg(start_z+1, start_s, ziel_z, ziel_s))
            return 1;
        }
    
     if( labyrinth[start_z] [start_s-1] = ' ')
        {
            labyrinth[start_z][start_s] = '<';
            if(weg(start_z, start_s-1, ziel_z, ziel_s))
            return 1;
        }
    
         if( labyrinth[start_z] [start_s+1] = ' ')
        {
            labyrinth[start_z][start_s] = '>';
            if(weg(start_z, start_s+1, ziel_z, ziel_s))
            return 1;
        }
    
        labyrinth[start_z] [start_s] = ' ';
        return 0;
    }
    
    int main()
    {
      int start_z, start_s, ziel_z, ziel_s;
    
      lesen();
    
      ausgabe();
    
      printf( "\nStart (Zeile Spalte): ");
      scanf( "%d %d", &start_z, &start_s);
      printf( "Ziel ( Zeile Spalte): ");
      scanf( "%d %d", &ziel_z, &ziel_s);
      printf( "\n");
    
       if(weg(start_z, start_s, ziel_z, ziel_s))
        ausgabe();
       else
        printf( "Keine Lösung!\n");
    }
    


  • - Mit hoher Wahrscheinlichkeit daran, dass du die Array-Indexgrenzen nicht einhältst.
    - std::vector oder boost::array verwenden und dort ne Indexprüfung einbauen
    - printf ist böse und lame 😉



  • 1. Zum Vergleichen der Zeichen willst du wahrscheinlich == anstatt = benutzen.
    2. Benutze dynamische Arrays, wie zum Beispiel std::vector oder halt char **;
    3. Nachdem du labyrinth zu einem dynamischen Array gemacht hast, sagt dir valgrind, wo du Arraygrenzen nicht einhälst.



  • Ponto schrieb:

    1. Zum Vergleichen der Zeichen willst du wahrscheinlich == anstatt = benutzen.

    😃 Ja, das habe ich vergessen. DANKE . Jetzt funsksionert OK.


Anmelden zum Antworten