Funktion nach einem leeren Arrayspot suchen.



  • Hallo,
    im Zuge eine Lernaufgabe möchte ich einen SudokuSolver schreiben.
    Momentan schlage ich mich mit einer Funktion herum, sie gibt nicht wieder was ich von ihr erwarte.
    Wenn das Array einen Wert außerhalb von 1 bis 9 (als character) hat, soll die Funktion wiedergeben, dass die "Zelle" nicht ausgefüllt ist. Hier sind meine Codes (Funktion, Magicnumber (header), meine Testfunktion).

    Funktion

    int isFull(sudokuGrid test){
        index i = 0;
        cell filled = TRUE;
        while ((i < GRID_SIZE) || (filled == TRUE)){
            if ((test[i] > MAX_VALUE) ||(test[i] < MIN_VALUE)){
                filled = FALSE;
            }
            i++;
        }
        return filled;
    }
    

    MagicNumbers

    #ifndef MAGICNUMBERS_H
    #define MAGICNUMBERS_H
    
    #define MIN_VALUE '1'
    #define MAX_VALUE '9'
    #define EMPTY '.'
    #define NUM_VALUES (MAX_VALUE-MIN_VALUE-1)
    #define GRID_SIZE 5
    //(MAX_VALUE*MAX_VALUE)
    #define MAX_CELL (GRID_SIZE-1)
    #define TRUE 1
    #define FALSE 0
    
    typedef int index;
    typedef int cell;
    typedef char value;
    typedef char sudokuGrid[GRID_SIZE];
    
    #endif
    

    Testfunktion

    void testIsFull (void){
        sudokuGrid testFull = {'2','2','2','2','2'};
        sudokuGrid notFull = {'.','0','0','0','0'};
        assert(isFull(testFull) == TRUE);
        assert(isFull(notFull) == FALSE);
        printf ("test isFull passed!\n");
    
        }
    

    Grüße 🙂



  • Deine "Optimierungs"maßnahme "|| (filled == TRUE)" ist der Griff ins Klo.
    Solche typedefs solltest du dir auch abgewöhnen.



  • Wutz schrieb:

    Deine "Optimierungs"maßnahme "|| (filled == TRUE)" ist der Griff ins Klo.
    Solche typedefs solltest du dir auch abgewöhnen.

    Der Knoten ist leider immernoch im Kopf 😕

    Also meine while Schleife besagt doch,

    Solange i weniger als GRID_SIZE ist ODER solange filled TRUE (also 1) ist soll die Schleife weiter laufen. Das verstehe ich doch so richtig oder?

    Wäre es besser zu sagen "!filled"?



  • C_Newbe schrieb:

    Also meine while Schleife besagt doch,

    Solange i weniger als GRID_SIZE ist ODER solange filled TRUE (also 1) ist soll die Schleife weiter laufen. Das verstehe ich doch so richtig oder?

    Jo. Die Schleife läuft also auch weiter, wenn i > GRID_SIZE ist, solange filled noch den Wert TRUE hat ...
    Es sollte vllt. && filled statt || filled heißen ...



  • Belli schrieb:

    C_Newbe schrieb:

    Also meine while Schleife besagt doch,

    Solange i weniger als GRID_SIZE ist ODER solange filled TRUE (also 1) ist soll die Schleife weiter laufen. Das verstehe ich doch so richtig oder?

    Jo. Die Schleife läuft also auch weiter, wenn i > GRID_SIZE ist, solange filled noch den Wert TRUE hat ...
    Es sollte vllt. && filled statt || filled heißen ...

    Okay, ich habe es geändert und es funktioniert.

    Ach jetzt habe ich meinen Denkfehler verstanden. Also sobald eines der beiden Bedingungen nicht mehr zutrifft greift es bei &&, wenn ich dann jedoch || müssen also beide Bedingungen greifen, Ich hatte es im Kopf andersherum gedacht.



  • Du hattest es doch schon prosaisch korrekt formuliert:

    Laufe, solange ... ODER ...
    Das war auch Deine ursprüngliche Schleife. Das willst Du aber gar nicht.

    Was Du möchtest ist:

    Brich ab, wenn eine der beiden Bedingungen nicht mehr erfüllt ist, also:

    Laufe, solange ... UND ...



  • Belli schrieb:

    Du hattest es doch schon prosaisch korrekt formuliert:

    Laufe, solange ... ODER ...
    Das war auch Deine ursprüngliche Schleife. Das willst Du aber gar nicht.

    Was Du möchtest ist:

    Brich ab, wenn eine der beiden Bedingungen nicht mehr erfüllt ist, also:

    Laufe, solange ... UND ...

    Genau, ich habe das Arbeiten mit der Schleife Seitenverkehrt angewandt.
    Darauf muss ich in Zukunft besser achten. Auf jeden Fall konnte ich durch eure Hilfe das Problem identifizieren und verstehen.

    Danke 🙂


Anmelden zum Antworten