c - 访问冲突 : run through array from bmp image

标签 c

我有一个 bmp 图像,我将其转换为二维数组。那工作得很好。 但我需要将一个像素(坐标 (i,j))的颜色与其相邻像素(8 个像素)的颜色进行比较。 如果一个或多个具有相同的颜色,我会将它们与其他邻居进行比较,然后...... 所以我打算使用递归函数。

代码:

void verifIdPoint (int TG[NBLIG][NBCOL], int T[NBLIG][NBCOL], short int Tpassage[NBLIG][NBCOL], int i, int j)
{
int u, v;

//printf ("saisie: %d   %d \n", i, j);

//system("pause");

for (u=i-1; u<=i+1; u++)
{
    for(v=j-1; v<=j+1; v++)
    {
               
        if(u>0 || v>0 || u<NBLIG || v<NBCOL)
        {
            if (TG[u][v] == TG[i][j])
            {
                tableauImgIntermediaire (TG, T, i, j);
                //printf ("TG[%d][%d]===== TG[%d][%d]\n", u, v, i, j);
                
                if (u<=0 || v<=0 || u>=NBLIG || v>=NBCOL)
                {
                }
                else
                {
                    if (Tpassage[u][v] == 0)
                    {
                    
                       printf ("Passage: u v T   %d %d %d \n", u, v, Tpassage[u][v]);
                       Tpassage[u][v] = 1;
                       verifIdPoint (TG, T, Tpassage, u, v);
                    }
                }        
            } 
        }                
    }               
}
} 

此代码适用于仅部分颜色相同的图像(如中间的灰色圆圈)。 但是当颜色像一根从 (0,0) 到 (300,200) 的棍子时,我出现“访问冲突(段错误)”错误...

图像尺寸为 300x200。 我认为,那是因为我试图访问数组中未分配的部分。

最佳答案

你应该检查一下你的界限。

if(u>0 || v>0 || u<NBLIG || v<NBCOL)

对于 (0,0) 和 (NBLIG, NBCOL) 计算结果为真。 (和(-1,-1))

if( (u >= 0 && u < NBLIG) && (v >= 0 && v < NBCOL) )

可能更符合您正在寻找的内容。

您的第二次边界检查似乎是多余的,但如果您想保留它,则需要确保该值严格小于最大值。

关于c - 访问冲突 : run through array from bmp image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19390380/

相关文章:

java - 从 Java 存储中检索未知长度的字节数组

c - 在 linux c 中使用按键打破循环

c++ - Xcode 预处理器宏以包含系统样式 header

c - c程序中如何使用pcre库匹配url

c - C警告(clang编译器)“整数文字太大,无法用有符号整数表示”

c - 以毫秒和微秒精度测量 POSIX 中耗时的最佳方法是什么?

c - 使用指针的通用冒泡排序程序

c - 转到特定元素 C

c - GCC 4.5/Ubuntu 11.04 是自动线程代码吗?

c - 如何在 C 中抑制 "unused parameter"警告?