0

以下のように、他の変数を介して変数値にアクセスすることは可能ですか

char var[30];
char buffer[30];

strcpy(buffer, "ABC");

/*variable var is holding the "buffer" variable name as string*/ 
strcpy(var,"buffer")

変数varを介して、バッファ変数値「ABC」にアクセスする方法はありますか? ?

4

5 に答える 5

3

Cでは実用的な方法ではなく、とにかくそうしたくありません。プログラム ロジックを変数の名前に結び付けるのは、恐ろしい考えです。通常、私は、本当に必要なものがある種のコレクション型 (および配列、マップなど) であるときに、これを試みる人を目にします。

あなたがこれで解決しようとしている問題について私たちに記入してください。

あなたのコメントごと:

動的なデバッグ メッセージが必要です。印刷したい各関数変数を含むファイルがあります。

マクロで文字列化を使用します。

#define str(s) #s

int main() {
    int bar;
    str(bar) /* replaced by "bar" */
}
于 2012-06-19T23:32:42.150 に答える
1

いいえ、できません。間接アクセスが必要な場合は、ポインターを宣言して割り当てvarます。

char *forVar = var;

// Now you can access/modify via [] operator.
于 2012-06-19T23:33:31.997 に答える
1

重要な定型コードがないわけではありません。変数名はコンパイル時に削除されます。

理論的には、変数名から変数へのポインターへのマップを格納できます。

于 2012-06-19T23:32:59.083 に答える
0

それで、基本的に、関数への書き込み/読み取り/関数への受け渡しなどのときに、いくつかの変数をログに記録したいですか?

コンパイルされたCでこれを行うことは、特に実行可能ファイル(compileステートメントで-0n)を最適化する場合は困難です。この場合、一部の変数が完全に消えたり、他の変数によって再利用されたりする可能性があります。

GDBの使用

そうは言っても、gdbは変数アクセスなどをログに記録できることを私は知っています。Pythonスクリプト(http://sourceware.org/gdb/onlinedocs/gdb/Python.htmlを参照)を作成する場合は、変数の内容をログに記録するスクリプトを作成できるはずです。

詳細については、この質問を参照してください:gdbで特定のブレークポイントがヒットしたときに特定のアクションを実行する

オンデマンドのみ、プリコンパイラスクリプトを使用

または、オンデマンドで実行したい場合は、前処理スクリプトを使用して、csvファイルを入力として使用してカスタムマクロなどを追加することをお勧めします。

for each line in CSV:
  read variable_name, file_name, variable_type
  find all occurrences of variable_name in file_name
  for each occurrence
    insert printf(....)

オンデマンドのみ、マクロを使用

幸運を。通常、何らかのルックアップが必要であり、印刷関数に変数を選択的に出力する方法が必要になるため、これを行うための適切な方法はありません。場合によっては、次のようなことができます。

static char _LOGGED_VAR_001 = 'z';
static char _LOGGED_VAR_002 = 'z';

#define cMyVar           _LOGGED_VAR_001
#define LOG_ALL_VARS()   printf("Vals: %c, %c", _LOGGED_VAR_001, _LOGGED_VAR_002)


void myFunc()
{
   char cMyVar; // Gets macro'd to _LOGGED_VAR_001 with LOCAL scope
   cMyVar = 'a'; // LOCAL scope _LOGGED_VAR_001 becomes 'a'
   LOG_ALL_VARS(); // At this point you print out the LOCAL _LOGGED_VAR_001 
                   // and the global _LOGGED_VAR_002
}

あなたは得るだろうVals: a, z

これはかなり醜く、ローカルスコープの変数に対してのみ機能し、メモリ消費を混乱させ、エラーが発生しやすく、一般的には悪い考えです。

オンデマンド、ヒープ/スタックダンプ

十分なストレージがある場合は、オンデマンドですべてのメモリをファイルにダンプできます。それがどのように行われたかにもよるが、これはおそらくあまり移植性がないだろう。しかし、信頼できる方法でそれを行う方法はわかりません。

おすすめ

設計時の診断にはGDBを使用します。それはそれが設計されているものです:)

たとえば、リリースされたコード(自動化されたバグレポート)の分析には、完全なダンプとその後の分析が適切な場合があります。

于 2012-06-20T02:14:50.107 に答える
0

ユニオンを使ってみることができます

例えば:

union example {
    char var[40];
    char buffer[40];
} e1;

strcpy(e1.var, "ABC");

printf("%s is same as %s", e1.var, e1.buffer);
于 2012-06-19T23:32:27.943 に答える