如何解决当函数的返回类型不允许我这样做时,如何在C中返回错误代码?
我知道标题不是自我解释,但我无法用几句话表达。 无论如何,问题是我有一个C函数,该函数返回由3个整数组成的结构。这是它的定义。
typedef struct {
uint8_t r;
uint8_t g;
uint8_t b;
} Color;
这里是函数
Color PPMImage_getPixel(PPMImage *ppmImage,uint32_t x,uint32_t y) {
// FIXME: Check if (x,y) is in bounds.
return ppmImage->data[y * ppmImage->width + x];
}
现在,当特定条件失败时,我想返回一个错误值,该错误值告诉调用者该函数遇到了错误,但是由于返回值是具有3个无符号整数的结构,所以我不能,因为例如,将每个字段设置为 -1 或返回 NULL ,因为我没有返回指针。有一种优雅而有效的方法吗?
解决方法
将返回值的类型更改为函数的错误代码,并传递要返回的结构颜色的指针
即:
int PPMImage_getPixel(PPMImage *ppmImage,uint32_t x,uint32_t y,Color * color)
{
// FIXME: Check if (x,y) is in bounds.
// TODO: validate color isn't null and valid,otherwise return -1
(*color) = ppmImage->data[y * ppmImage->width + x];
return 0;
}
,
我宁愿有一个指向缓冲区的指针作为该函数的输入参数并返回一个int
。
int PPMImage_getPixel(Color* p_color,PPMImage *ppmImage,uint32_t y)
{
if (some error)
{
return 0;
}
// Copy the struct into buffer
memcpy(p_color,&ppmImage->data[y * ppmImage->width + x],sizeof (Color));
return 1;
}
假设您没有定义某些结构,但是您可以更改它。创建此文件是为了使其具有可编译的内容。
typedef struct PPMImage
{
uint8_t width;
Color data[10];
} PPMImage;
在main()
中创建缓冲区,并将该缓冲区的地址作为输入。
int main(void)
{
PPMImage image;
Color color_buf;
uint32_t x = 5,y = 3;
if (!PPMImage_getPixel(&color_buf,&image,x,y))
{
printf("ERROR PPMImage_getPixel()\n");
exit(0);
}
printf("PPMImage_getPixel() returned no error.\n");
return 0;
}
,
一种方法是将结果分配给输出参数并返回错误代码,如下所示:
int PPMImage_getPixel(PPMImage *ppmImage,Color *result);
但是,由于我是命令查询分离的忠实拥护者,我也将错误代码分配给输出参数:
void PPMImage_getPixel(PPMImage *ppmImage,Color *result,int *error);
另一种方法是通过在x或y太大的情况下返回最接近的像素来定义错误不存在:
Color PPMImage_getPixel(PPMImage *ppmImage,uint32_t)
{
if (x < 0) {
x = 0;
} else if (x > xMax) {
x = xMax;
}
if (y < 0) {
y = 0;
} else if (y > yMax) {
y = yMax;
}
...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。