2013-04-01 52 views
1

我想創建一個函數將返回位於結構中的值。我的問題是試圖找出我可以返回的功能,如果theInfo = NULL創建int函數,如果發生錯誤無法返回有效的int值

下面是我迄今爲止創建的。這可能嗎?

int getTime(struct * theInfo){ 
    if(theInfo != NULL){ 
     return theInfo->waitTime; 
    } 
    else{ 
    printf("getTime Patron is nonexistent\n"); 
    return(thePatron); 
    } 
} 
+1

由於它是關於時間。我想你可以安全地返回-1並檢查它。假設waitTime總是正面的。 – 2013-04-01 15:39:49

+0

@stardust_我無法修改提供給我的'struct * theInfo',我無法更改它。 – user2225940

+0

你不需要。你必須改變getTime。只要把返回-1。然後當你打電話,並返回getTime檢查-1 – 2013-04-01 15:44:47

回答

2

您需要返回兩條信息 - 數字以及該數字是否有效的指示。一種方法是更改​​函數的簽名以指示它是否返回任何內容,如果是,則將該值保存在變量中。這裏是你如何能做到這一點的例子:

// This function returns 1 or 0. 
// 1 indicates success; 0 indicates failure 
// If your compiler is up to C99 standard, use "bool" instead of "int" below 
int getTime(struct * theInfo, int *result) { 
    if(theInfo != NULL){ 
     *result = theInfo->waitTime; 
     return 1; 
    } else{ 
     // result stays unchanged 
     return 0; 
    } 
} 

現在你可以使用類似這樣的新功能:

int res; 
if (getTime(&myInfo, &res)) { 
    printf("getTime returned %d\n", res); 
} else { 
    printf("getTime Patron is nonexistent\n"); 
} 

一種不太普遍的替代,可以使用,當你不需要返回全系列的數字。例如,如果函數返回的有效時間總是正數,則可以採用使用負數的慣例來表示出現錯誤。這種方法也是有效的,但它更多地依賴於一個約定,所以你的代碼的讀者需要查看你的函數文檔來看看發生了什麼。

2

你可以傳遞一個指針,並返回一個布爾值,表明成功:

bool getTime(MyStruct* info, int* time) { 
    if (info) { 
     *time = info->waitTime; 
     return true; 
    } 
    *time = 0; 
    return false; 
} 

然後某處你只需撥打:

int time; 
if (!getTime(info, &time)) { 
    // TODO: retrieval of time failed 
} 
2

只返回-1。我相信等待時間總是正面的。

所以返回-1,如果它爲NULL,然後再檢查-1

else{ 
    printf("getTime Patron is nonexistent\n"); 
    return -1; 
    } 


void someFunc() { 
//... 
    int wtime = getTime(astruct); 
    if (wtime == -1) 
     // error 

//... 
} 
相關問題