2011-06-28 7 views
1

ユーザーが4文字以上入力すると、無効なパラメータハンドラを呼び出すために次のコードを使用しました。実際には、ハンドラを呼び出す関数gets_s()です。gets_s()のような無効なハンドラ関数を呼び出す方法は?

... 
    char arr[5]; 
    _invalid_parameter_handler newHandler; 
    newHandler = myInvalidParameterHandler; 
    _set_invalid_parameter_handler(newHandler); 

    gets_s(arr,4); 
... 
} 
void myInvalidParameterHandler(const wchar_t* expression,const wchar_t* function, 
    const wchar_t* file, 
    unsigned int line, 
    uintptr_t pReserved) 
{ 
... 
} 

さて、私の質問はどのようにgets_s(ある)が呼び出されます/内部ハンドラが呼び出されます?私は私のprogram.Forなどで同様の何かをしたいので、私はこれを求めています。

上記のコードを実行しているときに、ユーザーが4つ以上の文字を入力した場合、その後ハンドラは、私は不正なハンドラ関連のコードをコメントアウトinvoked.Ifですその後、私のプログラム:私は

EDIT like-宣言された関数を持って言うことができます私は達成したいと思います。 もし私の機能を使う人がいたら、gets_s.を使ったときと同じ振る舞いになるはずです。これは良いか悪いかを示唆しないでください。ちょうどit.gets_sが私が設定しようとしているハンドラfuncを知りたくありません。同様に私の関数は、ユーザーが設定する無効なハンドラ関数を知らない。私は_set_invalid_parameter_handler()関数がgets_sが使うものを設定する_invalid_parameter_handler型のCランタイムグローバル変数があると思う。

答えて

1

私の意見では、13は同じです。そうですね。すべての関数がグローバルな構造体の中の関数ポインタを呼び出すようにしてください。

  • 関数が何か間違ったことを検出すると、それはそれををしないハンドラ

しかしを呼び出すことができる関数ポインタを含むグローバルオブジェクトといくつかの簿記DAT

  • を設定します。何か「間違っている」と間違っているときに自動的に関数を呼び出すよりもエラー状態を返すほうが良い方法です。次に、いくつかの自動ハンドラーを引き継ぐ代わりに、戻り状況を確認してそれに対処することができます。私はあなたがについてfunction pointersを知らないと考えているあなたのコメントから

    EDIT

    [in] pNew関数ポインタ 新しい無効なパラメータハンドラに:

    /* here is the handling function */ 
    void handler(char *msg) 
    { 
        fprintf(stderr, "%s\n", msg); 
    } 
    
    void (*err_handler) 
    
    void some_function_like_gets(void *arg) 
    { 
        if (NULL == arg) { 
         (*err_handler)("Oh noes! You passed a NULL pointer :("); 
         return; 
        } 
    
    } 
    
    
    int main() 
    { 
        /* ... */ 
    
        /* setting up handler */ 
        err_handler = handler; 
    
        /* calling function */ 
        some_function_like_gets(NULL); 
    
        /* ... */  
    } 
    

    EDIT 2

    悲しい部分は、あなたがthe MSDN pageが言うにもかかわらず、これをdownvotedということです。

  • +0

    はい私はいくつかの '失敗コード'を返すことができますが、他の関数ではなく '_set_invalid_parameter_handler'によって設定されたハンドラを呼び出す方法を学びたいと思います。 – rsjethani

    +0

    @ryanlancer私はあなたが関数ポインタについて知らないと思います。私は私の答えを編集しました。 – cnicutar

    +0

    @cnicutar編集部分をご覧ください。 – rsjethani

    関連する問題