2016-03-27 12 views
0

私はナップザック問題のための貪欲アルゴリズムのために、次のコードでセグメンテーションフォールトを取得しています。前にセグメンテーション違反を解決したことはありませんでしたが、私はそれらを見たことがありますので、助けていただければ幸いです。セグメンテーションフォールト:そのようなファイルやディレクトリ

私は、デバッガを実行したときに私が得るメッセージには、「malloc.c」がないことです。 valgrindを実行すると、「無効なサイズ4の読み込み」が表示されます。それとバグの性質の間に、私は存在しないベクトル要素にアクセスしようとしていると推測しています。しかし、私は、ベクトルを反復するときに、ループがその境界を越えていないことを確かめてみることを考えていました。

(私はループのためにC++ 11の範囲ベースを使用せずにこれを行って、まだ同じエラーを取得しました。それは私がのためにループのパラメータのために選択するかは重要とは思われない、それはまだ投げますセグメンテーションエラー)

ありがとうございます。右が、あなたの問題だ

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <stdlib.h> 

using namespace std; 

bool decreaseSort(int a, int b) 
{ 
    return a > b; //sort by decreasing value for better performance 
} 

double get_optimal_value(int capacity, vector<int> weights, vector<int> values) { 

sort(weights.begin(),weights.end(), decreaseSort); 
sort(values.begin(),weights.end(), decreaseSort); 

vector<int> ourKnapsack(values.size(), 0); 

double totalValue = 0.0; 
int ourInput = 0; 

for (auto i : ourKnapsack){ 
    int ourValue = values.at(i); 
    int ourWeight = weights.at(i); 
    double unitValue = (double)ourValue/ourWeight; 
    if (capacity == 0) 
     return totalValue; 


    if (weights.at(i) < capacity){ 
     ourInput = weights.at(i); 
    } 
    else { 
     ourInput = capacity; 
    } 


    totalValue = totalValue * (ourInput * unitValue); 
    weights.at(i)-=ourInput; 
    ourKnapsack.at(i)+=ourInput; 
    capacity-=ourInput; 

} 
return totalValue; 
} 

    int main() { 
    int n = 3; 
    int capacity = 50; 

    vector<int> values(n); 
    values = {60,100,120}; 
    vector<int> weights(n); 
    weights = {20,50,30}; 

    double optimal_value = get_optimal_value(capacity, weights, values); 

    std::cout.precision(10); 
    std::cout << optimal_value << std::endl; 
    return 0; 
} 
+0

私はそう全く私は言葉「セグメンテーション」を見たので、ベクターおよびループを扱うコードに焦点を当て、しかしでソート見えることを怠っていた...ありがとうございました。 – Anonymous

+0

これは「未定義の動作」が意味するものです。それは「即座のセグメンテーション違反」を意味するものではありません。これは、「この時点から何かが起こる可能性がある」という意味です。即時セグメンテーション・フォールトは1つの可能性である。コードは、しばらくの間、やがて刈り取られ、後で吹き飛ばされる可能性もあり、「未定義の振る舞い」として完全に修飾されています。 C++へようこそ。 –

答えて

2
sort(values.begin(),weights.end(), decreaseSort); 

。おっとっと。

もちろん、それはvalues.end()、ないweights.end()でなければなりません。

関連する問題