No.14097![]() |
変数の値を変数に使う 投稿者---kou(2004/05/19 19:07:21) |
||
kouと申します。 別言語からの転向でして、色々と勉強させていただいております。 どうぞ、よろしくお願いいたします。 変数の値を変数名として利用する方法を模索しておりますが、C言語ではそのようなことはできるのでしょうか? つまり… char hesuu1[] には"hensuu2"という値が入っていて、 char hesuu2[] には"2 no atai"という値が入っているとします。 イメージとしては下のような感じです。 printf("%s", (hesuu1)); (このような感じで"2 no atai"と出力したい) さらに、構造体でもこのようなことはできるのかと方法を探しています。 イメージとしては、 char hesuu[] には"aaa"という値が入っているとして、 printf("%s\n", data[0].(hensuu)); ↑これで、data[0].aaa の値を出力させたいのです。 ご存じの方がおりましたら、アドバイスをよろしくお願いいたします。 |
No.14100![]() |
Re:変数の値を変数に使う 投稿者---NykR(2004/05/19 21:36:29) |
||
>変数の値を変数名として利用する方法を模索しておりますが、C言語ではそのようなことはできるのでしょうか? C言語にはそのような機能はありません。 プリプロセッサと構造体を使えば、無理すれば似たようなことはできないことはないです。 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #define VARIABLE(T) \ typedef struct variable_ ## T { \ T value; \ const char *name; \ struct variable_ ## T * next; \ } Variable_ ## T; \ \ static Variable_ ## T * T ## head; \ \ static T T ## value(const char * name) \ { \ Variable_ ## T ** target = &T ## head; \ for ( ; *target != NULL; target = &(*target)->next ) \ if( !strcmp(name, (*target)->name) ) return (*target)->value; \ assert(0); \ } \ \ static T * T ## declare(const char * var, T init_value) \ { \ Variable_ ## T * ret = malloc(sizeof(Variable_ ## T)); \ ret->value = init_value; \ ret->name = strdup(var); \ ret->next = T ## head; \ T ## head = ret; \ \ return (T*)ret; \ } #define DECLARE(T, var, init_value) T * var = T ## declare(#var, init_value) /*******************************↑を作って↓のように使う************************/ typedef char *string; VARIABLE(string); VARIABLE(double); int main(void) { char *hensuu1 = "hensuu2"; char *hensuu3 = "hensuu4"; DECLARE(string, hensuu2, "2 no atai"); DECLARE(double, hensuu4, 3.141592653589793846); printf("hensuu2 ... %s\n", *hensuu2); printf("hensuu4 ... %f\n", *hensuu4); printf("hensuu1経由:%s ... %s\n", hensuu1, stringvalue(hensuu1)); printf("hensuu3経由:%s ... %f\n", hensuu3, doublevalue(hensuu3)); return 0; }# 確保した領域を解放していなかったり、mallocの戻り値がノーチェックだったり、 # いろいろと問題の多いコードですが。 # それ以前にCとして不自然。 > さらに、構造体でもこのようなことはできるのかと方法を探しています。 できません。まず、後置.演算子の右側は、識別子でなければいけません。 また、構造体のメンバを値で検索する方法はありませんから、上のやり方も使えません。 |
No.14106![]() |
Re:変数の値を変数に使う 投稿者---kou(2004/05/20 10:01:39) |
||
NykR 様 アドバイスをしていただきありがとうございました。 参考にさせていただきたいと思います! しかし、そういった機能がないというのは残念でした…。 これからも勉強をがんばりたいと思います。 今後とも、よろしくお願いいたします。 |
No.14114![]() |
Re:変数の値を変数に使う 投稿者---円霊(2004/05/20 12:52:17) |
||
良くわかりませんが配列ではダメなんですか? こんなの。 #include <stdio.h> int refer(char varname[][10], char *req); int main(void){ int index, hensuu[2]; char req[10], correspondence[2][10]; hensuu[0] = 111; hensuu[1] = 222; printf("一つ目の変数名は何にしますか?\n"); scanf("%s", correspondence[0]); printf("二つ目の変数名は何にしますか?\n"); scanf("%s", correspondence[1]); printf("\n値を表示させたい変数の名前を入れてください\n"); scanf("%s", req); index = refer(correspondence, req); if(index > -1){ printf("%s=%d\n", req, hensuu[index]); } else{ printf("該当する変数はありません\n"); } return 0; } int refer(char varname[][10], char *req){ int i; for(i = 0; i < 2 ; i++){ if((strcmp(varname[i], req)) == 0) return i; } return -1; } 構造体の方も、構造体とメンバ名を渡すと値を返してくれる関数を 作ると言うのではダメですか? |
No.14117![]() |
Re:変数の値を変数に使う 投稿者---かずま(2004/05/20 15:53:19) |
||
こんなのはだめですか? #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Node Node; struct Node { char *var, *val; Node *next; }; static Node head = { "", "", NULL }; void set(const char *var, const char *val) { Node *p; for (p = head.next; p; p = p->next) if (!strcmp(p->var, var)) break; if (p) { free(p->val); p->val = strdup(val); } else { p = malloc(sizeof(Node)); p->var = strdup(var); p->val = strdup(val); p->next = head.next; head.next = p; } } char *get(const char *var) { Node *p; for (p = head.next; p; p = p->next) if (!strcmp(p->var, var)) break; return p ? p->val : head.val; } int main(void) { set("hensuu1", "hensuu2"); set("hensuu2", "2 no atai"); printf("'%s'\n", "hensuu1"); printf("'%s'\n", get("hensuu1")); printf("'%s'\n", get(get("hensuu1"))); printf("'%s'\n", get(get(get("hensuu1")))); return 0; } 最後は、"2 no atai" という変数がないため "" が返ってきます。 |