2009-08-18 41 views
1

重複の可能性:
call a function named in a string variable in c
Dynamically invoking any function by passing function name as string文字列をCの関数ポインタにキャストするには?

私が言う..特定の機能を持って、

double fA1B1C1(..) { 
     ... 
} 

double fA2B2C3(..) { 
     ... 
} 

double (*fptr)(..); 

fptr myfunc; 

これらの機能は、すでに定義されています。ユーザーが文字列「A2B2C2」を入力するとき

だから、それが変数になったと「fA2B2C2」

myfunc = formatted_string; // DOES NOT WORK 

に変換しかし、上記の構文は動作しませんされています。型キャストしても動作しません。

myfunc = (fptr) formatted_string // DOES NOT WORK 

しかし、私はハード

myfunc = fA2B2C2(または)myfunc = &fA2B2C2としてそれをコーディングする場合、それはpefectly動作します。

どこが間違っていますか?

EDIT ::

I tried creating a hash table and a lookup function. Like 

create_hashEntry(hashtable, string, formatted_string); 
// string = "A1B1C1; formatted_string = "fA1B1C1" 

ルックアップ機能

myfunc lookup_func(char *string) { 
     return(get_hashEntry(hahstable, string)); 
} 

これも動作するように失敗しました。

+0

重複:http://stackoverflow.com/questions/1118705/call-a-function-named-in-a-string-variable-in-c – GManNickG

+4

スクリプト言語としてCを間違えています。 –

+0

*(名前、関数)のペアをハッシュテーブルに追加しましたか?はい? (そしてあなたもルックアップ機能を実行する前に?)あなたのコードはこれを表示せず、コメントだけを表示します。 – dave4420

答えて

2

Cで文字列を関数ポインタに変換することはできません。使用する関数を決定するには、文字列の内容をチェックする必要があります。

+1

...できれば、それは愚かに大きなセキュリティホールになるでしょう。 –

2

duplicateを読むと、あなたの答えが見つかります。

これは、プログラムの仕組みの誤解から来たものですが、追加したいと思います。

これらの機能はメモリ内のアドレスにあります。文字列はアドレスではありません。コード内の関数の名前は、そのアドレスと同義です。実行時に、文字列を持つことは実際に文字を持つメモリ内のいくつかの場所へのポインタを持っているだけです。これは関数名のようにコンパイル時に行われることとは関係ありません。

一部の言語には、プログラムに関するメタデータが含まれています。つまり、に実行時に関数、名前、パラメータなどに関する情報を持ちます。 C++はこれらの言語の1つではありません。

ほとんどの回答は、このメタデータの一種のシミュレーションです。関数が格納され、実行時に文字列を使用してテーブルを覗くことができます。

+0

私の編集したポストを見てください。 –

0

Cの文字列は、charの配列へのポインタです。関数ポインタは、実行可能なマシンコードのポインタです。シンプルな型キャストを使用して一方を他方に変換することができますが、それらは完全に異なるものです。

+0

実際には、この規格はキャストを実行する能力、AFAIKを保証しません。 (すなわち、ポインタは異なるサイズであってもよい) – EFraim

2

実際には、機能がexternである場合、いくつかの超悪魔的な悪いダイナミックローダートリッキーでこれを行うことはできませんか?

関連する問題