A 回答 (7件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
一般にムリ。
関数名が funcA, funcB, funcC のどれかであることがあらかじめわかっているなら
char* name; /* ファイルから読み取った関数名 */
if ( strcmp(name,"funcA")==0 ) { funcA(); }
if ( strcmp(name,"funcB")==0 ) { funcB(); }
if ( strcmp(name,"funcC")==0 ) { funcC(); }
No.2
- 回答日時:
★アドバイス
・スクリプト言語でも開発しているのでしょうか?
読み込んだ関数名の文字列と関数のポインタをセットで構造体で管理して実行する方法が
一番良いと思いますが。
・どういう理由で読み込んだ関数を実行したいのですか?
もうちょっと全体像が見えるような補足をお願いします。
・それでは。また。
No.3
- 回答日時:
Windowsでしか通用しない方法ですが
関数の部分をdll化し
::LoadLiblary(dllのファイル名)
↓
::GetProcAddress(dllのハンドル,関数名)
として関数のアドレスを取得し
その関数を実行する事は可能です。
No.4
- 回答日時:
(1)までできた所を乗せるとよいでしょう。
#2さんが言っているものを簡単なサンプルにしました。
#include <stdio.h>
#include <string.h>
#define MAXFUNCNAMELEN (256)
#define MAXLINEBUFFLEN (1024)
//関数テーブル登録用の関数ポインタ型定義
typedef int(*PFUNC)( void );
//関数名と関数のアドレスを格納する構造体
typedef struct script{
char funcname[MAXFUNCNAMELEN];
PFUNC funcaddr;
}SCRIPT;
//登録する関数の宣言
int print( void );
int print2( void );
//関数名と関数アドレスのテーブル定義
const SCRIPT funclist[] = {
{ "print", print },
{ "print2", print2 },
{ "" , NULL },
};
int main( int argc, char* argv[] )
{
int i;
FILE *fp;
char line[MAXLINEBUFFLEN];
fp = fopen( "script.txt", "rt" );
if( !fp ){
return 1;
}
//ファイルを終わりまで読む
while( fgets( line, MAXLINEBUFFLEN, fp) != NULL ){
//登録されている関数名すべてと比較する
for( i=0; funclist[i].funcaddr!=NULL; i++ ){
//一行の文字列が関数名と一致したか
if(!strncmp( line, funclist[i].funcname, strlen(funclist[i].funcname))){
//一致したらその関数を実行
funclist[i].funcaddr();
}
}
}
fclose( fp );
return 0;
}
int print( void )
{
printf("print呼び出し\n");
return 0;
}
int print2( void )
{
printf("print2呼び出し\n");
return 0;
}
読み込むテキストの内容
print2
<<このサンプルの制限>>
・一行に一関数しか書けず他の文字も掛けない
・引数は渡せない
・インデントが全角スペースです
このサンプルは最もテキトーに作られたものです。
DLLなどでプラグインできるようにすると使い勝手もよくなるでしょう。
#経験上最大の敵は引数でした。
No.5
- 回答日時:
#4です。
下のサンプル実行して気づきましたが、
直前までの関数名が同じだと、数回実行されてしまいますね。。。
以下のようにしてください。。。
修正前
const SCRIPT funclist[] = {
{ "print", print },
{ "print2", print2 },
{ "" , NULL },
};
修正後
const SCRIPT funclist[] = {
{ "print\n", print },
{ "print2\n", print2 },
{ "" , NULL },
};
修正前
if(!strncmp( line, funclist[i].funcname, strlen(funclist[i].funcname))){
修正後
if(!strcmp( line, funclist[i].funcname )){
改行文字変換面倒だったので手を抜いたのが仇となったようです。。。
No.6
- 回答日時:
処理系を特定するか、関数名と関数へのポインタの対応表を作るかしかありません。
処理系を特定する方法として考えられるのは...
1. CINTのようなC/C++インタプリタであれば、再帰的に実行することで実現可能かと思います。
2. すでに回答が出ているように、DLLなどの共有ライブラリを使う方法があります。
3. プログラムのシンボルテーブルを読み込ませることで、関数のアドレスを知る方法があります。
関数というのがC/C++の関数ではなく、専用のものでよいなら、独自のインタプリタ機能を持たせることで実現することも可能です。
No.7
- 回答日時:
ret = _spawnl(_P_WAIT, ecp1, ecp1, eck1, ecpath0, ecpath1,NULL);
とします。
昔のC言語の関数です。
VC++6.0から呼び出せます。
_spawnl
について調べてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel VBAで教えてください 4 2022/05/11 22:20
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Excel(エクセル) LEFT関数で文字数を指定しないで取りだす方法 7 2023/06/30 09:49
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Excel(エクセル) 【Excel】複数列ごとに取得するセルを変更したい 2 2023/03/23 21:04
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16進の10進変換について
-
【至急!!!】python言語で本を見...
-
パイソンのクラスについて
-
Pythonでターミナルに文字を出...
-
文字のカラーとフォントの指定...
-
int(input("○○"))の使い方
-
awk の int()に関数について
-
Pythonでコンソールをクリアす...
-
小数点付きの余分な桁を消すには
-
コーディングについて
-
PerlCGIでクエリの検索結果が途...
-
I2C接続のLCDディスプレイを使う
-
$(ドル)の記号を表示したいの...
-
Adafruit LIS3DH 3軸加速度セン...
-
favicon.ico
-
pythonを使ったプログラミング...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
formで特定のinputを送信しない...
-
どちのほうがすきですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
Pythonでターミナルに文字を出...
-
シェルスクリプトで、空白(ス...
-
【至急!!!】python言語で本を見...
-
pythonで演算子を変数に代入す...
-
c言語 16進数の2進数への変換
-
パイソンのクラスについて
-
I2C接続のLCDディスプレイを使う
-
関数「exists」と「defined」の...
-
pythonの*
-
変数の中は文字列か数値か調べ...
-
数値かどうかの判定方法
-
python print文のエラー
-
int(input("○○"))の使い方
-
Perlの例文でif($a==1&&$b==5&&...
-
awkの正規表現での最左最短マッ...
-
Use of uninitialized value ---
-
CGIでimgタグでalignを使うとエ...
-
swift 文字コードから文字に変...
-
javaのパッケージ構成で各パッ...
おすすめ情報