gpt4 book ai didi

c++ - 图像写入功能未执行

转载 作者:行者123 更新时间:2023-11-30 04:04:27 25 4
gpt4 key购买 nike

我有一个函数在我的驱动程序中被调用时没有执行。我通过 printf 语句逐行调试它,但无论我将它们放在我的函数中的什么位置,我都无法让它们出现。该函数未产生预期结果 - 写入图像文件。

void WriteImage(char *filename, Image &img)
{
printf("writing\n");
FILE *f = fopen(filename, "wb");

if (f == NULL)
{
fprintf(stderr, "Can't open file %s to write.\n", filename);
return;
}

fprintf(f, "P6\n");
fprintf(f, "%d %d\n", img.GetX(), img.GetY());
fprintf(f, "%d\n", 255);
fwrite(img.GetData(), sizeof(PixelStruct), img.GetX() * img.GetY(), f);
fclose(f);
}

这是从我知道有效的有效 C 函数中提取的代码,所以我不知道发生了什么。有什么想法吗?

编辑:

就其值(value)而言,它确实在被自身调用且仅被自身调用时执行。当我事先调用前面的ReadImage时,WriteImage并没有执行。这是 ReadImage:

void ReadImage(char *filename, Image &output)
{
FILE *f = fopen(filename, "rb");
char magicNum[128];
int width, height, maxval;

if (f == 0)
{
fprintf(stderr, "Unable to open file %s\n", filename);
exit(0);
}

fscanf(f, "%s\n%d %d\n%d\n", magicNum, &width, &height, &maxval);

printf("Magic num = %s width = %d, height = %d, maxval = %d\n",
magicNum, width, height, maxval);


if (strcmp(magicNum, "P6") != 0)
{
fprintf(stderr, "Unable to read from file %s, because it is not a PNM file of type P6\n", filename);
exit(1);
}

output.ResetSize(width, height);
PixelStruct *data = output.GetData();
output = Image(width, height, data);
fread(output.GetData(), sizeof(PixelStruct), width*height, f);
fclose(f);

}

编辑 2:主要功能。

int main(int argc, char *argv[])
{
Image img;
ReadImage(argv[1], img);
printf("ReadImage called.\n");
WriteImage(argv[2], img);
}

编辑 3:参数化构造函数。

Image::Image(int width, int height, PixelStruct* data)
{
this->x = width;
this->y = height;
this->data = data;
}

编辑 4:图像。

struct PixelStruct
{
unsigned char red;
unsigned char green;
unsigned char blue;
};

class Image
{
private:
int x;
int y;
PixelStruct *data;

public:
Image(void); /* Default constructor */
Image(int width, int height, PixelStruct* data); /* Parameterized constructor */
Image(Image &); /* Copy constructor */
void ResetSize(int width, int height);
int GetX();
int GetY();
PixelStruct* GetData();
void SetData(PixelStruct *data);
};

Image::Image(void)
{
x = 0;
y = 0;
data = 0;
}
Image::Image(int width, int height, PixelStruct* data)
{
this->x = width;
this->y = height;
this->data = data;
}

Image::Image(Image &img)
{
this->x = img.x;
this->y = img.y;
this->data = img.data;
}

void Image::ResetSize(int width, int height)
{
this->x = width;
this->y = height;
}

int Image::GetX()
{
return x;
}

int Image::GetY()
{
return y;
}

PixelStruct* Image::GetData()
{
return data;
}

最佳答案

您的类在数据成员方面存在许多内存管理问题。让我从您的具体问题开始

Image img;
ReadImage(argv[1], img);

此时 img 的缓冲区为 0。

output.ResetSize(width, height);      // Buffer is still 0
PixelStruct *data = output.GetData(); // data is 0
output = Image(width, height, data); // data is still zero

这里你有一个内存问题。您没有赋值运算符。在这种特殊情况下,它没有实际效果,但从长远来看可能会杀死你。你可能应该有一个工作

 ouput.ResetSize (width, height) ;

(如下所述)没有其他语句。

fread(output.GetData(), sizeof(PixelStruct), width*height, f); // data is still 0

我很惊讶你没有被释放。

修复:

这些函数可能应该为数据分配一个缓冲区。

        Image(int width, int height, PixelStruct* data); 
void ResetSize(int width, int height);

这个函数

        Image(Image &); /* Copy constructor */

应该复制数据(不只是分配指针)。您需要一个执行相同操作但应删除任何现有数据的赋值运算符。

你应该有一个释放数据的析构函数。

关于c++ - 图像写入功能未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23730167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com