1

C は初めてなので、ご容赦ください。3 つの char * 変数 、opcodearg1および を受け取る関数がありarg2ます。

arg1 と arg2 は、(1) unsigned int を保持する変数の名前を含む文字列、または (2) 実際の整数のいずれかです。

いずれにせよ、実際の整数を取得する必要があります。これまでatoiを使用しようとしていますが、最初のケースでは0を返すようです。

すなわち

sscanf(instruction, "%s %s %s", opcode, arg1, arg2);

sum = atoi(arg1) + atoi(arg2);

私に属していないため、コード全体を投稿することはできませんが、上記のデモが少し役立つことを願っています?

4

3 に答える 3

3

コメントで述べたように、C では、実行時に名前付き変数の値を取得することは期待できません。変数名は、コードの実行時に保持されるものではなく、純粋なマシン コードであり、すべての変数にはメモリアドレスに「調理」されています。名前はもうありません。

このatoi()関数は、 などの整数を保持する文字列を"4711"実際の値 に変換します4711。それだけで、「名前で」値を取得することはできません。

プログラムの実行時に変数名を値にマップするメカニズムが必要な場合は、言語に .xmlがないため、そのメカニズムを自分で作成する必要があります。たとえば、名前を値に関連付けることができるある種の構造体の配列を作成できますが、当然、その配列を初期化する必要があります。

このようなもの:

int foo = 12;
char *vname = "foo";

print("the value of %s is %d\n", vname, get_variable_value(vname));

単純に C では発生しません。関数get_variable_value() は存在できません

于 2012-06-01T09:36:57.707 に答える
0

変数名はコンパイル時にのみ使用されます。プログラムがコンパイルされると、使用した名前に関するすべての情報が失われます1。したがって、実行時に名前を含む「文字列」によって変数の内容にアクセスする方法はありません。2

1より正確には、それらはリンカまたはおそらくデバッガで利用できますが、それはあなたが使用できるものではありません (または当てにできるものではありません)。

2マクロを使ったり、すべての変数名からそれらのアドレスへのマップを使用したりする (ひどい) 方法を思いつくことができますが、プログラムは設計上修正する必要があると思います。

于 2012-06-01T09:40:52.127 に答える
0

変数とその値を入れるデータ構造を作成する必要があります。使用するライブラリで「ハッシュ マップ」を探します。

次にisdigit(arg[0])、引数が数値か変数名かを確認するために使用できます。擬似コード:

sum = toInt(arg1) + toInt(arg2)

int toInt(char * arg) {
    return isdigit(arg[0]) ? atoi(arg) : map->lookupValue(arg);
}
于 2012-06-01T09:42:08.600 に答える