我正在编写一个函数,返回第一个定位的像素的地址和指定的颜色。现在我正在测试检测。目前在50x50 bmp上。考虑到本规范:
dword bmp_find_xy (dword xp, dword yp)
{
dword w = 50;
word bpx = (3*8);
dword offset = (2+sizeof(BMP)+sizeof(DIB));
dword row = (((bpx * w) * 4) / 32);
dword pixAddress = (offset) + row * yp + ((xp * bpx) / 8);
return pixAddress;
}
dword bmp_dfind_c (char *FILE_NAME, BYTE R, BYTE G, BYTE B)
{
dword w = 50;
dword h = 50;
dword size;
int W, H, i;
FILE* fp = fopen("sample.bmp", "r+b");
BYTE* bmp;
fseek(fp, 0L, SEEK_END);
size = ftell(fp);
bmp = malloc(size+48); // note this line
rewind(fp);
for(i=0; i<size; i++)
bmp[i] = fgetc(fp);
fseek(fp, 54, SEEK_SET);
for(H = h; H >=1; H--)
{
for(W = 0; W < w; W++)
{
if(bmp[bmp_find_xy(FILE_NAME, W, H)] == 255)
printf("There is a pix with maxed value");
}
}
fclose(fp);
return 1;
}
所以。。因为我使用的是古老的编译器,没有任何优化。。如果不将至少+48设置为大小,则接收缓冲区溢出错误。为什么是48岁?如果我只放
malloc(size)
的话,为什么会溢出,这对我来说毫无意义。 最佳答案
如果我质疑你的H-减量逻辑,请原谅。假设您的H
和W
是基于零的(它们应该是),我相信:
for(H = h; H >=1; H--)
最好是这样:
H = h;
while (H--)
如果这真的是向后枚举器
H-1
到0
的意图。(我认为应该如此)。我和我都很确定你能正确分配缓冲区。如前所述,期望是您正在第H
行中搜索以开始循环,而这样的行不在缓冲区中。如果for循环是必需的,那么它实际上涉及更多的工作。像这样看似无辜的东西:
for(H=(h-1); H>=0; --H)
不会作为一个通用机制工作。当
h
和unsigned type开始时会发生什么?。表达式0
将引入下溢。哎哟。当然,你可以通过这样的方式来“修复”:if (h)
{
for(H=(h-1); H>=0; --H)
....
}
但这只不过是在一个原本不好的主意上添油加醋。
以下方法可行,但imho不太清楚:
for (H=h; H--;)
这完成了与while循环相同的逻辑,代价是混淆。它给表带来的唯一(也是唯一)东西是本地var声明,这可能会有帮助:
for (dword var=h; var--;)
有很多方法可以做到这一点,但只有少数。我发现第一个在你的背景下是最清晰的。祝你好运。
关于c - 查找特定颜色的首次出现-奇怪的分配行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25223846/