C++ 线程1:EXC#U BAD#U访问(代码=1)错误c++;项目

C++ 线程1:EXC#U BAD#U访问(代码=1)错误c++;项目,c++,xcode,bmp,C++,Xcode,Bmp,我是编程新手。所以我不知道如何正确使用调试工具。Xcode告诉我“线程1:EXC\u坏访问(代码=1,地址=0xffefbf3804)”。如果您能帮我解决这个问题并修复这个bug,我将不胜感激。程序必须读取文件.bmp,然后我要计算像素亮度值,并将它们放入数组[][],然后使用它们 int main() { char* filename = (char*)("/…/second.bmp"); FILE* f = fopen(filename, "rb&q

我是编程新手。所以我不知道如何正确使用调试工具。Xcode告诉我“线程1:EXC\u坏访问(代码=1,地址=0xffefbf3804)”。如果您能帮我解决这个问题并修复这个bug,我将不胜感激。程序必须读取文件.bmp,然后我要计算像素亮度值,并将它们放入数组[][],然后使用它们

int main()
{
char* filename = (char*)("/…/second.bmp");      
FILE* f = fopen(filename, "rb");
char info[54];
fread(info, sizeof(char), 54, f);
int width = *(int*)&info[18];
int height = *(int*)&info[22];

cout << "  Name: " << filename << endl;
cout << " Width: " << width << endl;
cout << "Height: " << height << endl;
cout << endl;

int row_padded = (width * 3 + 3) & (~3);
unsigned char* data = new unsigned char[row_padded];
int array_bmp[height][width];
int arr_bmp[height][width];

for(int i = 0; i < height; i++)
{
    fread(data, sizeof(char), row_padded, f);
    for(int j = 0; j < width*3; j += 3)
    {      
//    Y = 0.3 * R + 0.59 * G + 0.11 * B - яркость пикселя
//           ============================
        array_bmp[i][j] = 0.3 * (int)data[j+2] + 0.59 * (int)data[j+1] + 0.11 *  (int)data[j]; // error message here
//            ==========================
        }
}
delete[] data;
fclose(f);


return 0;
}
intmain()
{
char*filename=(char*)(“/…/second.bmp”);
FILE*f=fopen(文件名为“rb”);
字符信息[54];
fread(信息,尺寸(字符),54,f);
整数宽度=*(整数*)和信息[18];
整数高度=*(整数*)和信息[22];

cout
array\u bmp[i][j]
将超出范围,因为它的列只有
width
元素,而
j
将围绕
width*3
。它应该是
array\u bmp[i][j/3]

这里有很多令人担忧的问题,其中许多问题源于几乎病态的“每个人加狗”模式。不要这样做。停止这样做。你正在丢弃重要的类型信息。
const char*filename=“…”
是正确的版本。丢弃
常量是一个巨大的问题。
int-width=*(int*)&info[18]
未定义的行为。如果您的CPU是在21世纪制造的,那么当您试图访问未对齐的
int
时,它会告诉您迷失方向。您需要使用适当的工具来重铸这些行为。您不能只是将值强制转换为您期望的形式。
“因此我不知道如何正确使用调试工具”
--我强烈建议您阅读以下内容:您可能还想阅读以下内容:。当我看到类似
(char*)的C样式转换时,我的一般经验法则
重新解释\u cast
是为了更仔细地查找bug。我的第一步通常是删除该cast并重新构建,以查看编译器为我提供了哪些有用的诊断。编译器是你的朋友,它给出的错误和警告是爱的象征。它们是编译器告诉你,它不希望你在修复sim卡时浪费生命多个逻辑错误。
int array_bmp[height][width];int arr_bmp[height][width]C++中的数组必须是C++的,数组必须用编译时常数表示,而不是运行时变量。即使是有效的,如果高度> /COD>和/或<代码>宽度> /COD>是大值,也会耗尽栈内存。相反,使用<代码> STD::向量数组AbBMP(高度,STD::向量(宽度));auto arr_bmp=array_bmp;
,然后在满足要求时,将其更改为使用一维
std::vector arr_bmp(高度*宽度)
,并计算行/列位置。