2017-11-15 16 views
0

バイナリ検索を実行してテストするために書いています。目的は、関数y = x-1に対してy < = 0であり、検索範囲が[-2,2]のとき最大xを求めることです。明らかに答えは1になります。 テスト部分では、関数fの呼び出しがセグメンテーションフォールトが現れ、計算max_invoke 未満であり、ときに私はそれをvalgrindの、エラーがある:以下初期化されていない値がスタック割り当て、セグメンテーションフォールトによって作成されました

==126667== Use of uninitialised value of size 8 
    ==126667== at 0x400C8A: binarySearchForZero(Function<int, int>*, int, 
    int) (in /home/jw562/ece551/092_tests_binsrch/test) 
    ==126667== by 0x400DD5: check(Function<int, int>*, int, int, int, 
    char const*) (in /home/jw562/ece551/092_tests_binsrch/test) 
    ==126667== by 0x400E81: main (in 
    /home/jw562/ece551/092_tests_binsrch/test) 
    ==126667== Uninitialised value was created by a stack allocation 
    ==126667== at 0x400E41: main (in 
    /home/jw562/ece551/092_tests_binsrch/test) 

私のコードです:

#include <iostream> 
    #include <cstdlib> 
    #include <cstdio> 
    #include <cmath> 

    using namespace std; 

    template<typename R, typename A> 
    class Function { 
    public: 
     virtual R invoke(A arg) = 0; 
     virtual ~Function() {} 
    }; 

    class CountedIntFn : public Function<int,int>{ 
    protected: 
     unsigned remaining; 
     Function<int,int> * f; 
     const char * mesg; 
    public: 
     CountedIntFn(unsigned n, Function<int,int> * fn, const char * m): 
     remaining(n),f(fn),mesg(m) {} 
     virtual int invoke(int arg) { 
     if (remaining == 0) { 
      fprintf(stderr,"Too many function invocations in %s\n", mesg); 
      exit(EXIT_FAILURE); 
     } 
     remaining--; 
     return f->invoke(arg); 
    } 

    class linearFunction : public Function<int, int> { 
     public: 
     virtual int invoke(int arg) { 
     int ans = arg-1; 
     return ans; 
     } 
     virtual ~linearFunction(){} 
    }; 

    int binarySearchForZero(Function<int, int> * f, int low, int high){ 
     if (high <= low){ 
      cout << "high less or equal than low" << endl; 
      return EXIT_FAILURE; 
     } 
     int low_ans = f->invoke(low); 
     int high_ans = f->invoke(high); 
     int mid = (high-low)/2+low; 
     int mid_ans = f->invoke(mid); 
     if (low_ans > 0){ 
      return low;//all positive 
     } 
     if (high_ans < 0){ 
      return high-1;//all negtive 
     } 
     if (low_ans = high_ans){ 
      return low;//all zero 
     } 
     if (mid_ans <= 0){ 
      low = mid; 
     } 
     if (mid_ans >= 0){ 
      high = mid; 
     } 
     return binarySearchForZero(f,low,high); 
     } 

     void check(Function<int,int> * f,int low,int high,int 
     expected_ans,const char * mesg){ 
     int max_invoke = 0;//the maximum number of invocations allowed 
     if (high > low){ 
      max_invoke = (int)(log2(high-low))+1; 
     } 
     else { 
      max_invoke = 1; 
     } 
     CountedIntFn count(max_invoke,f,mesg); 
     int ans = binarySearchForZero(f,low,high); 
     if (ans != expected_ans){ 
      cout << "wrong answer" <<endl; 
     } 
     } 

     int main(void){ 
     linearFunction *fl; 
     const char * message = "linearFunction"; 
     int low = -2; 
     int high = 2; 
     int expected_ans = 1; 
     check(fl,low,high,expected_ans,message); 
     return EXIT_SUCCESS; 
     } 
+2

それはあなたの質問が何であるかすぐには明らかではありません。なぜセグメンテーションフォルトが発生しているのかを知りたい場合は、「なぜこのコードはセグメンテーションフォルトを生成するのですか?」という文章を編集することができます。 また、かなりの量のコードを投稿しました。エラーを示している可能性のある最小限の例を構築すると、助けを得る可能性が高くなります。 – MatrixManAtYrService

答えて

0

これが原因変数でありますlinearFunction*flは初期化されていません。

あなたは非ポインタに変更して、アドレス演算子を呼び出すことができます。

linearFunction fl; 
... 
check(&fl, low, high, expected_ans, message); 
関連する問題