gpt4 book ai didi

c - 使用无符号值返回错误?

转载 作者:太空宇宙 更新时间:2023-11-04 02:30:07 24 4
gpt4 key购买 nike

我正在制作一个数据结构库。我允许用户调用的一个功能是:

unsigned int index(struct myDataStructure, void* value);

它搜索我的数据结构并返回其中存在该值的 index 位置。

例如

{ 'A', 'D', 'C' }

char val1 = 'A';
unsigned int location = index(s, &val1); // location = 0
char val2 = 'C';
location = index(s, &val2); // location = 2

如果列表中不存在该元素,则不知道返回什么。以下是我目前排除的选项:

  • 使用断言 或系统退出或异常来结束运行时。我不认为这会有多大用处,因为用户在调用 index()/之前必须调用 contains 以确保元素在结构中
  • 返回 UINT_MAX 或 0 <= UINT_MAX 范围内的任何常量。这些可能是索引值。
  • 将返回类型更改为 long,这样我就可以返回 -1。我不想切换数据类型。
  • 让用户传入一个 **unsigned int,这样我可以将它指向 NULL(如果不存在)或一个真实的索引值。对于阅读我的 API 的人来说,这不是用户友好的。

我最好的解决方案是:

// Change return type to pointer.
unsigned int* index(struct myDataStructure, void* value)
{
static int val;

if (value exists...)
{
val = correct index value
return &val;
}
else
{
return NULL;
}
}

但我还是觉得这个方案很差。

最佳答案

你是对的,返回一个指向静态的指针在很多方面都是不好的。它不是线程安全的,而且 - 更糟 - 它会邀请用户做类似的事情

int *aIndexLoc = index(data, &a);
int *bIndexLoc = index(data, &b);
if (aIndexLoc && bIndexLoc)
printf ("a's loc is %u; b's loc is %u\n", *aIndexLoc, *bIndexLoc);

当然会得到错误的答案。

首先...如果您希望您的库面向 future ,那么不要为数组索引返回 unsigned。返回 size_t

那么... 有几种处理错误返回的习语。最常见的是返回 int 或枚举错误代码作为函数值和带有指针 arg 的实际返回值。按照惯例,0 表示“正常”,非零值是各种错误代码。此外,如果您的数据结构超过几个字节,请不要传递它的完整副本。传递一个指针

typedef int ERROR;
ERROR index(size_t *result, struct myDataStructure *myStruct, void *valueToFind);

然后是这样的:

size_t loc[1];
struct myDataStructure someData[1];
int aValue[1];

initialize(someData);
get(aValue);

ERROR error = index(loc, someData, aValue);
if (error) {
fprintf(stderr, "Couldn't find the value. Error code: %d\n", error);
return;
}

1 元素数组是一种技巧,无论对象是分配在堆栈上还是堆上,它都可以让您以相同的方式进行编码。您可以将数组的名称视为指针。例如。 someData->fieldName*loc 工作得很好。

关于c - 使用无符号值返回错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44511815/

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