2017-05-20 5 views
0

Gegeben ein Doppel-Array von Zufallswerten mod 5 und ein Wert X und eine Position im Array, ich muss den Wert der Position und alle seine Nachbarn zu X ändern. Ich mache es rekursiv. Ich denke, die Idee ist richtig, allerdings muss ich mich mit der Return-Anweisung und der Zuweisung durch den rekursiven Aufruf beschäftigen. Beim Kompilieren ich Note bekommen: erwartet 'int **', sondern Argument ist vom Typ 'int (*) [8]'Floodfill-Algorithmus C - Double Array zurückgeben?

auch, wenn ich die Funktion im Haupt verwende ich Warnung: Übergabe des Argument 1 von 'floodfill' vom inkompatiblen Zeigertyp table = floodfill (Tabelle, i, j, r);

Fehler: Zuordnung zu Ausdruck mit Array-Typ Tabelle = floodfill (Tabelle, i, j, r);

wo Tabelle ist der Tisch, auf dem der Algorithmus ausgeführt werden muss

int ** floodfill (int **tab, int i, int j, int v) 
{ 
    /*if statement to make the values to the right of the specified position 
    equal to the specified value*/ 
    if (tab[i][j+1] == tab[i][j]) 
    { 
     /*the assignment is recursive*/ 
     tab = floodfill (tab, i, j+1, v); 
    } 
    /*this assignment is executed after each of the values to the 
    right of tab[i][j] are changed to v*/ 
    tab[i][j] = v; 

    /*returns the tab with the specified position changed*/ 
    return tab; 
} 

Offensichtlich ist der Code ist unvollständig (keine malloc, keine Prüfung für out-of-gebundenen Position und nur Floodfill der richtigen Werte) für der Kürze halber, aber für das, was mein Problem betrifft, sollte es alles geben.

+1

Was ist Ihre Frage? Das ist nicht klar. – Carcigenicate

+0

Wie wird 'Tabelle' deklariert? Verwechseln Sie ein 2D-Array und einen Zeiger auf den Zeiger auf T? Die Warnung weist darauf hin, dass dies der Fall ist. Lesen Sie http://stackoverflow.com/questions/7586702/is-2d-array-a-double-pointer –

Antwort

1

Zuerst zeigen C Zeiger auf Puffer, die Sie an Ort und Stelle manipulieren können. Sie übergeben keine ganzen Puffer nach Wert. Die Rückgabe eines int ** ist sinnlos, der Anrufer hat bereits die Information.

Zweitens möchten Sie einen Wert u mit einem neuen Wert füllen, v. U könnte der Pixelwert sein, den Sie zuerst aufrufen, in diesem Fall ist der erste Aufruf speziell. Einfacher, um es zu übergeben - so wandelt die Funktion alle Werte u und Nachbarn in Wert v um. Wenn der Wert in tab [i] [j] nicht u lautet, kehren Sie zurück. Ansonsten fluten Sie in alle vier Richtungen. Es ist ein bisschen schwer auf dem Stapel, aber sollte funktionieren

void floodfill(int **tab, int u, int v, int i int j) 
{ 
    if(tab[i][j] == u) 
    { 
     tab[i][j[ = v; 
     floodfill(tab, u, v, i+1, ,j); 
     floodfill(tab, u, v, i-1, j); 
     floodfill(tab, u, v, i, j -1); 
     floodfill(tab, u, v, i, j +1); 
    } 
}