2012-04-24 6 views
1

私はC/C++で(可能ならば)次のことができるようにしたい。C/C++でフックを使用しないで実行時に変数を変更しますか?

私はこのようなファイルを持っている:

Initialvariables.txt
= 5
B = 2
C = 8

そして、このようなコード:

int main(int argc char *argv[])
{
int a;
int b;
int c;

LoadInitialVariables("Initialvariables.txt");
}

ここで、a、b、cは変数で、ファイル "Initialvariables.txt"にはコンパイル後に変更できる初期値が含まれています。

LoadInitialVariablesを作成して、新しい人物がコードを変更した場合、新しいintを追加して「initialvariables.txt」に新しい行を追加するだけでコードが残りの部分を設定するように設定できますか初期変数を上げる?

目的は、ハードコードされたフックを持つのではなく、LoadInitialVariablesを可能な限り一般的なものにすることです。

私にとって難しいのは、コンパイラが記号を取り除いて、実行可能ファイルが適切なフックなしでa、b、cなどが分からないという事実から来ているようです。可能であれば、フックを指定する必要はありません(単にintを装飾しない限り)。

+1

ファイルを数字だけにすることができれば、読み込んでベクトルに格納して戻すのは簡単です。数字だけでなく、同じ原則が適用されますが、ファイル内の他のテキストを迂回しなければなりません。 – chris

答えて

2

あなたは例えば、必要な時はいつでもあなたは名前でint値を参照することができ、std::map<std::string, int>LoadInitialVariables()負荷のテキストファイルを持つことができます:

void LoadInitialVariables(const std::string &fileName, std::map<std::string, int> &variables) 
{ 
    variables.clear(); 

    char name[256]; 
    int value; 

    for (each line in the file) 
    { 
     std::string line = ...; 
     if (sscanf(line.c_str(), "%s = %d", name, &value) == 2) 
      variables[name] = value; 
    } 
    ... 
} 

int main(int argc char *argv[]) 
{ 
    std::map<std::string, int> variables; 
    LoadInitialVariables("Initialvariables.txt", variables); 

    int a = variables["a"]; 
    int b = variables["b"]; 
    int c = variables["c"]; 
    ... 
} 
2

なぜstd::map<string, int>を使用しないのですか?

あなたが提案しているものは、ベクタやマップを使用せずに後でそれを反復処理しないと意味がありません。ユーザーがメイン変数に変数を追加して、読み込み関数で解析して割り当てるコードを追加した場合、既存のコードはそれ以上の変更なしにはそれを知ることができません。

1

は、そのような場合は、そのLoadInitialVariablesを作成することが可能です新しい人はコードを変更するために来た、彼らは単に新しいintを追加し、 "initialvariables.txt"に新しい行を追加すると、コードは初期変数を設定するために残りの部分を行うのだろうか?

しかし、プログラマは、ファイル・パーサによって設定できる変数を登録していると支持層を構築するためにひどく難しいことではありません。最も簡単な手段は、VBRonPaulFan suggestsというC++ std::map<std::string, int>です。 Cでは、もう少しコードを書く必要がありますが、これは数十行の行で実行することができます(1つのタイプをサポートする必要がある場合は、合理的ですが固定タイプのセットをサポートするために数百種類が必要です)。

0

reflectionをお探しですか?少なくともC++では利用できません。あなたはいつも恐ろしいCスタイルのマクロを何かすることができます...

#define READ_FROM_FILE(X) X = some_function_that_greps_file_for(#X) 

int a, b, c; 
READ_FROM_FILE(a); 
READ_FROM_FILE(b); 
READ_FROM_FILE(c); 

しかし、それは多くの、より簡単、安全、かつmap<string, int>を使用して、保守です。

関連する問題