ページ 11

#defineで定義した値を取得

Posted: 2011年7月26日(火) 15:54
by 777
分類:[C/C++] 

#define AAA 1
#define BBB 2
#define CCC 3

u_char tble[3] = { AAA, BBB, CCC};

for(i = 0; i <= 3; i++){
num= tble;
printf(num);
}
#defineで定義した値をAblockに代入したい場合はどうすればいいですか??
上記のように作ってみたのですが、上手くいきません。ご助力お願いいたします。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 16:02
by softya(ソフト屋)
これ、どんな風にうまく動きませんでしたか?
配列の添え字と配列の定義の理解に怪しい部分が見受けられますが。
あとprintfの使い方とか。

どんな入門書やサイトで勉強されているのでしょうか?

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 16:11
by 777
>配列の添え字と配列の定義の理解に怪しい部分が見受けられますが。
>あとprintfの使い方とか。
⇒ すみません。printfとかは気にしないでください。ただ、#defineで定義した値をnumに代入したいだけなので・・・。
配列の定義は何がおかしいでしょうか?

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 16:13
by softya(ソフト屋)
777 さんが書きました:配列の定義は何がおかしいでしょうか?
定義は合ってますが、参照では間違ってます。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 16:18
by 777
softya(ソフト屋) さんが書きました:
777 さんが書きました:配列の定義は何がおかしいでしょうか?
定義は合ってますが、参照では間違ってます。
⇒ では、どのように参照すればよいでしょうか?

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 16:22
by softya(ソフト屋)
u_char tble[3]の宣言をされた配列の参照時の添字は0~2です。
ですが、このプログラムはループ時にtble[3]を参照していますので、これは配列外の参照を意味しますね。
ここで異常終了するか、変な値を参照することになります。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 16:29
by 777
softya(ソフト屋) さんが書きました:u_char tble[3]の宣言をされた配列の参照時の添字は0~2です。
ですが、このプログラムはループ時にtble[3]を参照していますので、これは配列外の参照を意味しますね。
ここで異常終了するか、変な値を参照することになります。
⇒ ありがとうございます。
For文の間違いはわかりましたが、配列の定義時に「invalid initializer」と出てきますが、これはどういうエラーなのでしょうか?

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 16:41
by non
777 さんが書きました:#defineで定義した値をAblockに代入したい場合はどうすればいいですか??
Ablockってなんですか?

どんなプログラムでそのエラーがでるのか、全部載せてもらえますか?

例えば、次のプログラムなら動きます。

コード:

#include <stdio.h>
typedef unsigned char	u_char;
#define AAA 1
#define BBB 2
#define CCC 3

u_char tble[3] = { AAA, BBB, CCC};

int main(void)

{
	int i,num;
	for(i = 0; i < 3; i++){
		num= tble[i];
		printf("%d\n",num);
	}
	return 0;
}

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 16:43
by softya(ソフト屋)

コード:

#define AAA 1
#define BBB 2
#define CCC 3

u_char tble[3] = { AAA, BBB, CCC};
自体に間違いはありません。
コンパイルも通ります。

もし間違いあるとしたら、この行以前だと思いますのでコンパイルして問題が出る形で掲載して貰う必要があります。
もし全体を掲載できないのならエラーを再現できるコンパクトなコードを作ってみてください(その過程で問題が解決するかも知れませんが)。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 16:46
by 777
non さんが書きました:
777 さんが書きました:#defineで定義した値をAblockに代入したい場合はどうすればいいですか??
Ablockってなんですか?

どんなプログラムでそのエラーがでるのか、全部載せてもらえますか?

例えば、次のプログラムなら動きます。

コード:

#include <stdio.h>
typedef unsigned char	u_char;
#define AAA 1
#define BBB 2
#define CCC 3

u_char tble[3] = { AAA, BBB, CCC};



int main(void)

{
	int i,num;
	for(i = 0; i < 3; i++){
		num= tble[i];
		printf("%d\n",num);
	}
	return 0;
}
>Ablockってなんですか?
すみません。numのことです。元はAblockで書いていましたので・・・。

エラーは、配列の設定時に「invalid initializer」ってでるだけです。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 17:06
by non
私が、添付したプログラムでも、そのエラーが出るのですね。
コンパイラ等の環境は何ですか?
いきなり、u_char なんて使ってあるから、特殊なものだと思いますが。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 17:16
by 777
non さんが書きました:私が、添付したプログラムでも、そのエラーが出るのですね。
コンパイラ等の環境は何ですか?
いきなり、u_char なんて使ってあるから、特殊なものだと思いますが。
⇒ 会社で使っているものなので何なのかはわからないです;;
nonさんからいただいたものは動いています。でも、私のは動かないです;;
defineがヘッダファイルで定義しているとかは関係ないですよね?

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 17:28
by non
777 さんが書きました: nonさんからいただいたものは動いています。でも、私のは動かないです;;
それじゃ、動かないプログラムを載せてもらわないとわかりません。
短いテストプログラムにして載せてください。
777 さんが書きました:
defineがヘッダファイルで定義しているとかは関係ないですよね?
ヘッダに定義しても大丈夫です。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 17:56
by 777

コード:

#defien AA			//← 変動します
#defien EE			//← 変動します
#defien II			//← 変動します

u_char 1tble[3] = { AA, EE, II };              // ←この時点で「invalid initializer」

void disp_standerd(void) 
{
	u_char i ;
	u_char num;

	for(i = 0; i < 3; i++){
		num = 1tble[i];
		printf("%d",num)
	}
} 
>それじゃ、動かないプログラムを載せてもらわないとわかりません。
短いテストプログラムにして載せてください。
⇒ こんな感じです。かなり端折っていますので、動かないしれないです。
#defineは機器の設定によって変動します。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 18:20
by non
777 さんが書きました: ⇒ こんな感じです。かなり端折っていますので、動かないしれないです。
#defineは機器の設定によって変動します。
私としては、そのエラーが出るプログラムを載せて欲しかったのですが。

よくわからないのは
>#defineは機器の設定によって変動します
これわからないです。ソースコードは添付のように空白ですか?それなら、無理です。

それとも、具体的な数値を機器の設定のたびに手動で記入し、コンパイルをしますか?
それなら、可能です。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 18:56
by softya(ソフト屋)
#defien AA //← 変動します
#defien EE //← 変動します
#defien II //← 変動します
すくなくとも、このままだと「invalid initializer(無効な初期化子)」に成るんじゃないでしょうか。
#defineの値はコンパイル前に決める必要があるので、どうやって変動させているか疑問ですし。

機器の設定ってのがコンパイル前ならOK。コンパイル後の動的な変化ってことならば不可能としか言えません。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 19:07
by bitter_fox
777 さんが書きました:

コード:

u_char 1tble[3] = { AA, EE, II };              // ←この時点で「invalid initializer」

void disp_standerd(void) 
{
	for(i = 0; i < 3; i++){
		num = 1tble[i];
	}
} 
1tbleとしていますが、変数名の頭に数字を用いることはできませんよ。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 19:15
by 777
softya(ソフト屋) さんが書きました:
#defien AA //← 変動します
#defien EE //← 変動します
#defien II //← 変動します
すくなくとも、このままだと「invalid initializer(無効な初期化子)」に成るんじゃないでしょうか。
#defineの値はコンパイル前に決める必要があるので、どうやって変動させているか疑問ですし。

機器の設定ってのがコンパイル前ならOK。コンパイル後の動的な変化ってことならば不可能としか言えません。

#defineは、何らかの値を機器を動かしているときに変更するので、普通の環境ではできないと思います。
上記ソースは、変化があるので空白としておきました。本来は、設定の何らかの値が常に入力されています。

不可能でしたら、他の方法でやります。ありがとうございました。

Re: #defineで定義した値を取得

Posted: 2011年7月26日(火) 19:20
by softya(ソフト屋)
777 さんが書きました:#defineは、何らかの値を機器を動かしているときに変更するので、普通の環境ではできないと思います。
上記ソースは、変化があるので空白としておきました。本来は、設定の何らかの値が常に入力されています。

不可能でしたら、他の方法でやります。ありがとうございました。
機器(マイコン?)が動いているときに変化する情報なのであれば配列の初期化子にすることは出来ません。
変化する度に配列に動的に代入してください。