2017-01-27 11 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; 
     } 
// 

    } 

} 

のコードをそのまま実行したのですが、私のfindMaxCrossingSubarrayが機能するため、最初の3つのテストに合格しますが、コードのコメントを外すとfindMaxSubArray私はこの問題についての研究のかなりを行って、それは私がのために割り当てられていないメモリを参照しようとしています意味を知ってました

(コアダンプ)

セグメンテーションフォールトエラーが出ますプログラム、私はちょうど問題を絞り込む方法が不明です。私は-Wallでコンパイルしようとしましたが、それは私にこれに関連すると思われなかったさまざまなエラーの束を与えました。

+0

デバッガの下でプログラムを実行し、エラーが発生したときの変数の値を確認します。 – Barmar

+0

問題のあるコードの部分をコメントにしないでください。 SOの強調表示により、そのコードを読むのが難しくなります。 – Barmar

+0

'-Wall'からの警告が関連しているとは思わない場合でも、修正する必要があります。あなたは確かに分かりません。 – Barmar

答えて

2

私は、これはヘッダファイルを見ることなくワンセグ障害の原因ですが、findMaxSubarrayの1行目にバグがあることを確認することはできません。

if (high = low) { 

あなたは明らかにhigh == lowを意味しました。あなたはいくつかのコンパイラ警告を持っているはずです。もしあなたが "const nazi"であれば、コンパイラはこれを捕まえていたはずです...(つまり、警告の代わりにエラー):もちろん、const int highconst int lowを関数定義に入れています(constは宣言で無視されますが、 btw)。

+0

もしあなたが望むなら、私はヘッダファイルをアップロードすることができますが、それが訂正されたすべてのテストに合格したので、それが問題であると仮定するのはかなり安全です。 – kalenpw

+0

OK。あなたがまだ問題を抱えているのを待ってみてください... –

関連する問題