gpt4 book ai didi

c - C 中的结构

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

我在 PSET4 (whodunit) 中遇到了问题。我真的不明白为什么在下面的下一种情况下会出现错误,尽管编译没有发出警告。

在这个问题中,我应该读取给定 .bmp 文件的每个像素,用白色像素替换每个红色像素,然后在新的 .bmp 文件中写入新图像。

这是我的代码的两个版本。在第一个 list 中,有正确版本的代码,并且程序按照我的要求正常工作。在第二个 list 中,有一个代码示例,已成功编译,但像素要么仍然相同,要么发生奇怪的情况。

正确版本

// iterate over infile's scanlines
for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
{
// iterate over pixels in scanline
for (int j = 0; j < bi.biWidth; j++)
{ //CORRECT VERSION
// temporary storage
RGBTRIPLE triple;

// read RGB triple from infile
fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
if((triple.rgbtRed == 0xff) && (triple.rgbtGreen == 0x00) && (triple.rgbtBlue == 0x00))
{
triple.rgbtBlue = 0xff;
triple.rgbtGreen = 0xff;
triple.rgbtRed = 0xff;
}

// write RGB triple to outfile
fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
}

版本不正确

// iterate over infile's scanlines
for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
{
// iterate over pixels in scanline
for (int j = 0; j < bi.biWidth; j++)
{ //INCORRECT VERSION
// temporary storage
RGBTRIPLE triple[i][j];

// read RGB triple from infile
fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
if((triple[i][j].rgbtRed == 0xff) && (triple[i][j].rgbtGreen == 0x00) && (triple[i][j].rgbtBlue == 0x00))
{
triple[i][j].rgbtBlue = 0xff;
triple[i][j].rgbtGreen = 0xff;
triple[i][j].rgbtRed = 0xff;
}

// write RGB triple to outfile
fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
}

根据“数组”类(class)(以及以 CS50 中的“学生”结构为例),在“for”循环执行期间需要包含数组和结构变量的索引 [i] 和 [j] 。但在这种情况下,如果我将这些索引放入代码中,一切都会变得无效。如果我不写这些索引,一切都可以。为什么这个逻辑在结构上会在这里破裂?

最佳答案

当您声明RGBTRIPLE triple[i][j];时您创建一个具有值索引 0..i-1 的二维数组和0..j-1 。访问triple[i][j]是未定义的行为;这就是你的第二个解决方案失败的原因。

但是,您不需要 RGBTRIPLE 的整个数组,因为您一次处理一个。这就是您的第一个解决方案有效的原因。

如果您需要读取整个数组,请在具有正确维度的外循环之前声明它:

RGBTRIPLE triple[abs(bi.biHeight)][abs(bi.biWidth)];

请小心使用此解决方案,因为 bi.biHeight*bi.biWidth 的值非常大,可能会导致崩溃。 .

关于c - C 中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40454858/

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