【问题标题】:Segmentation fault (core dumped) error, when use boundary fill algorithm in C分段错误(核心转储)错误,在 C 中使用边界填充算法时
【发布时间】:2020-09-02 13:04:21
【问题描述】:

当我使用边界填充算法(在 C 中)时,我遇到了分段错误(核心转储)错误。 你知道为什么它不起作用吗?

void boundaryFill(int x, int y, png_byte cr, png_byte cg, png_byte cb, png_byte cfr, png_byte cfg, png_byte cfb)
    {
        png_byte* row = row_pointers[y];
        png_byte* ptr = &(row[x*3]);
        if((ptr[0]!=cr || ptr[1]!=cg || ptr[2]!=cb) && (ptr[0]!=cfr || ptr[1]!=cfg || ptr[2]!=cfb))
        {
            writePixel(x, y, cfr, cfg, cfb);
            boundaryFill(x+1,y, cr, cg, cb, cfr, cfg, cfb);
            boundaryFill(x,y+1, cr, cg, cb, cfr, cfg, cfb);
            boundaryFill(x-1,y, cr, cg, cb, cfr, cfg, cfb);
            boundaryFill(x,y-1, cr, cg, cb, cfr, cfg, cfb);
        }
    }

【问题讨论】:

  • ??????小心前行,看看会发生什么?
  • 这不是一个完整的例子,变量名非常不透明。 row_pointers 来自哪里?
  • 这是一张 600x600 的 png 图片
  • 您永远不会检查您的xy 是否有效,即在图像边界内。所以row_pointers[y]ptr = &(row[x*3]) 中的任何一个都可能导致未定义的行为。
  • 编辑问题以提供minimal reproducible example

标签: c algorithm libpng


【解决方案1】:

好的,问题在于边界填充()调用的顺序。

    boundaryFill(x+1,y, cr, cg, cb, cfr, cfg, cfb);
    boundaryFill(x,y+1, cr, cg, cb, cfr, cfg, cfb);
    boundaryFill(x-1,y, cr, cg, cb, cfr, cfg, cfb);
    boundaryFill(x,y-1, cr, cg, cb, cfr, cfg, cfb);

这是错误的顺序。

    boundaryFill(x + 1, y, cr, cg, cb, cfr, cfg, cfb);
    boundaryFill(x - 1, y, cr, cg, cb, cfr, cfg, cfb);
    boundaryFill(x, y + 1, cr, cg, cb, cfr, cfg, cfb);
    boundaryFill(x, y - 1, cr, cg, cb, cfr, cfg, cfb);

这个 - 工作正常。

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2017-02-25
    • 2016-07-12
    • 2018-03-16
    相关资源
    最近更新 更多