2017-01-27 4 views
0

У меня есть назначение написать алгоритм maxSubArray. В основном это работает, но у меня возникают некоторые проблемы с возвращающимися структурами.C++ Ошибка сегментации (сбрасывание ядра) и использование структур

Вот соответствующие файлы (извините за стену текста, но я не знаю, как точно указать эту ошибку):

main.cpp

#include <iostream> 

#include "./MaxSubarray.h" 

using namespace std; 

#define TEST(test) { \ 
    testNum++; \ 
    if (!(test)) { \ 
    cerr << "Test " << testNum << " failed" << endl; \ 
    numFails++; \ 
    } \ 
} 

int runTests() { 
    int numFails = 0; 
    int testNum = 0; 

    { 
    //   0 1 2* 3 4 5 
    int A[] = { 1, -4, 14, -2, 3, -1 }; 
    Result r = findMaxCrossingSubarray(A, 0, 2, 5); 
    Result c(2, 4, 15); 
    TEST(r == c); 

    } 

    { 
    //   0 1 2 3* 4 5 6 
    int A[] = { 0, 5, -4, 1, -2, -3, 6 }; 
    Result r = findMaxCrossingSubarray(A, 0, 3, 6); 
    Result c(1, 6, 3); 
    TEST(r == c); 
    } 

    { 
    //   0 1 2 3* 4 5 6 
    int A[] = { 0, 5, -4, 1, -2, -3, 5 }; 
    Result r = findMaxCrossingSubarray(A, 0, 3, 6); 
    Result c(1, 6, 2); 
    TEST(r == c); 
    } 

    { 
    int A[] = { 13, -3, 4 }; 
    Result r = findMaxSubarray(A, 0, 2); 
    Result c(0, 2, 14); 
    TEST(r == c); 
    } 

    { 
    int A[] = { 13, 4, -3 }; 
    Result r = findMaxSubarray(A, 0, 2); 
    Result c(0, 1, 17); 
    TEST(r == c); 
    } 

    { 
    int A[] = { -3, 4, 13 }; 
    Result r = findMaxSubarray(A, 0, 2); 
    Result c(1, 2, 17); 
    TEST(r == c); 
    } 

    { 
    int A[] = { 4, -3, 13 }; 
    Result r = findMaxSubarray(A, 0, 2); 
    Result c(0, 2, 14); 
    TEST(r == c); 
    } 

    { 
    int A[] = { 4, -3, -13, 5, 3 }; 
    Result r = findMaxSubarray(A, 0, 4); 
    Result c(3, 4, 8); 
    TEST(r == c); 
    } 

    { 
    int A[] = { 4, 3, -13, -5, 3 }; 
    Result r = findMaxSubarray(A, 0, 4); 
    Result c(0, 1, 7); 
    TEST(r == c); 
    } 

    { 
    int A[] = { -4, 4, -3, 5, -3 }; 
    Result r = findMaxSubarray(A, 0, 4); 
    Result c(1, 3, 6); 
    TEST(r == c); 
    } 

    { 
    int A[] = { 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7 }; 
    Result r = findMaxSubarray(A, 0, 15); 
    Result c(7, 10, 43); 
    TEST(r == c); 
    } 


    const int numSuccesses = testNum - numFails; 
    cout << numSuccesses << "/" << testNum << " tests succeeded" << endl; 

    return numFails; 
} 

int main() { 
    // TODO: Add test code as necessary. 
    // This file will NOT be submitted, though! 

    return runTests(); 
} 

MaxSubarray.cpp

#include "./MaxSubarray.h" 
#include <iostream> 
// Provides floor, ceil, etc. 
#include <cmath> 
#include <climits> 
using namespace std; 

//Kalen Williams 
//27 January 2017 

Result findMaxCrossingSubarray(int* array, int low, int mid, int high){ 
    int leftSum = INT_MIN; 
    int sum = 0; 
    int maxLeftIndex; 

    for(int i = mid; i >= low; i--){ 
     sum = sum + array[i]; 

     if(sum > leftSum){ 
      leftSum = sum; 
      maxLeftIndex = i; 
     } 
    } 

    int rightSum = INT_MIN; 
    sum = 0; 
    int maxRightIndex; 

    for(int j = mid + 1; j <= high; j++){ 
     sum = sum + array[j]; 

     if(sum > rightSum){ 
      rightSum = sum; 
      maxRightIndex = j; 
     } 
    } 

    int totalSum = leftSum + rightSum; 
    return Result(maxLeftIndex, maxRightIndex, totalSum); 

} 

Result findMaxSubarray(int* array, int low, int high){ 
    if(high = low){ 
     return Result(low, high, array[low]); 
    } 
    else{ 
     int mid = (low + high)/2; 
// 
     Result leftArray = findMaxSubarray(array, low, mid); 
     Result rightArray = findMaxSubarray(array, mid + 1, high); 
     Result crossArray = findMaxCrossingSubarray(array, low, mid, high); 

     if(leftArray.sum >= rightArray.sum && leftArray.sum >= crossArray.sum){ 
      return leftArray; 
     } 
     else if(rightArray.sum >= leftArray.sum && rightArray.sum >= crossArray.sum){ 
      return rightArray; 
     } 
     else{ 
      return crossArray; 
     } 
// 

    } 

} 

с кодом работает как есть, я прохожу первые 3 теста, потому что мой findMaxCrossingSubarray работает, однако, когда я раскомментирую код в findMaxSubArray I получаю сообщение об ошибке

ошибку сегментации (ядро сбрасывали)

Я сделал довольно много исследований по этому вопросу, и знаю, что это означает, что я пытаюсь ссылаться на память, которая не была выделена для в программе, я просто не знаю, как сузить вопрос. Я попытался скомпилировать с -Wall, но это дало мне множество различных ошибок, которые никому не представлялись важными.

+0

Запустите программу под отладчиком и посмотрите, какие значения переменных вы получите, когда получите ошибку. – Barmar

+0

Не комментируйте часть кода, с которым вы столкнулись. Выделение SO делает его более трудным для чтения этого кода. – Barmar

+0

Даже если вы не считаете, что предупреждения из '-Wall' связаны, вы все равно должны их исправить. Вы не знаете достаточно, чтобы быть уверенным. – Barmar

ответ

2

Я не могу быть уверен, что это является причиной неисправности Seg, не видя файл заголовка, но у вас есть ошибка в первой строке findMaxSubarray:

if (high = low) { 

Вы, очевидно, означало high == low. У вас должно быть предупреждение о компиляторе. Если бы вы были «const nazi», компилятор поймал бы это ... (т. Е. И ошибка вместо предупреждения): я имею в виду, конечно, размещение const int high и const int low в определениях функций (const игнорируется в объявлении, кстати).

+0

Я могу загрузить файл заголовка, если вы хотите, но довольно безопасно предположить, что это проблема, поскольку он проходит все тесты после исправления. – kalenpw

+0

ОК. Может быть, подождите и посмотрите, есть ли у вас проблемы ... –

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