2017-02-12 42 views
1

У меня есть массив элементов, определенный несколькими параметрами и уникальным идентификатором, я создал функцию, которая возвращает элемент, связанный с определенным уникальным идентификатором, дело в том, что если введен неверный идентификатор (тот, который не хранится по массиву), для моей функции нет действительного значения.Что делать в C, когда нет действительного значения для возврата?

Моя проблема заключается в том, что мой код не будет компилироваться, если функция не обязательно вернет что-то, есть ли способ сообщить компилятору, что это нормально делать это здесь?

спасибо.

+0

Опубликуйте некоторые из вашего кода. – Jarvis

+0

Пример кода помог бы ... –

ответ

2

Вы должны определить недопустимое значение, такое значение просто не относится к набору допустимых значений.

Например:

Если действительные значения [0, инф) затем -1 является хорошим недействительного значения.

+0

Итак, я сделаю это, спасибо! –

+0

Я немного разорван на этом подходе. Потому что он жертвует огромным диапазоном значений, чтобы получить один недействительный. Я часто пытаюсь сделать недопустимое значение '0', а диапазон всех остальных целых чисел без знака (определенного размера). – StoryTeller

+0

@StoryTeller Этот подход действителен только в том случае, если набор действительных значений действительно ограничен и четко определен. Конечно, есть и другие подходы, но этот простой и, следовательно, элегантный. Хотя, конечно, это не работает все время. Кроме того, я считаю, что он используется во многих важных приложениях, например '' \ 0'' для завершения строки и 'NULL' для указателей являются наиболее широко используемыми и стандартизованными. Я мог бы продолжить: «EOF» ... но вы понимаете. –

7

Существует несколько способов сделать это.

Самый простой способ - вернуть значение, которое не находится в допустимом диапазоне значений.

Другим способом является объявление еще одного параметра, который является указателем на переменную, которая служит в качестве ошибки. Или вернуть значение ошибки и вернуть допустимое значение в качестве параметра, объявленного как ссылка.

Например

int /* error */ f(T *valid_value); 

Еще один способ состоит в возвращении структуры из двух значений, одна из которых представляет собой логическое значение, которое сообщает об ошибке или успех.

1

Я бы вернул указатель на элемент, а не сам элемент. Вот так.

struct Element* find(struct Element* elements, int count, int id) 
{ 
    for(int i = 0; i < count; i++) 
    { 
     if(elements[i].id == id) 
     return elements + i; //pointer to i'th element 
    } 
    return NULL; //if it makes it here return NULL since no element was found. 
} 

Тогда вы можете сделать что-то подобное.

struct Element* e = find(elements, m, 1234); 
if(e) //check and see if it is not null 
{ 
    //handle found case 
} 
else 
{ 
    //handle not found case 
} 
+0

Существует проблема с вашим подходом, вы можете передать 'NULL'' 'free()', но вы не можете передать возвращаемое значение этой функции в 'free()'. Это почти то же самое, что я предложил, но у «NULL» есть свои собственные варианты использования. Возможно, элемент с недопустимыми членами и функция 'int element_is_valid (Element *)' будут делать. Кроме того, прикрепление '*' к типу - плохая идея и заставляет меня разорвать глаза! –

+1

@IharobAlAsimi - Итак, вы должны написать 'struct Element * find (.....'? – 4386427

+1

Я не уверен, что «не может освободить возвращаемое значение» является действительной жалобой. –

0

..... есть способ, чтобы сообщить компилятору, что это нормально, чтобы сделать это здесь?

Нет, не существует способа сделать это.

Функция должна всегда возвращать значение того же типа (т. Е. Тип, который вы указали в декларации) или никогда не возвращаете ничего (т. Е. Объявлено как void foo(...)).

Вы не можете вернуть значение в некоторых случаях и вернуть «ничего» в другом случае. Аналогично, вы не можете возвращать целое число в некоторых случаях и структуру в других случаях. Возвращаемое значение должно быть одинаковым во всех случаях.

Общая работа заключается в том, чтобы ввести способ сообщить вызывающему, что функции не удалось найти запрошенный элемент. Существует несколько способов сделать это, как указано в других ответах. Какое решение зависит от вашего кода и потребностей.

Обычно я предпочитаю, чтобы функция возвращала значение int, где нулевое значение означает «сбой» и ненулевое значение означает «успех». Я бы тогда «возвращал» элемент с помощью указателя. Как этот псевдо-код:

int foo(struct MyStruct *p, .....) 
{ 
    if (found.....) 
    { 
      *p = the_found_element; 
      return 1; 
    } 
    return 0; 
} 


struct MyStruct ms; 
if (foo(&ms, ....)) 
{ 
    // okay - carry on using ms 
    ... 
} 
else 
{ 
    // failure - don't use ms as it is invalid 
    ... 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^