2017-01-30 8 views
2

ポインタがmath.hの一部であるsin、cos、pow、logまたはexpの文字列を指しているかどうかを調べる方法はありますかヘッダーファイル?私は以下の擬似コードを実装する必要がありポインタがmath.h関数を指しているかどうか確認する必要があります

if(ptr is equal to sin,cos,log,exp,pow) 
    Execute code 
else 
    return 0; 
+1

をたぶんもっと極端なあなたが探していますが、あなたがしてdlsym' 'でシンボルを検索できdlopen''とライブラリをロードするとしているよりも、次のような何か。 –

+11

'if(ptr ==&sin || ptr ==&cos ...)'?しかし、なぜあなたはこれをしたいのですか?あなたが解決したい*元の*問題は何ですか? [XY問題に関する関連読書](http://xyproblem.info/)。 –

+0

ポインタは文字列 "sin"、 "cos"または関数ポインタsin、cosですか? –

答えて

1

は私がしているポインタ 罪である文字列へのポイント、COS、POW、ログインするか、expのかどうかを確認することができます方法はありますmath.hヘッダーファイルの一部ですか?

異なる数学を文字列の一致に基づいて呼び出すとします。

あなたはこれを達成するために次のようなデータ構造のようなものを使用することができます。そして、あなたはnfunctionsなしをマッピングするためのデータ構造を作成することができ

// Make a generic function pointer, since no. of arguments differs 
typedef double (*genericfptr)(); 

struct FunMap 
{ 
    const char* funName; 
    genericfptr fptr; 
    unsigned int nargs; 
}; 

// Following could be used to get correct compatible types 
typedef double (*OneArg)(double); 
typedef double (*TwoArg)(double , double); 

を。以下のような引数の:この機能マップテーブルを使用して

struct FunMap fMap[ ] = 
{ 
    { "sin", sin, 1 }, 
    { "cos", cos, 1 }, 
    { "log", log, 1 }, 
    { "pow", pow, 2 }, 
    // .... 
}; 

あなたは私たちの文字列一致に基づいて関数を呼び出すことができます。

if(strcmp(p, fMap[ j ].funName) == 0) 
    { 

     switch(fMap[ j ].nargs) 
     { 
      case 1: 
      result = ((OneArg)fMap[ j ].fptr)(val1); 
      break; 

      case 2: 

      result = ((TwoArg)fMap[ j ].fptr)(val1, val2); 
      break; 

      default: 
      result = 0.0; 
      //assert (false); 
      break; 
     } 
     break; 
    } 

Demo here

関連する問題