「pointer」を付け忘れています。とエラーが出ます

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
rain0306
記事: 5
登録日時: 8年前

「pointer」を付け忘れています。とエラーが出ます

#1

投稿記事 by rain0306 » 8年前

調べてみたんですが
よくわからなかったので
エラー内容
「13行目」で記述エラーを発見しました。
「pointer」を付け忘れています。


コード貼っておきますね

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int sum(void);

int main(void)
{
	int **a,b,**c,sysasdout,**dna;
	sysasdout=GRND(0,0);
	b=GRND(0,2);
	for(**c=0;**c<10;**c=**c+2){
		**dna[**c]={**GRND(0,2),**GRND(0,2)};
	}
	for(**a=0;**a<10;**a++){
		printf("%d %d\n",dna[**a],b);
	}
	return 0;
}

int GRND(int min,int max)
{
	static int flag;
	if(flag==0){
		srand((unsigned int)time(NULL));
		flag=1;
	}
	return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 「pointer」を付け忘れています。とエラーが出ます

#2

投稿記事 by みけCAT » 8年前

コード:

**dna[**c]={**GRND(0,2),**GRND(0,2)};
この記述は、以下の点でおかしいです。
  • 式中に{**GRND(0,2),**GRND(0,2)}が単体で出てくるのはおかしいです。Compound literalsは{}の前に(型名)が付きます。
  • GRNDとしてこのコードの下にある関数が使われるならば、その返り値はint型でありポインタではないので、間接演算子*を適用することはできません。
  • *dna[**c]はint型でありポインタではないので、間接演算子*を適用することはできません。
また、

コード:

printf("%d %d\n",dna[**a],b);
この部分もおかしいです。
dna[**a]はポインタ型(int*)なので、%dで出力してはいけません。
ポインタをprintfで出力するには、void*にキャストして%pで出力してください。
オフトピック
a, c, dnaが初期化されていないという問題もあるけど、それは提示されたコードでは省略されているだけですよね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

Re: 「pointer」を付け忘れています。とエラーが出ます

#3

投稿記事 by box » 8年前

そもそも、ポインターへのポインターが必要な理由がよくわかりません。
別に使わなくてもいいのではないでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: 「pointer」を付け忘れています。とエラーが出ます

#4

投稿記事 by かずま » 8年前

rain0306 さんが書きました: エラー内容
「13行目」で記述エラーを発見しました。
「pointer」を付け忘れています。
そのようなエラーメッセージの出るコンパイラを私は知りません。
どんなコンパイラをお使いですか?

** の意味を説明できますか?

次のように書き換えると、思った通りのプログラムになるのではありませんか?

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int GRND(int min, int max);

int main(void)
{
	int a, b, c, sysasdout, dna[10];
	sysasdout = GRND(0, 0);
	b = GRND(0, 2);
	for (c = 0; c < 10; c = c + 2) {
		dna[c] = GRND(0, 2);
		dna[c + 1] = GRND(0, 2);
	}
	for (a = 0; a < 10; a++) {
		printf("%d %d\n", dna[a], b);
	}
	return 0;
}

int GRND(int min, int max)
{
	static int flag;
	if (flag == 0) {
		srand((unsigned int) time(NULL));
		flag = 1;
	}
	return min + (int) (rand() * (max - min + 1.0) / (1.0 + RAND_MAX));
}

rain0306
記事: 5
登録日時: 8年前

Re: 「pointer」を付け忘れています。とエラーが出ます

#5

投稿記事 by rain0306 » 8年前

みけCAT さんが書きました:

コード:

**dna[**c]={**GRND(0,2),**GRND(0,2)};
この記述は、以下の点でおかしいです。
  • 式中に{**GRND(0,2),**GRND(0,2)}が単体で出てくるのはおかしいです。Compound literalsは{}の前に(型名)が付きます。
  • GRNDとしてこのコードの下にある関数が使われるならば、その返り値はint型でありポインタではないので、間接演算子*を適用することはできません。
  • *dna[**c]はint型でありポインタではないので、間接演算子*を適用することはできません。
また、

コード:

printf("%d %d\n",dna[**a],b);
この部分もおかしいです。
dna[**a]はポインタ型(int*)なので、%dで出力してはいけません。
ポインタをprintfで出力するには、void*にキャストして%pで出力してください。

a, c, dnaが初期化されていないという問題もあるけど、それは提示されたコードでは省略されているだけですよね。
伝説なるハッカーさん回答ありがとうございます
間接演算子を使わなくてもプログラム動きました
ところで、間接演算子とは通常の変数と何が違うのでしょうか?
自力で探しますが、念のために(^^);
初期化は忘れてましたorz

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 「pointer」を付け忘れています。とエラーが出ます

#6

投稿記事 by みけCAT » 8年前

rain0306 さんが書きました:ところで、間接演算子とは通常の変数と何が違うのでしょうか?
間接演算子は演算子、通常の変数は変数です。
トークンの種類から違います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

rain0306
記事: 5
登録日時: 8年前

Re: 「pointer」を付け忘れています。とエラーが出ます

#7

投稿記事 by rain0306 » 8年前

box さんが書きました:そもそも、ポインターへのポインターが必要な理由がよくわかりません。
別に使わなくてもいいのではないでしょうか。
ハッカーさん、回答ありがとうございました
実は私もわかっておりませんorz
高二程度の学習しかしてないので・・・
調べたら出てきたので

rain0306
記事: 5
登録日時: 8年前

Re: 「pointer」を付け忘れています。とエラーが出ます

#8

投稿記事 by rain0306 » 8年前

みけCAT さんが書きました:
rain0306 さんが書きました:ところで、間接演算子とは通常の変数と何が違うのでしょうか?
間接演算子は演算子、通常の変数は変数です。
トークンの種類から違います。
質問の仕方が悪かったですorz
int = *a; と int = a;
の違いは何でしょうか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 「pointer」を付け忘れています。とエラーが出ます

#9

投稿記事 by みけCAT » 8年前

rain0306 さんが書きました:int = *a; と int = a;
の違いは何でしょうか?
文字数ですね。
C言語としては、intが#defineでマクロとして定義されていなければどちらもコンパイルエラーなので、大した違いは無いでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

rain0306
記事: 5
登録日時: 8年前

Re: 「pointer」を付け忘れています。とエラーが出ます

#10

投稿記事 by rain0306 » 8年前

かずま さんが書きました:
rain0306 さんが書きました: エラー内容
「13行目」で記述エラーを発見しました。
「pointer」を付け忘れています。
そのようなエラーメッセージの出るコンパイラを私は知りません。
どんなコンパイラをお使いですか?

** の意味を説明できますか?

次のように書き換えると、思った通りのプログラムになるのではありませんか?

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int GRND(int min, int max);

int main(void)
{
	int a, b, c, sysasdout, dna[10];
	sysasdout = GRND(0, 0);
	b = GRND(0, 2);
	for (c = 0; c < 10; c = c + 2) {
		dna[c] = GRND(0, 2);
		dna[c + 1] = GRND(0, 2);
	}
	for (a = 0; a < 10; a++) {
		printf("%d %d\n", dna[a], b);
	}
	return 0;
}

int GRND(int min, int max)
{
	static int flag;
	if (flag == 0) {
		srand((unsigned int) time(NULL));
		flag = 1;
	}
	return min + (int) (rand() * (max - min + 1.0) / (1.0 + RAND_MAX));
}
かずまさん回答ありがとうございました
コンパイラはEasyIDECです
ちゃんと動きました!
原因は(GRND(0,2)),(GRND(0,2))ですか?
これではエラーで動きませんでしたからorz

閉鎖

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