2 Dim Array Call by Reference Problem



  • Hi Leute

    Ich versuche mich gerade an einer Sudoko Software (einfaches Konsolen Programm) um so ein bisschen in den C++ Syntax reinzukommen.

    Ich habe dabei ein 2 Dim Array definiert mit meinen Felder: int sudoko[9][9];

    So, nun habe ich eine Funktion generiert names:

    void sudoko_generieren(int sudoko[][9]);

    So die Funktion schaut so aus (Sinn der Funktion erstmal nicht so wichtig, geht ja um den Fehler):

    void sudoko_generieren(int sudoko[][9])
    {
    	int anzahl_anfangszahlen = 10;
    
    	int i,j;
    
    	for(j=0; j<2; j++)
    	{
    
    		for(i=0; i<9; i++)
    		{
    			int zufalls_x = zufallszahl();
    			int zufalls_y = zufallszahl();
    
    			sudoko[zufalls_x][zufalls_y] = i;
    
    			if (sudoko_zahlpruefen(sudoko, zufalls_x, zufalls_y, sudoko[zufalls_x][zufalls_y]) == false)
    			{
    				sudoko[zufalls_x][zufalls_y] = 0;
    			}			
    		}
    
    	}
    
    }
    

    Das PRoblem muss an der Schleife: for(j=0; j<2; j++) liegen. Wenn ich j<1 setze kommt der Fehelr nicht auf. Zwar kompliert mein gnu c++ Compiler alles korrekt, aber wenn ich das Programm starte zeigt er manchmal den Fehler: Bus-Zugriffsfehler oder manchmal Speicher-Zugriffsfehler und manchmal eben kein fehler.

    Woran kann das liegen? Hat C++ irgendwie ein Problem wenn ich in meinem Array öfters mal Werte an, bzw. überschreibe? Mir fällt absolut nichts ein und mein C++ buch habe ich leider verliehen.

    Vielen Dank für jede Hifle!

    Gruß Tobi



  • Übergeb mal das Array als Zeiger

    void sudoko_generieren(int(*)[9] sudoko)
              {
                      ...
              }
    


  • Also das Funktioniert mal garnicht. Ich erhalte viele Fehelrmeldungen:

    includes/sudoko_funktionen.h:4: error: variable or field ‘sudoko_generieren’ declared void
    includes/sudoko_funktionen.h:4: error: expected primary-expression before ‘int’
    includes/sudoko_funktionen.h:5: error: variable or field ‘sudoko_initialisieren’ declared void
    includes/sudoko_funktionen.h:5: error: expected primary-expression before ‘int’
    includes/sudoko_funktionen.h:51: error: variable or field ‘sudoko_generieren’ declared void
    includes/sudoko_funktionen.h:51: error: redefinition of ‘int sudoko_generieren’
    includes/sudoko_funktionen.h:4: error: ‘int sudoko_generieren’ previously defined here
    includes/sudoko_funktionen.h:51: error: expected primary-expression before ‘int’
    includes/sudoko_funktionen.h:78: error: variable or field ‘sudoko_initialisieren’ declared void
    includes/sudoko_funktionen.h:78: error: redefinition of ‘int sudoko_initialisieren’
    includes/sudoko_funktionen.h:5: error: ‘int sudoko_initialisieren’ previously defined here
    includes/sudoko_funktionen.h:78: error: expected primary-expression before ‘int’
    test.cpp: In function ‘int main()’:
    test.cpp:13: error: ‘sudoko_initialisieren’ cannot be used as a function
    test.cpp:27: error: ‘sudoko_generieren’ cannot be used as a function

    Quellcode schaut dann grad so aus:

    void sudoko_generieren(int(*)[9] sudoko)
    {
    	int anzahl_anfangszahlen = 10;
    
    	int i,j;
    
    	for(j=0; j<2; j++)
    	{
    
    		for(i=0; i<9; i++)
    		{
    			int zufalls_x = zufallszahl();
    			int zufalls_y = zufallszahl();
    
    			sudoko[zufalls_x][zufalls_y] = i;
    
    			if (sudoko_zahlpruefen(sudoko, zufalls_x, zufalls_y, sudoko[zufalls_x][zufalls_y]) == false)
    			{
    				sudoko[zufalls_x][zufalls_y] = 0;
    			}			
    		}
    
    	}
    
    }
    

    Am Anfang meiner Headerdatei steht:

    void sudoko_ausgabe(int sudoko[][9]);
    int sudoku_zahlauslesen(int sudoko[][9], int x, int y);
    void sudoko_generieren(int(*)[9] sudoko);
    void sudoko_initialisieren(int(*)[9] sudoko);
    bool sudoko_zahlpruefen(int sudoko[][9], int x, int y, int zahl);
    

    Da muss noch uirgendwas schief sein.

    Gruß Tobi



  • probier mal das

    void sudoko_generieren(int(*sudoko)[9]) 
        {
          ...
    


  • ttobsen schrieb:

    Bus-Zugriffsfehler

    was iss'n das für 'ne maschine bzw. betriebssystem?

    btw: die funktion 'zufallszahl()' darf nur werte im bereich 0...8 erzeugen.
    das musst du sicherstellen.



  • Die letzte Schreibweise war die Richtige,
    hab nen kleinen Test gemacht.

    void func(int(*sudoko)[9])
    {                    
           sudoko[0][2] = 5;
    }
    
    int main() 
    { 
        int sudoko[9][9] = {0,};
    
            func(sudoko);
    }
    


  • net schrieb:

    ttobsen schrieb:

    Bus-Zugriffsfehler

    was iss'n das für 'ne maschine bzw. betriebssystem?

    btw: die funktion 'zufallszahl()' darf nur werte im bereich 0...8 erzeugen.
    das musst du sicherstellen.

    Hi

    daran lag der Zugriffsfehler! Danke für den Tipp.

    Ist Suse Linux 10.1.

    freak11 schrieb:

    Die letzte Schreibweise war die Richtige,
    hab nen kleinen Test gemacht.

    void func(int(*sudoko)[9])
    {                    
           sudoko[0][2] = 5;
    }
    
    int main() 
    { 
        int sudoko[9][9] = {0,};
      
            func(sudoko);
    }
    

    Und mit dieser Schreibweise funktioniert die Übergabe! Vielen Dank an euch beide.

    Gruß Tobi


Anmelden zum Antworten