質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

10164閲覧

文字列を変数に変換したい

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2017/04/18 00:50

編集2017/04/18 02:28

VC++にて、外部にから既定の書式のテキストファイルを読み込み実行する関数とその関数の引数を指定する。ということを実現したいのですが、関数については関数名の文字列と関数ポインタをmap<string, func>で紐付け呼び出す方針で実装を行っているのですが変数では型も一定ではないので同じやり方はできなさそうです。

現在の考えでは、引数は型、数とも不定なのでテキストに「;」区切りで変数名を記載し、コード内で分割、それぞれの文字列と変数名がイコールになるものを返す。という流れで考えていますが実装方法がさっぱりです。。。

以下テキストファイルの書式です。

Func_Count=1 //実行するfuncの数 Func1="function1" //関数名 Argment1="aaa;bbb" //func1の引数

テキストの読み込みはapiが提供されているのでダブルクォーとの間の文字列が取得できるようになっています。

不足情報等ありましたら追記いたします。

###現在の実装

main.h

1... 2typedef int(*function)(std::string* arg); 3std:map<std:string, function> map; 4 5static void func1(std::string* arg) 6static void func2(std::string* arg) 7static void func3(std::string* arg) 8...

main.cpp

1void main(){ 2 int count; 3 function funcptr[10]; 4 std:string func_name,arg; 5 6 map_init(); 7 8 //テキストの読み込み処理を行う 9 10 for(int i=0; i<count; i++){ 11 //("Func%d",i)の読み込み 12 //("Argument%d",i)の読み込み 13 (map[func_name])(&arg) 14 } 15} 16 17viod map_init(){ 18 map["func1"]=&func1; 19 map["func2"]=&func2; 20 map["func3"]=&func3; 21} 22 23void func1(std::string* arg){ 24 //処理 25} 26

###実現したいこと
書いていて自分でもわからなくなってきましたが、
やりたいことはソースコードに手を加えることなく実行する関数を変更するということです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

こんにちは。

もしかして、そのテキスト・ファイルを読み込んだ場合は、function1(aaa, bbb);を呼び出すプログラムを書きたいということでしょうか?
そして、このaaaやbbbはテキスト・ファイルで修正して、function1(int_variable);としたり、function1(double_variable, short_variable, unsigned_variable);などと自由に書き換えたいと言う意味でしょうか?
もしそうであれば、残念ながら、VC++はコンパイラなので通常のC++の範疇では事実上できません。

C++はかなり厳密な静的型付け言語ですので、コンパイルする時にfunction1(aaa, bbb);の意味に解釈されるソース・コードが存在しない限り、function1(aaa, bbb);を呼び出すことができません。
そのため、コンパイルした後でテキスト・ファイルにてfunction1と引数リストを自由に組み合わせることはできないのです。コンパイルする前にそれらの組合せがソースの中に存在していることが必要です。

.NET言語の一つであるC++/CLIのリフレクションを使えばプログラムの実行中に型を生成できますから、コンパイル後に組合せを生成することは可能な筈です。
しかし、リフレクションは特殊なプログラミング技術ですので、コンパイラやインタプリタの仕組みを把握していない初心者の方が学ぶのは危険かも知れません。プログラミングについての基本的な仕組みを勘違いする可能性を恐れます。

投稿2017/04/18 01:44

編集2017/04/18 01:46
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

入力されたプログラム(テキスト)の意味するところを解析し、実行するシステムを作ろうとなさっているのだと思います。
そうしたシステムは大きく分けてプログラム全体を一気に実行コードに変換して実行するタイプのコンパイラと、部分的に解釈して実行していくタイプのインタプリタがあります。

下記は、BASICインタプリタ記事です。テキストで与えられたプログラムを実行するために何が必要であるか等、参考になる情報が含まれているのではないかと思いますので、紹介します。

プログラム言語を作る! Part3 超小型BASICインタプリタを作ってみよう

投稿2017/04/18 01:27

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

無理やりやるとすれば、型情報や引数の順番も保管してやることになるとは思いますが、かなり煩雑になることが予想されます。

それよりは、「引数は文字列1つ」と決めておいて、その文字列をパースして本来の処理に渡すフロントエンドをmapに入れておく、という形のほうがやりやすいのではないかと思います。

投稿2017/04/18 00:55

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/04/18 01:09

回答ありがとうございます。 実装方法としてはmaisumakunさんの回答されている物だったつもりです(わかりにくくてすみません...) mapしている関数の引数はすべて文字列一つなのですが文字列で渡したとしてその文字列を変数に変換する方法を知りたいのです。 質問に現在までの実装を追記しておきます。
maisumakun

2017/04/18 01:28

文字列をパースする関数は、全部共通ではなく呼ぶ関数ごとに作る、ということを前提に考えていましたが、それで問題ないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問