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でコンパイルしようとしましたが、それは私にこれに関連すると思われなかったさまざまなエラーの束を与えました。
デバッガの下でプログラムを実行し、エラーが発生したときの変数の値を確認します。 – Barmar
問題のあるコードの部分をコメントにしないでください。 SOの強調表示により、そのコードを読むのが難しくなります。 – Barmar
'-Wall'からの警告が関連しているとは思わない場合でも、修正する必要があります。あなたは確かに分かりません。 – Barmar