2016-03-01 9 views
1

Мне было назначено создание проверки массива (чтобы увидеть, увеличивается ли массив, уменьшается или нет [после этого выходят, если нет]) и рекурсивный двоичный поиск для одного из моих назначений. Я смог сделать это после некоторой помощи моих сверстников, но мне нужна помощь в поиске того, что, по-видимому, вызывает ошибку.Как я могу отследить ошибку

завершение вызова после вызова экземпляра 'std :: logic_error' what(): basic_string :: _ S_construct null недействителен Aborted

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

#include <iosteam> 
#include <string> 
#include <cstdlib> 
#include <fstream> 

using namespace std; 

int checkArraySort (string *fileLines, int numberOfLines); 
int binarySearchR (string *fileLines, string searchKey, int iMin, int iMax); 

int main() 
{ 
int numberOfLines = 0; 
    string searchKey = 0; 

    cout << "Input search key: "; 
    cin >> searchKey; 

     ifstream fileIn; 
     fileIn.open("words_in.txt"); 

     string line; 

     if (fileIn.eof()) /* Checks file to see if it is blank before proceeding */ 
     { 
       exit (EXIT_SUCCESS); 
     } 

    else 
    { 
     while(!(fileIn.eof())) 
     { 
        fileIn >> line; 
        numberOfLines++; 
     } 

      fileIn.close(); /* closes fileIn, need to reopen to reset the line location */ 
      fileIn.open("words_in.txt"); 

      string *fileInLines; 
      fileInLines = new string[numberOfLines]; 

      for (int i = 0; i < numberOfLines; i++) 
      { 
        fileIn >> line; 
        fileInLines[i] = line; 
      } 

      fileIn.close(); /* closes fileIn */ 

     int resultingCheck = checkArraySort(fileInLines, numberOfLines); 

     if (resultingCheck == -1) 
     { 
      cout << "The array is sorted in descending order." << endl; 
     } 

     else if (resultingCheck == 1) 
     { 
      cout << "The array is sorted in ascending order." << endl; 
     } 

     else 
     { 
      cerr << "ERROR: Array not sorted!" << endl; 
      exit (EXIT_FAILURE); 
     } 

     int searchResult = binarySearchR (fileInLines, searchKey, 0, numberOfLines); 

     if (!searchResult == -1) 
     { 
      cout << "Key found at index " << searchResult << "." << endl; 
     } 

     else 
     { 
      cout << "Key not found at any index." << endl; 
     } 

      exit (EXIT_SUCCESS); 
    } 
} 

int checkArraySort (string *fileLines, int numberOfLines) 
{ 
    int result = 1; /* Ascending by default */ 

    for (int i = 1; i < numberOfLines; i++) /* Checks if decending */ 
    { 
     if (fileLines[i] < fileLines[i-1]) 
     { 
      result = -1; 
     } 
    } 

    if (result == -1) /* Makes sure it is descending (or if it is neither) */ 
    { 
     for (int i = 1; i < numberOfLines; i++) 
     { 
      if (fileLines[i] > fileLines[i-1]) 
      { 
       result = 0; 
      } 
     } 
    } 

    return result; 
} 

int binarySearchR (string *fileLines, string searchKey, int iMin, int iMax) 
{ 
    // so, its gotta look at the center value and each times, it discards half of the remaining list. 

    if (iMax < iMin) /* If the minimum is greater than the maximum */ 
    { 
     return -1; 
    } 

    else 
    { 
     int iMid = (iMin + iMax)/2; 

     if (fileLines[iMid] > searchKey) /* If the key is in the lower subset */ 
     { 
      return binarySearchR (fileLines, searchKey, iMin, iMid - 1); 
     } 

     else if (fileLines[iMid] < searchKey) /*If the key is in the upper subset */ 
     { 
      return binarySearchR (fileLines, searchKey, iMin, iMid + 1); 
     } 

     else /*If anything else besides the two */ 
     { 
      return iMid; 
     } 
    } 
} 
+0

Эта ошибка обычно указывает на повреждение памяти/неопределенное поведение. Причиной может быть что угодно. Используйте отладчик, чтобы выяснить, где генерируется исключение. В вашем коде есть хотя бы одна ошибка: «while (! (FileIn.eof()))« [всегда ошибка] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a -loop условие считается, неправильно). –

+0

Дополнительно: вы выполняете двоичный поиск, когда массив находится в порядке возрастания или убывания, но ваш двоичный поиск работает только тогда, когда массив находится в порядке возрастания. Кроме того, ваш второй рекурсивный вызов в двоичном поиске неверен. Несколько проблем с этим кодом. –

ответ

0

Простой способ: добавить кучу cout с, чтобы увидеть, где вы программа идет, и какие значения.

Pros

  • Легко сделать

Против

  • Требуется перекомпиляция каждый раз, когда вы хотите добавить больше информации

Трудный путь: Научитесь использовать отладчик

Pros

  • Может проверять «на лету»
  • Не нужно восстановить
  • Можно использовать то, что вы узнаете в любой другой программе на С ++

Против

  • Требуется немного исследований, чтобы узнать, как это сделать.