/*
//i comment this block, please see the updates
void* fun_one(char *buffer, long length)
{
if(NULL == buffer)
return xxx; //return what value here
...
}
fun_two()
{
...
fun_one(image->buffer, image->length);
...
}
*/
如果错误发生,我不希望退出程序但返回fun_two()
。我该怎么办?
成功时我知道return (void *)0;
或return NULL;
,但在出错时会返回什么值?
相关链接: void *
更新
但如果我是一个线程函数,例如
int main()
{
...
pthread_create(&id1, NULL, (void*)myThread1, ¶m_struct);
...
}
void* myThread1(void* param)
{
struct len_str* img = (struct len_str*)param;
if(NULL == img->buf)
return xxx; //return what value here
if(0 == img->len)
return xxx;
...
}
相关链接: pthread_create
myThread1()
的返回值为void *
如果发生错误,应该返回什么值
答案 0 :(得分:3)
不是返回指针,而是返回int
类型的值。
返回0
表示一切正常。
返回1
表示传入了NULL指针
返回2
表示无效长度
...
int fun_one(char *buffer, long length) {
if (buffer == NULL) return 1;
if (length == 0) return 2;
if (length < 0) return 3;
/* ... */
return 0;
}
为了更加清晰(???),您可以使用枚举
enum fun_one_errors {FO_OK, FO_NULL, FO_ZERO, FO_NEG};
return FO_ZERO;
答案 1 :(得分:2)
您正在努力应对界面的“设计”。你需要传递给函数什么,它需要返回什么以及如何发出错误信号。
通常,如果返回指针,则指针值为零(NULL)表示错误。如果要传递更多信息,可以使用设置为其中一个错误代码的辅助变量。这将是一个全局变量或变量的(指针):
int my_errcode;
...
if ((p=fun_one(buf, len))==NULL) printf("error %d\n",my_errcode);
作为替代方法,您将void *指针作为参数返回(您现在必须使用双重间接)并让函数返回信号成功,或失败以及失败类型:
if ((my_errcode=fun_one(buf, len, &p))!=0) printf("error %d\n",my_errcode);
所以取决于你...
答案 2 :(得分:0)
在您的线程函数中,您将动态分配一个变量来存储返回值。您可以设置该值并返回指针。
然后当您调用pthread_join
时,您将收到指向该变量的指针,然后您将其转换并取消引用以读取该值,并在完成后free
。
void* myThread1(void* param)
{
int *rval = malloc(sizeof(int));
if (rval == NULL) {
perror("malloc failed");
exit(1);
}
struct len_str* img = (struct len_str*)param;
if(NULL == img->buf) {
*rval = 0;
return rval;
}
if(0 == img->len) {
*rval = 1;
return rval;
}
...
}
int main()
{
...
pthread_create(&id1, NULL, (void*)myThread1, ¶m_struct);
...
void *rval;
pthread_join(id1, &rval);
printf("rval = %d\n", *(int *)rval);
free(rval);
}
答案 3 :(得分:0)
那么,当返回指针时,通常会遇到如果函数执行导致错误该怎么办的问题?
经典方法是保留一个特殊值(NULL或C ++中的0)来表示这种错误,并使用全局来表示您可以拥有的不同错误值。
但是,如果您希望重入模块能够进行多线程处理,该怎么办?好吧,指针有一个问题,即如果那个地方恰好被一个非无用的变量占用,他们指向的任何地方都是可能的麻烦来源。
但我们有不同的方法。只需创建哑变量(不用于其他任何东西)来保存没有任何地址。这样,您可以保留多个指针值(这些变量的地址)来表示正确的错误代码。由于编译器找到的位置不能用于其他任何东西,它们可用于保存(而不是存储)特殊内容的地址。
int error_001_placeholder;
int error_002_placeholder;
int error_003_placeholder;
...
if (condition_1) return &error_001_placeholder;
if (condition_2) return &error_002_placeholder;
if (condition_3) return &error_003_placeholder;
然后,您将能够检查不同的无效返回指针,只需检查它们是否属于这组指针。
更重要的是,如果你想做一般的错误检查,你可以保留一个全局数组,并返回不同错误的单个单元格,最后通用检查返回的值是否是错误,你可以检查是否
returned_value >= errors_array && returned_value < errors_array + erros_array_size
。