C言語関係掲示板

過去ログ

No.1077 変数の値を変数に使う

[戻る] [ホームページ]
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" という変数がないため "" が返ってきます。