ページ 1 / 1
「pointer」を付け忘れています。とエラーが出ます
Posted: 2015年10月26日(月) 14:56
by rain0306
調べてみたんですが
よくわからなかったので
エラー内容
「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));
}
Re: 「pointer」を付け忘れています。とエラーが出ます
Posted: 2015年10月26日(月) 17:26
by みけ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が初期化されていないという問題もあるけど、それは提示されたコードでは省略されているだけですよね。
Re: 「pointer」を付け忘れています。とエラーが出ます
Posted: 2015年10月26日(月) 22:52
by box
そもそも、ポインターへのポインターが必要な理由がよくわかりません。
別に使わなくてもいいのではないでしょうか。
Re: 「pointer」を付け忘れています。とエラーが出ます
Posted: 2015年10月27日(火) 00:07
by かずま
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));
}
Re: 「pointer」を付け忘れています。とエラーが出ます
Posted: 2015年10月28日(水) 00:29
by rain0306
みけ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
Re: 「pointer」を付け忘れています。とエラーが出ます
Posted: 2015年10月28日(水) 00:32
by みけCAT
rain0306 さんが書きました:ところで、間接演算子とは通常の変数と何が違うのでしょうか?
間接演算子は演算子、通常の変数は変数です。
トークンの種類から違います。
Re: 「pointer」を付け忘れています。とエラーが出ます
Posted: 2015年10月28日(水) 00:34
by rain0306
box さんが書きました:そもそも、ポインターへのポインターが必要な理由がよくわかりません。
別に使わなくてもいいのではないでしょうか。
ハッカーさん、回答ありがとうございました
実は私もわかっておりませんorz
高二程度の学習しかしてないので・・・
調べたら出てきたので
Re: 「pointer」を付け忘れています。とエラーが出ます
Posted: 2015年10月28日(水) 00:38
by rain0306
みけCAT さんが書きました:rain0306 さんが書きました:ところで、間接演算子とは通常の変数と何が違うのでしょうか?
間接演算子は演算子、通常の変数は変数です。
トークンの種類から違います。
質問の仕方が悪かったですorz
int = *a; と int = a;
の違いは何でしょうか?
Re: 「pointer」を付け忘れています。とエラーが出ます
Posted: 2015年10月28日(水) 00:45
by みけCAT
rain0306 さんが書きました:int = *a; と int = a;
の違いは何でしょうか?
文字数ですね。
C言語としては、intが#defineでマクロとして定義されていなければどちらもコンパイルエラーなので、大した違いは無いでしょう。
Re: 「pointer」を付け忘れています。とエラーが出ます
Posted: 2015年10月28日(水) 00:51
by rain0306
かずま さんが書きました: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