2016-01-23 52 views
5

我有一個函數,探測一個數組,並返回一個數組索引,如果探測成功。正確的方法返回函數返回的錯誤代碼size_t

在我的代碼中,爲了清楚起見,我已經對數組索引a type_t做了每種類型。

保留此功能的清晰度的優先方式是什麼?我應該將一個指針參數傳給一個錯誤變量並設置它嗎?

inline size_t 
lin_search(const double *pxa, const double x, const size_t idxlow, const size_t idxhigh) 
{ 
    for (size_t i = idxlow; i < idxhigh; i++) 
    { 
     if (pxa[i] <= x && pxa[i+1] > x) 
      return i; 
    } 

    return -1; // If I change the return type to f.ex long int this works 
       // but I am no longer consistent 

} 

然後,我可以用它作爲

index = linsearch(parray, x, 0, n - 1); 
if (index == -1) 
    ... not found 
+0

你可以將你的函數切換到(簽名)'ssize_t'嗎? –

+0

我沒有'ssize_t'。你能否返回'SIZE_MAX'來表示失敗? –

+0

'ssize_t'不是標準C(它是POSIX)。不過,C確實有'ptrdiff_t'。也就是說,((size_t)-1')總是定義爲(SIZE_MAX);我們可以使用'#define LIN_SEARCH_ERR((size_t)-1)'或類似的方法。 –

回答

4

一個沒有「輸」的size_t其他方式(爲size_t 的正確類型數組索引)是在指針和返回代碼爲布爾返回的索引值:

bool 
    lin_search(...., size_t *index) { 
     bool found = false; 

     for (size_t i = idxlow; i < idxhigh; i++) { 
      if (pxa[i] <= x && pxa[i+1] > x) { 
       found = true; 
       *index = i; 
       break; 
      } 
     } 

    return found; 
} 

和您可以撥打:

size_t index; 

if (lin_search(...., &index)) { 
    /* use 'index' */ 
} 

這樣,您就不必使用比size_t其他的東西,函數返回類型妥協仍然說是否索引被發現。

+0

我認爲這樣可以保持非常一致,感謝您的建議 – luffe

+0

另一個可能不保證全新問題的簡短樣式問題:在我的原型中,我爲每個我不打算更改的參數添加「const」,即使對於這些值那'C'默認傳遞一個複製值(即'int's),像這樣'fn(const double x)':這是一個好習慣嗎?再次感謝 – luffe

+0

@luffe這是無害的。但我個人認爲它無論如何都是有用的。請參閱:http://stackoverflow.com/questions/1724051/const-correctness-for-value-parameters和 –

1

情況像這樣的並非聞所未聞。的fgetc採取例如定義,其中讀取字符:

int fgetc(FILE *stream); 

龜etc()從流中讀取下一個字符,一個無符號字符鑄造返回它作爲 爲int,或在文件結束的EOF或錯誤。

該函數返回一個可強制轉換爲unsigned char上成功的值,並在失敗時返回EOF(通常爲-1)。

又如ftell,其報告當前的文件偏移量:

long ftell(FILE *stream); 

成功完成後,... FTELL()返回當前 偏移。否則,返回-1並將errno設置爲指示 錯誤。

文件偏移總是非負數,所以返回負值是錯誤報告的方式。

所以我認爲改變返回類型爲long對於這樣的情況是可以接受的。