ページ 11

変数名を変数で

Posted: 2010年11月30日(火) 21:58
by ynhrt
題名の通り変数名を変数の値にしたいんです。
プログラムの途中で変数を宣言するとき、別の変数の値を変数名にして宣言する事は可能ですか?

例えば
int a = 10; とあったら、次に別の変数を宣言するときに変数名を"10"にしたいんです。

出来るかわかりませんが、出来るのなら方法を教えてください。

Re: 変数名を変数で

Posted: 2010年11月30日(火) 22:25
by
質問内容とずれているかも知れませんが、配列というものを使ってみるのはどうでしょうか?

Re: 変数名を変数で

Posted: 2010年11月30日(火) 22:56
by jay
こんばんは~

さてさて、早速本題ですが
C言語の変数宣言をする時には、変数名の最初に数字は使えないという決まりがあります。

したがって"10"という名前の変数を宣言すること自体が出来ないということになります。

Re: 変数名を変数で

Posted: 2010年11月30日(火) 23:17
by bitter_fox
他の方が指摘している通り、変数名に変数を使うことはできませんが、何とかできるようにやってみました。

コード:

#include <stdlib.h>

int **list;
int max_list;

//
// 名前から番号を取得
///////////////////////////////////////////////////////////////////////////////////////
int FoundName(int name)
{
	int counter;

	for (counter = 0; counter < max_list; counter++)
	{
		if (list[counter][0] == name)
		{
			return counter;
		}
	}

	return -1;
}

//
// 変数を宣言
///////////////////////////////////////////////////////////////////////////////////////
int Declaration(int name)
{
	int counter;

	if (FoundName(name) != -1)
	{
		return -1;
	}

	if (max_list == 0)
	{
		list = (int**)calloc(++max_list, sizeof(int*));
		if (list == NULL)
		{
			max_list--;
			return -2;
		}

		list[max_list-1] = (int*)calloc(2, sizeof(int));
	}
	else
	{
		list = (int**)realloc(list, ++max_list*sizeof(int*));
		if (list == NULL)
		{
			max_list--;
			return -3;
		}
	}

	list[max_list-1] = (int*)calloc(2, sizeof(int));
	if (list[max_list-1] == NULL)
	{
		max_list--;
		return -4;
	}

	list[max_list-1][0] = name;
	list[max_list-1][1] = 0;

	return name;
}

//
// 変数名nameに値valueをセット
///////////////////////////////////////////////////////////////////////////////////////
int SetValue(int name, int value)
{
	int number = FoundName(name);

	if (number == -1)
	{
		return -1;
	}

	list[number][1] = value;

	return name;
}

//
// 変数名nameの値を取得
///////////////////////////////////////////////////////////////////////////////////////
int GetValue(int name)
{
	int number = FoundName(name);

	if (number == -1)
	{
		return -1;
	}

	return list[number][1];
}

//
// 解放
///////////////////////////////////////////////////////////////////////////////////////
void Free()
{
	int counter = 0;

	for (counter = 0; counter < max_list; counter++)
	{
		free(list[counter]);
	}

	free(list);

	max_list = 0;
}
だいぶ無理やりです。。
nameがマイナスのときは考えていません(エラーコードと重複する)。

宣言のとき、Declaration、
値をセットしたいときは、SetValue、
値を取得したいときは、GetValue、
最後に、Freeを使ってください。

例)

コード:

int main()
{
    int name1 = 10, name2 = 20, name3 = 30;

    Declaration(name1);
    SetValue(name1, 10);

    Declaration(name2);
    SetValue(name2, 20);

    Declaration(name3);
    SetValue(name3, GetValue(name1)+GetValue(name2));

    printf("%d + %d = %d\n", GetValue(name1), GetValue(name2), GetValue(name3));

    Free();

    return 0;
}
なんか、Javaみたいになっちゃった(笑)

Re: 変数名を変数で

Posted: 2010年11月30日(火) 23:25
by softya(ソフト屋)
PHPなどのインタプリタ言語では値を変数に出来ますが、それでも数字から始まる名前は定数と区別がつかなくなるので出来ないです。
C++であればSTLのmapを使うなどで、変数に近い感覚で利用することは可能です。

Re: 変数名を変数で

Posted: 2010年12月01日(水) 07:34
by naohiro19
C言語上の規則として先頭の文字に数字は使えないということです。

Re: 変数名を変数で

Posted: 2010年12月01日(水) 09:32
by ookami
そのものズバリではありませんが、
STLのmapはいかがでしょうか。

コード:

#include <stdio.h>
#include <map>
#include <string>
using namespace std;

void main(){
    map<string,int> m;
    m["a"]=10;
    printf("%d",m["a"]);
}

Re: 変数名を変数で

Posted: 2010年12月01日(水) 09:55
by へろりくしょん
Pure C ならば、チェインリスト等で連想配列的に扱うしか無いでしょうねぇ。

Re: 変数名を変数で

Posted: 2010年12月01日(水) 20:34
by パコネコ
個人的に気になっただけなので、スルーしてくださってもいいのですが・・・
プログラムを起動した後に、変数を宣言しても、なんて宣言されるかわからないのでは、使えないと思うのですが・・・
使えるかは別として、変数名が1だったり25だったりしてもプログラム中ではわからない。
(なんて宣言されるかわかっているなら、宣言したほうが早いですし・・・)

・・・使うこと考えるとやっぱり配列で、その数字の個所を参照することになるのかな?
好きに宣言できたとしたら、どういう風に使えるのでしょうか?
(最初に書きましたが、気分を害されたならスルーしていただいていいです。)