ページ 11

関数が順番通りに呼ばれているかプログラム内で確認する

Posted: 2010年4月24日(土) 06:59
by dic
最近はオブジェクト指向が流行ってますが、私は構造体設計でいこうかとしてます
そこで、構造体設計で重要な、順番通りに関数(モジュール)を呼び出しているか確認する機能を
作りたいと考えました
下は実装してみて、いまのところうまくいってるのですが、どこか漏れなどないでしょうか?
もしくは、なんらかこういったライブラリがあるなどあったら教えてもらえるとうれしいです
#include <stdio.h>

static    int    stack[10];
static    int    p;

//    Step1 -> 1
//    Step2 -> 2
//    Step3 -> 3

//-----------------------------------------------------
//    check
//        前回呼ばれた関数のIDがいっこまえのものか確認する
bool    check( int back )
{
    if( p == 0 )
    {
        printf( "スタックが空です\n" );
        return false;
    }

    if( p == 1 )
    {
        if( stack[p-1] == 1 )
            return true;
        else
            return false;
    }

    if( stack[p-2] == back )
        return true;

    return false;
}
//--------------------------------------------------------
//    スタックに保存する
void    add( int NEW )
{
    stack[p++] = NEW;
}

void    Step3()
{
    add( 3 );    //    この関数のIDを登録する
    if( !check( 2 ) )    //    前回のIDを確認する
        printf( "call error.\n" );
    else
        printf( "Step3\n" );
}
void    Step2()
{
    add( 2 );    //    この関数のIDを登録する
    if( !check( 1 ) )    //    前回のIDを確認する
        printf( "call error.\n" );
    else
        printf( "Step2\n" );
}
void    Step1()
{
    add( 1 );    //    この関数のIDを登録する
    if( !check( 0 ) )    //    前回のIDを確認する
        printf( "call error.\n" );
    else
        printf( "Step1\n" );
}

//-----------------------------------------------------
int    main()
{
    Step1();
    Step2();
    Step3();

    Step2();
    Step1();
    Step3();

    return 0;
}

Re:関数が順番通りに呼ばれているかプログラム内で確認する

Posted: 2010年4月24日(土) 08:25
by Poco
この手の話は環境依存になりますが、VC++なら/Ghオプションと
下のリンクにあるものを流用すれば、もっと華麗な実装に
なると思います。
#C言語で実現しようとしているんですよね?

http://www.codeproject.com/kb/threads/StackWalker.aspx

Re:関数が順番通りに呼ばれているかプログラム内で確認する

Posted: 2010年4月24日(土) 09:02
by たいちう
> そこで、構造体設計で重要な、順番通りに関数(モジュール)を呼び出しているか確認する機能を
> 作りたいと考えました
> 下は実装してみて、いまのところうまくいってるのですが、どこか漏れなどないでしょうか?

何をやりたいのか全くわかりませんが、努力の方向性が間違ってませんか?
何をもってうまくいっていると判断できるのでしょうか。
stack[100]程度まで増やして、main関数からの呼び出しのバリエーションを
充実させてみてはどうかと。漏れがあるかどうか判断しやすくなります。

また前回呼び出した関数を調べるだけならば、スタックは不要です。
Step1などで、addする前にcheckすれば良いので、変数が1つだけあれば良いです。

Re:関数が順番通りに呼ばれているかプログラム内で確認する

Posted: 2010年4月24日(土) 10:11
by box
> 私は構造体設計でいこうかとしてます

構造体設計とは、何のことでしょうか?
構造化プログラミングなら、聞いたことがあるような気がします。

Re:関数が順番通りに呼ばれているかプログラム内で確認する

Posted: 2010年4月24日(土) 11:22
by dic
>ぽこさん
参考URLありがとうございます
英語なので、読めないですが参考になります
正確に言うとCだけではなくC/C++ですね

>たいちうさん
たしかに前回呼び出した関数だけに絞ればスタックはいらないですね

>boxさん
構造化プログラミングですね
色々用語があり混乱してます(汗


何をやりたいかというと、関数を間違った順番で呼ばれたらエラーもしくは警告の
メッセージを表示する機能を追加し、コンパイラでは拾えないバグを見つけようと
してます

Re:関数が順番通りに呼ばれているかプログラム内で確認する

Posted: 2010年4月25日(日) 17:16
by dic
解決ってことで
ご意見ありがとうございました