Мне было назначено создание проверки массива (чтобы увидеть, увеличивается ли массив, уменьшается или нет [после этого выходят, если нет]) и рекурсивный двоичный поиск для одного из моих назначений. Я смог сделать это после некоторой помощи моих сверстников, но мне нужна помощь в поиске того, что, по-видимому, вызывает ошибку.Как я могу отследить ошибку
завершение вызова после вызова экземпляра '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;
}
}
}
Эта ошибка обычно указывает на повреждение памяти/неопределенное поведение. Причиной может быть что угодно. Используйте отладчик, чтобы выяснить, где генерируется исключение. В вашем коде есть хотя бы одна ошибка: «while (! (FileIn.eof()))« [всегда ошибка] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a -loop условие считается, неправильно). –
Дополнительно: вы выполняете двоичный поиск, когда массив находится в порядке возрастания или убывания, но ваш двоичный поиск работает только тогда, когда массив находится в порядке возрастания. Кроме того, ваш второй рекурсивный вызов в двоичном поиске неверен. Несколько проблем с этим кодом. –