2017-05-20 7 views
0

ランダムな値mod 5と値Xと配列内の位置の二重配列が与えられているので、位置の値とその近傍をすべてXに変更する必要があります。 私は再帰的にやっています。私は考えが正しいと思うが、私はreturnステートメントと再帰呼び出しを使った代入を混乱させる必要がある。 とき、私は ノートを取得するコンパイル:期待される「int型**」が、引数の型は「int型(*)[8]」であるにもFloodfillアルゴリズムC - 二重配列を返しますか?

私がメインで関数を使用している場合、私は 警告を得る:渡す引数を1互換性のないポインタ型からの 'floodfill'の使用 table = floodfill(table、i、j、r);

エラー:配列型の式への代入 table = floodfill(table、i、j、r);表はアルゴリズムが

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; 
} 

明らかにコードがため(NOのmalloc、外の結合位置と右の値のみFLOODFILLためのチェックなし)不完全で実行されなければならないの表である

簡潔さのために、私の問題に関係するものはすべてあるはずです。

+1

あなたの質問が何ですか?それははっきりしない。 – Carcigenicate

+0

'table'はどのように宣言されていますか? 2次元配列とTへのポインタへのポインタを混同していますか?警告はそうであることを示しています。 http://stackoverflow.com/questions/7586702/is-2d-array-a-double-pointer –

答えて

1

第1に、Cのポインタは、あなたが適切に操作できるバッファを指しています。バッファ全体を値渡ししません。 int **を返すのは無意味です。呼び出し元はすでに情報を持っています。

第2に、値uに新しい値をfloodfillしたい場合は、v。uは最初に呼び出すピクセル値である場合があります。その場合は、最初の呼び出しは特殊です。それを渡すのが簡単なので、関数はすべての値uと近傍を値vに変換します。tab [i] [j]の値がuでない場合は、戻ります。そうでなければ、4つの方向すべてでフラッドフィルする。それはスタック上で少し重いですが、動作する必要があります

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); 
    } 
} 
関連する問題