2016-01-23 14 views
5

Mam funkcję, która bada tablicę i zwraca indeks tablicy, jeśli sonda się powiedzie.Prawidłowy sposób zwracania kodu błędu dla funkcji zwracającej size_t

W moim kodzie zrobiłem każdy typ dotyczący indeksu tablicowego, aby uzyskać jasność.

Jaki jest preferowany sposób zachowania tej przejrzystości dla tej funkcji? Czy powinienem wziąć argument wskaźnika do zmiennej błędu i ustawić to?

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 

} 

Wtedy mogę używać go jako

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

Czy zamiast tego można zamienić funkcje na (podpisany) 'ssize_t'? –

+0

Nie mam 'ssize_t'. Czy możesz zwrócić słowo "SIZE_MAX", aby wskazać niepowodzenie? –

+0

'ssize_t' nie jest standardem C (to POSIX). C ma jednak 'ptrdiff_t'. To powiedziawszy, '(size_t) -1' jest (AFAIK) zawsze zdefiniowane jako' SIZE_MAX'; można by po prostu użyć '#define LIN_SEARCH_ERR ((size_t) -1)' lub podobnego. –

Odpowiedz

4

jeden sposób bez „utraty” size_t (size_t jest odpowiedniego typu indeksami tabeli) jest powrót do wartości indeksu w wskaźnika i zwrotnym kodem jako logiczną:

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; 
} 

i można nazwać:

size_t index; 

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

ten sposób, nie trzeba iść na kompromis z pomocą czegoś innego niż size_t oraz typ zwracanej przez funkcję nadal mówi, czy indeks jest znalezione.

+0

Myślę, że to wszystko jest bardzo spójne, dzięki za sugestie. – luffe

+0

Kolejne krótkie pytanie, które może nie uzasadnia całkiem nowego pytania: w moich prototypach dodaje 'const' do każdego parametru, którego nie zamierzam zmieniać, nawet dla tych wartości że 'C' domyślnie przekazuje skopiowaną wartość (np.' int's), takie jak to 'fn (const double x)': czy jest to dobra praktyka? Jeszcze raz dziękuję – luffe

+0

@luffe To nieszkodliwe. Ale ja osobiście nie uważam, że jest to w ogóle użyteczne. Zobacz: http://stackoverflow.com/questions/1724051/const-correctness- for-value-parameters and –

1

takich sytuacjach nie są niespotykane. Weźmy na przykład definicja fgetc, który odczytuje znaki:

int fgetc(FILE *stream); 

fgetc() odczytuje następny znak ze stream i zwraca go jako rzutowanie unsigned char na int lub EOF w przypadku końca pliku lub błąd.

Funkcja ta zwraca wartość, która może zostać oddanych do unsigned char na sukces i powrót EOF (zwykle -1) na niepowodzenie.

Innym przykładem jest ftell, który donosi, prąd przesunięcia w pliku:

long ftell(FILE *stream); 

Po pomyślnym zakończeniu, ... ftell() zwraca bieżącą offset. W przeciwnym razie zwracane jest -1, a ustawiane jest errno, aby wskazać błąd .

Przesunięcia plików są zawsze nieujemne, dlatego zwracanie wartości ujemnej określa sposób zgłaszania błędów.

Myślę, że zmiana typu zwrotu na long byłaby dopuszczalna w przypadku takim jak ten.

Powiązane problemy