変数名を変数で

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ynhrt

変数名を変数で

#1

投稿記事 by ynhrt » 9年前

題名の通り変数名を変数の値にしたいんです。
プログラムの途中で変数を宣言するとき、別の変数の値を変数名にして宣言する事は可能ですか?

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

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

アバター
記事: 58
登録日時: 10年前
住所: 大阪府

Re: 変数名を変数で

#2

投稿記事 by » 9年前

質問内容とずれているかも知れませんが、配列というものを使ってみるのはどうでしょうか?

jay
記事: 314
登録日時: 9年前
住所: 大阪市
連絡を取る:

Re: 変数名を変数で

#3

投稿記事 by jay » 9年前

こんばんは~

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

したがって"10"という名前の変数を宣言すること自体が出来ないということになります。
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

アバター
bitter_fox
記事: 607
登録日時: 9年前
住所: 大阪府

Re: 変数名を変数で

#4

投稿記事 by bitter_fox » 9年前

他の方が指摘している通り、変数名に変数を使うことはできませんが、何とかできるようにやってみました。

コード:

#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みたいになっちゃった(笑)
最後に編集したユーザー bitter_fox on 2010年12月01日(水) 00:05 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: 変数名を変数で

#5

投稿記事 by softya(ソフト屋) » 9年前

PHPなどのインタプリタ言語では値を変数に出来ますが、それでも数字から始まる名前は定数と区別がつかなくなるので出来ないです。
C++であればSTLのmapを使うなどで、変数に近い感覚で利用することは可能です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

naohiro19
記事: 256
登録日時: 10年前
住所: 愛知県

Re: 変数名を変数で

#6

投稿記事 by naohiro19 » 9年前

C言語上の規則として先頭の文字に数字は使えないということです。

アバター
ookami
記事: 214
登録日時: 10年前
住所: 東京都

Re: 変数名を変数で

#7

投稿記事 by ookami » 9年前

そのものズバリではありませんが、
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"]);
}

アバター
へろりくしょん
記事: 92
登録日時: 10年前
住所: 福岡

Re: 変数名を変数で

#8

投稿記事 by へろりくしょん » 9年前

Pure C ならば、チェインリスト等で連想配列的に扱うしか無いでしょうねぇ。

アバター
パコネコ
記事: 139
登録日時: 10年前
住所: 大阪

Re: 変数名を変数で

#9

投稿記事 by パコネコ » 9年前

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る