2012-06-04 2 views
0

Я следующий код последовательного поиска отлично работать в Visual C++рекурсивная функция ошибки Dev-C++

#include<iostream> 
using namespace std; 

int seqSearch(int list[], int length, int item) 
{ 
    int index = length-1; 
    if (index < 0) 
     return -1; 
    if (list[index] == item) 
     return (index); 
    else seqSearch(list, index, item); 
} // end seqSearch 

int main() 
{ 

    int const length = 10; 
    int item; 
    int list[10] = { 2, 3, 4, 5, 20, 40, 80, 45, 99, 0}; 

    cout << "Please enter the value to be searched: "; 
    cin>> item; 

    if (seqSearch(list, length, item) == -1) cout << "Item not found." << endl; 
    else cout <<"Item found at position: " << seqSearch(list, length, item) << " of list *Note: (first index of list start at 0)" << endl; 

    system("pause"); 
    return 0; 
} 

Но в Dev-C++ это всегда показывает результат 0, я пытался отладки и увидеть индекс правильно, но почему он отображает 0? Почему у нас есть эта разница между VC++ и Dev-C++?

+0

Рекурсивный последовательный поиск ?? – SuperSaiyan

+8

'else seqSearch (список, индекс, элемент);' ничего не возвращает. Измените его на 'else return seqSearch (list, index, item);'. – Vikas

+0

Скорее всего, это не связано с вашей проблемой, но вы можете захотеть заглянуть в другую среду разработки, кроме Dev-C++, для [причин, перечисленных здесь] (http://stackoverflow.com/tags/dev-c%2b%2b/info) , – Bart

ответ

5

Функция int seqSearch имеет код, else seqSearch(list, index, item);, который ничего не возвращает. Изменение этого параметра на else return seqSearch(list, index, item); должно решить проблему.

Теперь копаем немного глубоко.

От n2960 проекта:

§ 6.6.3/2

стекания конца функции эквивалентен возврат без значения; это приводит к неопределенному поведению в возвращающей значение функции.

В соответствии со стандартом это неопределенное поведение.

Рытье немного глубже:

  • Почему не возвращается из Непустой функции не ошибка компилятора?

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

  • Почему код функционально работает должным образом в VC++

Это архитектура и calling convention зависит. Попробуйте следующий код:

#include <iostream> 

int fun (int v) 
{ 
    int a = v; 
} 

int main() 
{ 
    std::cout << fun(5) << std::endl; 
} 

на разных компиляторах функцию fun возвращает либо 0 или любое значение, которое передается ему. В принципе, он может вернуть значение последнего оцениваемого выражения.

+0

Отличное объяснение. – nikhil

3

Правильное определение метода должно быть

int seqSearch(int list[], int length, int item) 
{ 
    int index = length-1; 
    if (index < 0) 
     return -1; 
    if (list[index] == item) 
     return (index); 
    else return seqSearch(list, index, item); 
} 

Вы пропустили ответное заявление. В идеале компилятор должен предупредить вас, но я не слишком хорошо знаком с версией, которую использует Dev-Cpp.

+0

Кредит Викаса за то, что он его пересматривал. – nikhil

+0

Еще спасибо за то, что я вижу мой вопрос, в VC++ нет необходимости добавлять «возврат», он все еще работает хорошо, это странно? –

+0

Нет, это конкретная реализация. Чтобы соответствовать стандартам, вы должны иметь оператор возврата. В противном случае он может работать или может не работать в зависимости от используемого вами компилятора, как вы выяснили. – nikhil

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