在 C 中将结构的二维数组初始化为零(将图像设置为全黑)
initializing a 2 dimensional array of struct to zero (set the image to all black) in C
我想将图像文件传递给函数并使其全黑。
这是我的做法:
typedef struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;
void black(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE black_image[height][width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
black_image[i][j] = {0};
}
}
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
image[i][j] = black_image[i][j];
}
}
}
但是,我收到了相同的错误消息:
expected expression before '{' token black_image[i][j] = {0};
^
注意指针指向大括号。
我做错了什么?请帮忙。
{0}
是定义对象时用于初始化的语法。它不构成可用于赋值语句的表达式。
为此,您可以使用复合文字:
black_image[i][j] = (RGBTRIPLE) { 0, 0, 0 };
(这也可以作为 (RGBTRIPLE) {0}
,但列出所有三个组件可以更清楚地显示意图,并且可以避免编译器警告。)
因为你只是用它来将 image
设置为黑色,你可以去掉 black_image
和初始化它的循环,直接将 image
设置为零。
达到目标的最短路径是:
void black(int height, int width, RGBTRIPLE image[height][width])
{
memset(image, 0, sizeof(RGBTRIPLE[height][width]));
}
除了现在的好答案之外,它完全解决了您的问题所带来的问题,并且作为简化的问题,据我所知,您有一个额外的不需要的循环和一个额外的不需要的数组,RGBTRIPLE black_image[height][width]
.
相反,您可以使用类似于 的复合文字将黑色结构直接分配给 image
,但放弃 black_image
数组:
void black(int height, int width, RGBTRIPLE image[][width])
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
image[i][j] = (RGBTRIPLE){0, 0, 0}; //*
}
}
}
*如果你想在初始化时更加清晰,你可以使用指定的初始化器:
image[i][j] = (RGBTRIPLE){.rgbtBlue = 0, .rgbtGreen = 0, .rgbtRed = 0};
或者创建一个单一的黑色结构,并在循环中将其分配给数组中的每个元素:
void black(int height, int width, RGBTRIPLE image[][width])
{
RGBTRIPLE black_image = {0, 0, 0}; //**
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
image[i][j] = black_image;
}
}
}
**同样,您可以使用指定的初始化程序:
RGBTRIPLE black_image = {.rgbtBlue = 0, .rgbtGreen = 0, .rgbtRed = 0};
也就是说,这些是我首选方法的替代方法,使用 memset
,已在 中提到。
我想将图像文件传递给函数并使其全黑。
这是我的做法:
typedef struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;
void black(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE black_image[height][width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
black_image[i][j] = {0};
}
}
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
image[i][j] = black_image[i][j];
}
}
}
但是,我收到了相同的错误消息:
expected expression before '{' token black_image[i][j] = {0}; ^
注意指针指向大括号。
我做错了什么?请帮忙。
{0}
是定义对象时用于初始化的语法。它不构成可用于赋值语句的表达式。
为此,您可以使用复合文字:
black_image[i][j] = (RGBTRIPLE) { 0, 0, 0 };
(这也可以作为 (RGBTRIPLE) {0}
,但列出所有三个组件可以更清楚地显示意图,并且可以避免编译器警告。)
因为你只是用它来将 image
设置为黑色,你可以去掉 black_image
和初始化它的循环,直接将 image
设置为零。
达到目标的最短路径是:
void black(int height, int width, RGBTRIPLE image[height][width])
{
memset(image, 0, sizeof(RGBTRIPLE[height][width]));
}
除了现在的好答案之外,它完全解决了您的问题所带来的问题,并且作为简化的问题,据我所知,您有一个额外的不需要的循环和一个额外的不需要的数组,RGBTRIPLE black_image[height][width]
.
相反,您可以使用类似于 image
,但放弃 black_image
数组:
void black(int height, int width, RGBTRIPLE image[][width])
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
image[i][j] = (RGBTRIPLE){0, 0, 0}; //*
}
}
}
*如果你想在初始化时更加清晰,你可以使用指定的初始化器:
image[i][j] = (RGBTRIPLE){.rgbtBlue = 0, .rgbtGreen = 0, .rgbtRed = 0};
或者创建一个单一的黑色结构,并在循环中将其分配给数组中的每个元素:
void black(int height, int width, RGBTRIPLE image[][width])
{
RGBTRIPLE black_image = {0, 0, 0}; //**
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
image[i][j] = black_image;
}
}
}
**同样,您可以使用指定的初始化程序:
RGBTRIPLE black_image = {.rgbtBlue = 0, .rgbtGreen = 0, .rgbtRed = 0};
也就是说,这些是我首选方法的替代方法,使用 memset
,已在