Floodfill 算法 C - return 双数组?
Floodfill algorithm C - return double array?
给定一个双精度数组 mod 5 和一个值 X 以及数组中的一个位置,我必须将位置的值及其所有邻居更改为 X。
我正在递归地做。我认为这个想法是正确的,但是我必须弄乱 return 语句和使用递归调用的赋值。
编译时我得到
注意:预期 'int **' 但参数类型为 'int (*)[8]'
此外,如果我在 main 中使用该函数,我会得到
警告:从不兼容的指针类型传递 'floodfill' 的参数 1
table = floodfill( table, i, j, r );
错误:赋值给数组类型的表达式
table = floodfill( table, i, j, r );
其中 table 是必须执行算法的 table
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;
}
显然,为了简洁起见,代码不完整(没有 malloc,没有检查越界位置,只填充正确的值),但是对于我的问题,应该有一切。
首先,C 指针指向您可以就地操作的缓冲区。它们不会按值传递整个缓冲区。返回一个 int ** 是没有意义的,调用者已经有了信息。
其次,你想用一个新值填充一个值u,v。你可能是你第一次调用的像素值,在这种情况下第一次调用是特殊的。更容易传入 - 因此函数将所有值 u 和邻居转换为值 v。如果 tab[i][j] 的值不是 u,return。否则在所有四个方向上进行填充。它在堆栈上有点重,但应该可以工作
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);
}
}
给定一个双精度数组 mod 5 和一个值 X 以及数组中的一个位置,我必须将位置的值及其所有邻居更改为 X。 我正在递归地做。我认为这个想法是正确的,但是我必须弄乱 return 语句和使用递归调用的赋值。 编译时我得到 注意:预期 'int **' 但参数类型为 'int (*)[8]'
此外,如果我在 main 中使用该函数,我会得到 警告:从不兼容的指针类型传递 'floodfill' 的参数 1 table = floodfill( table, i, j, r );
错误:赋值给数组类型的表达式 table = floodfill( table, i, j, r );
其中 table 是必须执行算法的 table
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;
}
显然,为了简洁起见,代码不完整(没有 malloc,没有检查越界位置,只填充正确的值),但是对于我的问题,应该有一切。
首先,C 指针指向您可以就地操作的缓冲区。它们不会按值传递整个缓冲区。返回一个 int ** 是没有意义的,调用者已经有了信息。
其次,你想用一个新值填充一个值u,v。你可能是你第一次调用的像素值,在这种情况下第一次调用是特殊的。更容易传入 - 因此函数将所有值 u 和邻居转换为值 v。如果 tab[i][j] 的值不是 u,return。否则在所有四个方向上进行填充。它在堆栈上有点重,但应该可以工作
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);
}
}