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

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

ただいまの
回答率

90.51%

  • C++

    4426questions

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

  • VC++

    160questions

    VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,889
退会済みユーザー

退会済みユーザー

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

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

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

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


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

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

現在の実装

...
typedef int(*function)(std::string* arg);
std:map<std:string, function> map;

static void func1(std::string* arg)
static void func2(std::string* arg)
static void func3(std::string* arg)
...
void main(){
  int count;
  function funcptr[10];
  std:string func_name,arg;

  map_init();

  //テキストの読み込み処理を行う

  for(int i=0; i<count; i++){
    //("Func%d",i)の読み込み
    //("Argument%d",i)の読み込み
    (map[func_name])(&arg)
  }  
}

viod map_init(){
  map["func1"]=&func1;
  map["func2"]=&func2;
  map["func3"]=&func3;
}

void func1(std::string* arg){
  //処理
}

実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

こんにちは。

もしかして、そのテキスト・ファイルを読み込んだ場合は、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のリフレクションを使えばプログラムの実行中に型を生成できますから、コンパイル後に組合せを生成することは可能な筈です。
しかし、リフレクションは特殊なプログラミング技術ですので、コンパイラやインタプリタの仕組みを把握していない初心者の方が学ぶのは危険かも知れません。プログラミングについての基本的な仕組みを勘違いする可能性を恐れます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/18 10:09

    回答ありがとうございます。
    実装方法としてはmaisumakunさんの回答されている物だったつもりです(わかりにくくてすみません...)

    mapしている関数の引数はすべて文字列一つなのですが文字列で渡したとしてその文字列を変数に変換する方法を知りたいのです。
    質問に現在までの実装を追記しておきます。

    キャンセル

  • 2017/04/18 10:28

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C++

    4426questions

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

  • VC++

    160questions

    VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。