2017-01-12 3 views
1

関数を最小化するアルゴリズムの目的関数値を計算するC++プログラムを作成しました。アルゴリズムがどのくらい目的関数の評価をしたかを知りたい。客観的価値関数を呼び出す他の多くの関数もあります。C++プログラムでの関数評価数の報告方法

私はここでデモコードを持っている...

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


using namespace std; 

void prnt(){ 
    static int num = 0; 
    cout << "Hello" << endl; 
    num++; 
    cout << num << endl; 
} 

void callprnt(){ 
    prnt(); 
} 

int main() { 

    for (int i = 0; i < 8; ++i) 
    { 
     prnt(); 
    } 

    for (int i = 0; i < 10; ++i) 
    { 
     callprnt(); 
    } 

} 

あなたが見ることができるように、私はprnt()で目的関数の評価が発生しているどのように多くの機能を表示することができますが、私はこれがメインにアクセスしたいと思います。メインの関数評価の数を効率的に追跡する方法はありますか?

+3

'int型PRNT(){静的int型NUM = 0。 return num; } ' – DeiDei

+2

' static int num = 0; 'を宣言して' main'関数からも見えるようにする必要があります。そうでなければ、スコープ/可視性は定義した関数に限定されます。変数。静的変数は変数の存続期間にのみ影響し、スコープ/可視性には影響しません。 – nbro

+0

@DeiDei実際のprnt()関数はa戻り値double値 – Morpheus

答えて

3

これを解決するにはいくつかの方法があります。

悪いのは、グローバル変数を使用することです。

より良い方法は、カウントの数を返すか、(ポインタまたは参照として)変数を渡して追跡することです。

また、クラスを追跡することもできます。一般的に

using namespace std; 

class Printer 
{ 
public: 
    Printer() : num(0) {} 
    void prnt() { 
     cout << "Hello" << endl; 
     num++; 
     cout << num << endl; 
    } 
    int count() 
    { 
     return num; 
    } 
private: 
    int num; 
}; 

void callprnt(Printer & p) { 
    p.prnt(); 
} 

int main() { 
    Printer p; 
    for (int i = 0; i < 8; ++i) 
    { 
     p.prnt(); 
    } 

    for (int i = 0; i < 10; ++i) 
    { 
     callprnt(p); 
    } 

    cout << "Total count: " << p.count() << '\n'; 
} 

あなたはPrinter実際にカウンターを作り、あなたが呼び出す必要がある機能に渡すことができます。

+0

お返事ありがとうございました。それは私のために少し複雑に思えますが、私はそれを理解しようとします。再度、感謝します :) – Morpheus

0

@nbroはこれで私を助け:

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


using namespace std; 

static int num = 0; 


void prnt(){ 

    cout << "Hello" << endl; 
    num++; 
} 

void callprnt(){ 
    prnt(); 
} 

int main() { 


    for (int i = 0; i < 8; ++i) 
    { 
     prnt(); 
    } 

    for (int i = 0; i < 10; ++i) 
    { 
     callprnt(); 
    } 

    cout << "The total number of iterations is " << num << endl; 

} 

、これが最善の方法か、それが少し良く行うことができる場合であれば、私は少しわかりませんよ。

それを行うには良い方法があるように見える。..

1

あなたがC++ 17を使用することができる場合は、あなたがこれを行うことができます:あなたは、次を使用することができますC++ 14では

#include <iostream> 

template<auto> struct counter { static int value; }; 
template<auto F> int counter<F>::value = 0; 

void prnt() { ++counter<&prnt>::value; } 
void callprnt() { ++counter<&callprnt>::value; prnt(); } 

int main() { 
    for (int i = 0; i < 8; ++i) { prnt(); } 
    for (int i = 0; i < 10; ++i) { callprnt(); } 
    std::cout << counter<&prnt>::value << std::endl; 
    std::cout << counter<&callprnt>::value << std::endl; 
} 

を定義:

とにかく、それらは機能タイプvoid(void)に制限されています。
少しの作業で、あらゆる種類の関数型を受け入れるように、おそらくソリューションを適合させることができます。最小限、実施例として

#include <iostream> 

template<typename R, typename... A> 
struct family { 
    template<R(*)(A...)> 
    struct wrapper { 
     static int value; 
    }; 
}; 

template<typename R, typename... A> 
template<R(*F)(A...)> 
int family<R, A...>::wrapper<F>::value = 0; 

template<typename R, typename... A> 
constexpr family<R, A...> fam(R(*)(A...)); 

void prnt() { ++decltype(fam(&prnt))::template wrapper<prnt>::value; } 
void callprnt() { ++decltype(fam(&callprnt))::template wrapper<callprnt>::value; prnt(); } 

int main() { 
    for (int i = 0; i < 8; ++i) { prnt(); } 
    for (int i = 0; i < 10; ++i) { callprnt(); } 
    std::cout << decltype(fam(&prnt))::template wrapper<prnt>::value << std::endl; 
    std::cout << decltype(fam(&callprnt))::template wrapper<callprnt>::value << std::endl; 
} 
関連する問題