【问题标题】:Segmentation error trying to implement flood fill尝试实现洪水填充的分段错误
【发布时间】:2023-03-18 12:41:01
【问题描述】:

我正在尝试为二维字符数组实现洪水填充算法。

问题是当我尝试运行它时出现分段错误。 我尝试了多种方法,但我无法弄清楚问题所在。

我正在尝试使用此输入:http://pastebin.com/raw/puexQfXY

错误截图:https://gyazo.com/b7e738d1d4f09a5d71a020b34a1e3b6c

#include <stdio.h>
#include <stdlib.h>

void floodFill(int width, int height, char grid[width][height], char replacement, char target, int x, int y)
{
    if(x < 0 || x >= width || y < 0 || y >= height)
    {//check if out of array
        return;
    }
    if(grid[x][y] != target)
    {//check if on other than the target
        return;
    }
    grid[x][y] = replacement; //replace
    floodFill(grid, width, height, replacement, target, x + 1, y);//right
    floodFill(grid, width, height, replacement, target, x, y + 1);//down
    floodFill(grid, width, height, replacement, target, x - 1, y);//left
    floodFill(grid, width, height, replacement, target, x, y - 1);//up

}

int main()
{
    int width, height;
    scanf("%d", &width);
    scanf("%d", &height);
    char grid[width][height];
    for(int y = 0; y < height; y++)
    {
        getchar();//absorb newline
        for(int x = 0; x < width; x++)
        {
            grid[x][y] = getchar();
        }
    }

    floodFill(width, height, grid, 'O', '.', 2, 1);
    for(int y = 0; y < height; y++)
    {//print array
        for(int x = 0; x < width; x++)
        {
            putchar(grid[x][y]);
        }
        putchar('\n');
    }
}

【问题讨论】:

  • 你的编译器甚至不应该编译它。嗯,试过了,它编译时有 8 个警告。如果您没有看到警告,请使用-Wall(用于 gcc、clang)或/W4(用于 microsoft)重试。
  • 旁白:要么将getchar 向下移动几行以进入循环内部,要么将其转储并使用scanf(" %c", &amp;grid[x][y]);(注意占用前导空格的空间)。
  • 这样做的原因是什么?没有办公室,我只是不明白为什么要这样做,因为它现在有效

标签: c arrays function multidimensional-array flood-fill


【解决方案1】:

你犯的错误是在函数本身内部调用函数。 只需看一下参数并尝试将它们与函数的原型匹配

你的代码

floodFill(grid, width, height, replacement, target, x + 1, y);//right
floodFill(grid, width, height, replacement, target, x, y + 1);//down
floodFill(grid, width, height, replacement, target, x - 1, y);//left
floodFill(grid, width, height, replacement, target, x, y - 1);//up

应该是

floodFill( width, height,grid, replacement, target, x + 1, y);//right
floodFill( width, height,grid, replacement, target, x, y + 1);//down
floodFill( width, height,grid, replacement, target, x - 1, y);//left
floodFill( width, height,grid, replacement, target, x, y - 1);//u

【讨论】:

  • TYSM,我在我的程序中的其他事情上挖了这么多隧道,却没有意识到这个明显的错误。当其他人查看代码时,它很有帮助
猜你喜欢
  • 2018-08-19
  • 2020-10-11
  • 2019-02-26
  • 2013-01-16
  • 2019-08-22
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多