1

C/C++で(可能であれば)次のことができるようになりたいです。

次のようなファイルがあります。

初期変数.txt
a = 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」には、コンパイル後に変更される可能性のある初期値が含まれています。

新しい人がコードを変更するためにやって来た場合、新しい int を追加して「initialvariables.txt」に新しい行を追加するだけで、コードが残りを実行して初期値を設定するように、LoadInitialVariables を作成することは可能ですか?変数?

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

私にとっての難しさは、コンパイラがシンボルを削除するため、適切なフックがないと実行可能ファイルが a、b、c などを認識できないという事実から来ているようです。可能であれば、フックを指定する必要はありません(単に int を装飾する場合を除きます)。

4

4 に答える 4

2

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

あなたが提案していることは、ベクターまたはマップを使用して後で反復処理しないとあまり意味がありません。ユーザーが変数をメインに追加し、それを解析してロード関数に割り当てるコードを追加した場合...既存のコードは、さらに変更しない限り、それを知る方法がありません。

于 2012-04-24T01:38:10.323 に答える
2

LoadInitialVariables()テキスト ファイルを にロードし、必要に応じて名前std::map<std::string, int>で値を参照できます。たとえば、次のようになります。int

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"];
    ...
}
于 2012-04-24T01:40:11.840 に答える
1

新しい人がコードを変更するためにやって来た場合、新しい int を追加して「initialvariables.txt」に新しい行を追加するだけで、コードが残りを実行して初期値を設定するように、LoadInitialVariables を作成することは可能ですか?変数?

いいえ。

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

于 2012-04-24T01:41:46.697 に答える
0

あなたは反省を求めていますか?少なくともそのままでは、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>.

于 2012-04-24T01:50:40.197 に答える