C 发现特定颜色的首次出现-奇怪的分配行为
我正在编写一个函数,返回第一个指定颜色像素的地址。现在我正在测试检测。目前在50x50 bmp上。考虑到这一准则:C 发现特定颜色的首次出现-奇怪的分配行为,c,memory-management,allocation,bmp,alloc,C,Memory Management,Allocation,Bmp,Alloc,我正在编写一个函数,返回第一个指定颜色像素的地址。现在我正在测试检测。目前在50x50 bmp上。考虑到这一准则: dword bmp_find_xy (dword xp, dword yp) { dword w =
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;
}
dword bmp\u find\u xy(dword xp,dword yp)
{
德沃德w=50;
单词bpx=(3*8);
dword偏移量=(2+sizeof(BMP)+sizeof(DIB));
dword行=((bpx*w)*4)/32);
dword pixAddress=(偏移量)+行*yp+((xp*bpx)/8);
返回pixAddress;
}
dword bmp\u dfind\u c(字符*文件名,字节R,字节G,字节B)
{
德沃德w=50;
德沃德h=50;
德沃德尺寸;
int W,H,i;
文件*fp=fopen(“sample.bmp”,“r+b”);
字节*bmp;
fseek(fp,0L,SEEK_END);
尺寸=ftell(fp);
bmp=malloc(大小+48);//注意这行
倒带(fp);
对于(i=0;i=1;H--)
{
对于(W=0;W
所以。。因为我使用的是古老的编译器,所以没有优化。。如果我没有将至少+48设置为大小,我将收到缓冲区溢出错误。为什么是48?如果我只放了
malloc(size)
,它为什么会溢出,这对我来说毫无意义。如果我对您的H减量逻辑有疑问,请原谅。假设你的H
和W
是零基的(它们应该是零基的),我相信:
for(H = h; H >=1; H--)
这样做会更好:
H = h;
while (H--)
如果这确实是向后枚举器H-1
向下到0
的意图。(我认为应该如此)。修正这个问题,我确信你可以正确分配你的缓冲区。如前所述,期望是您正在H
th行中搜索以启动循环,而这样的行不在您的缓冲区中
如果for循环是强制性的,那么它实际上需要更多的工作。像这样看似无辜的事情:
for(H=(h-1); H>=0; --H)
无法作为通用机制运行。当h
和无符号类型以0
开头时会发生什么情况?。表达式(h-1)
将引入下溢。哎哟当然,您可以通过执行以下操作来“修复”此问题:
if (h)
{
for(H=(h-1); H>=0; --H)
....
}
但这只是在原本是个坏主意的基础上增加了更多的漏洞
以下内容将起作用,但imho不太清楚:
for (H=h; H--;)
这实现了与while循环相同的逻辑,但代价是混淆。它给表带来的一件(也是唯一一件)事情是本地var声明,这可能会很有帮助:
for (dword var=h; var--;)
有很多方法可以做到这一点,这些只是少数。我发现第一个在你的上下文中是最清楚的。祝你好运。如果我对你的H减量逻辑有疑问,请原谅。假设你的
H
和W
是零基的(它们应该是零基的),我相信:
for(H = h; H >=1; H--)
这样做会更好:
H = h;
while (H--)
如果这确实是向后枚举器H-1
向下到0
的意图。(我认为应该如此)。修正这个问题,我确信你可以正确分配你的缓冲区。如前所述,期望是您正在H
th行中搜索以启动循环,而这样的行不在您的缓冲区中
如果for循环是强制性的,那么它实际上需要更多的工作。像这样看似无辜的事情:
for(H=(h-1); H>=0; --H)
无法作为通用机制运行。当h
和无符号类型以0
开头时会发生什么情况?。表达式(h-1)
将引入下溢。哎哟当然,您可以通过执行以下操作来“修复”此问题:
if (h)
{
for(H=(h-1); H>=0; --H)
....
}
但这只是在原本是个坏主意的基础上增加了更多的漏洞
以下内容将起作用,但imho不太清楚:
for (H=h; H--;)
这实现了与while循环相同的逻辑,但代价是混淆。它给表带来的一件(也是唯一一件)事情是本地var声明,这可能会很有帮助:
for (dword var=h; var--;)
有很多方法可以做到这一点,这些只是少数。我发现第一个在你的上下文中是最清楚的。祝您好运。您的
H
循环出错。如果图像高100像素,则循环从101到1,而不是从99到0。因此,bmp_find_xy计算的索引错误
尝试将循环替换为:
H = h;
while (h-- > 0) {
这种模式有时被戏称为“goes to操作符”。将循环中的无符号变量递减为零是一种安全的方法。您的
H
循环是错误的。如果图像高100像素,则循环从101到1,而不是从99到0。因此,bmp_find_xy计算的索引错误
尝试将循环替换为:
H = h;
while (h-- > 0) {
这种模式有时被戏称为“goes to操作符”。将循环中的无符号变量递减为零是一种安全的方法。大小的实际值是多少?可能是
-1
。大小的实际值是7654
。图像的大小实际上是7654字节。不,当然不是-1
为什么会是-1
?如果那是真的。。分配的47个字节必须足够。dword@FiddlingBits的类型是什么dword
类型是无符号长的ftell
错误时返回-1
。大小的实际值是多少?可能是-1
。大小的实际值是7654
。图像的大小实际上是7654字节。不,当然不是-1
为什么会是-1
?如果那是真的。。分配的47个字节足够了。dword
@FiddlingBits的类型是什么dword
类型是无符号长的ftell
返回-1
错误。@Edenia很乐意提供帮助。这是为数不多的几个可以使用后减量/增量的地方之一