ページ 11

コンパイルエラー

Posted: 2013年12月30日(月) 15:23
by may
配列で馬が動くプログラミングを書いたのですがエラーがでてきてしまいました。
色々試したのですがわからないので投稿いたしました。ご指南よろしくお願いいたします。
出たエラーは
23.c:26: error: incompatible type for argument 3 of ‘horse’
23.c:26: error: incompatible type for argument 4 of ‘horse’
変数を何に変えたらいいかわかりません…

コード:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <eggx.h>

int win;
int horse(int i, int s, double x[i], double y[i]);///プロトタイプ言宣

int main(){
    int i,s;
    double x[5],y[5];
    y[i] = 250.0;;
    win=gopen(600,400); // 描画ウィンドウを開く
    s = 0;
    for (x[i]=580.0; x[i]>=10.0; x[i]--){
        for (i = 0; i < 6; i++) {
            gclr(win);                 //画面を消去
            horse(i,s,x[i],y[i]);
            s++;
        }
    }
    
return 0;
}

int horse(int i, int s, double x[5], double y[5]){
    int size = 10.0;
    int flag;
    
    flag = 1;
    if (s%10) flag*=-1;
    
    newhsvcolor(win, 150, 200, 200);            //色
    fillrect(win, 0.0, 250.0, 600.0, 150.0);//背景色設定
    newhsvcolor(win, 30, 200, 250);            //色
    fillrect(win, 0.0, 0.0, 600.0, 250.0);
    
    /////////////
    //ココから馬//
    ////////////
        newhsvcolor(win, 10, 200, 90);                                                      //色
        fillrect(win, x[i], y[i], 3.0*size, 2.5*size);                                      //頭
        fillarc(win, x[i], y[i]+size*1.3, size, size*1.2, 90.0, 270.0, 1);                  //口
        fillrect(win, x[i]+2.0*size, y[i]-2.5*size, size, 3.0*size);                        //首
        fillrect(win, x[i]+2.0*size, y[i]-5.5*size, 4.0*size, 3.0*size);                    //胴体
        fillarc(win, x[i]+size*3.0, y[i]+size*4.0, size*2.0, size*2.0, 250.0, 270.0, 1);    //耳
        if(flag==1){
            fillarc(win, x[i]+size*3.5, y[i]-8.0*size, size*2.0, size*4.0, 120.0, 140.0, 1);//前足(内)
            fillarc(win, x[i]+size*4.5, y[i]-8.0*size, size*2.0, size*4.0, 45.0, 65.0, 1);  //後足
        }
        else{
            fillarc(win, x[i]+size, y[i]-8.0*size, size*2.0, size*4.0, 40.0, 60.0, 1);      //前足(外)
            fillarc(win, x[i]+size*7.0, y[i]-8.0*size, size*2.0, size*4.0, 120.0, 140.0, 1);//後足
        }
        fillarc(win, x[i]+size*6.0, y[i]-2.5*size, size*2, size*2, 300.0, 320.0, 1);        //尻尾
        newhsvcolor(win, 10,200,0);                                                         //色
        fillcirc(win, x[i]+size*2.0, y[i]+size*1.5, size/2,size/2);                         //目
    //////////////
    //ココから人間//
    //////////////
        fillcirc(win, x[i]+size*4.0, y[i]+size, size,size);                                 //頭
        drawline(win, x[i]+size*4.0, y[i]+size, x[i]+size*4.0, y[i]-size*2);                //胴体
        drawline(win, x[i]+size*4.0, y[i], x[i]+size*3.0, y[i]);                            //手
        drawline(win, x[i]+size*4.0, y[i]-size*2.0, x[i]+size*3.0, y[i]-size*3.5);          //足
        
        y[i]-=40.0;
    msleep(50);               //少し待つ
    
}

Re: コンパイルエラー

Posted: 2013年12月30日(月) 15:35
by みけCAT
9行目 : プロトタイプ宣言でxのように要素数を書く部分に変数を使用するのは馴染みが無いです。(文法/仕様的に正しいかはわかりません)
14行目、17行目 : 配列の確保されている領域の外にアクセスしている可能性が高いです。(iの値が不定)
20行目 : horseの第三、第四引数にdouble*型の値を渡さないといけないのに、double型の値を渡しています。それぞれx,yでいいのでは?
18行目 : 上記の20行目の修正をしたとすると、horse関数で配列の確保されている領域の外にアクセスすることになります。上限が大きすぎます。

Re: コンパイルエラー

Posted: 2013年12月30日(月) 15:53
by may
早速お返事ありがとうございます!
申し訳ありませんが、double*型とdouble型はどう違うのでしょうか?
初心者ですみません…
書き直すとエラーは消えたのですが出力画面が一瞬で消えてしまいます…
以下書き直したものです。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <eggx.h>

int win;
int horse(int i, int s, double x, double y);///プロトタイプ言宣

int main(){
    int i,s;
    double x[5],y[5];
    i = 0;
    y[i] = 250.0;;
    win=gopen(600,400); // 描画ウィンドウを開く
    s = 0;
    for (x[i]=580.0; x[i]>=10.0; x[i]--){
        gclr(win);                 //画面を消去
        for (i = 0; i < 6; i++) {
            horse(i,s,x[i],y[i]);
            s++;
        }
    }
    
return 0;
}

int horse(int i, int s, double x, double y){
    int size = 10.0;
    int flag;
    
    flag = 1;
    if (s%10) flag*=-1;
    
    newhsvcolor(win, 150, 200, 200);            //色
    fillrect(win, 0.0, 250.0, 600.0, 150.0);//背景色設定
    newhsvcolor(win, 30, 200, 250);            //色
    fillrect(win, 0.0, 0.0, 600.0, 250.0);
    
    /////////////
    //ココから馬//
    ////////////
        newhsvcolor(win, 10, 200, 90);                                                      //色
        fillrect(win, x, y, 3.0*size, 2.5*size);                                      //頭
        fillarc(win, x, y+size*1.3, size, size*1.2, 90.0, 270.0, 1);                  //口
        fillrect(win, x+2.0*size, y-2.5*size, size, 3.0*size);                        //首
        fillrect(win, x+2.0*size, y-5.5*size, 4.0*size, 3.0*size);                    //胴体
        fillarc(win, x+size*3.0, y+size*4.0, size*2.0, size*2.0, 250.0, 270.0, 1);    //耳
        if(flag==1){
            fillarc(win, x+size*3.5, y-8.0*size, size*2.0, size*4.0, 120.0, 140.0, 1);//前足(内)
            fillarc(win, x+size*4.5, y-8.0*size, size*2.0, size*4.0, 45.0, 65.0, 1);  //後足
        }
        else{
            fillarc(win, x+size, y-8.0*size, size*2.0, size*4.0, 40.0, 60.0, 1);      //前足(外)
            fillarc(win, x+size*7.0, y-8.0*size, size*2.0, size*4.0, 120.0, 140.0, 1);//後足
        }
        fillarc(win, x+size*6.0, y-2.5*size, size*2, size*2, 300.0, 320.0, 1);        //尻尾
        newhsvcolor(win, 10,200,0);                                                         //色
        fillcirc(win, x+size*2.0, y+size*1.5, size/2,size/2);                         //目
    //////////////
    //ココから人間//
    //////////////
        fillcirc(win, x+size*4.0, y+size, size,size);                                 //頭
        drawline(win, x+size*4.0, y+size, x+size*4.0, y-size*2);                //胴体
        drawline(win, x+size*4.0, y, x+size*3.0, y);                            //手
        drawline(win, x+size*4.0, y-size*2.0, x+size*3.0, y-size*3.5);          //足
        
        y-=40.0;
    msleep(50);               //少し待つ
    
}

Re: コンパイルエラー

Posted: 2013年12月30日(月) 15:59
by みけCAT
may さんが書きました:申し訳ありませんが、double*型とdouble型はどう違うのでしょうか?
double型は「倍精度浮動小数点数型」です。8バイトのことが多い気がします。
double*型はdouble型のデータへのポインタです。32ビットOSでは4バイトのことが多い気がします。
double*型の変数はdouble型の配列とみなすこともできます。
may さんが書きました:書き直すとエラーは消えたのですが出力画面が一瞬で消えてしまいます…
x[6]の値が不定なので(というより配列の範囲外にアクセスしているのが修正されていない)、
たまたま10未満の値が入っており、for文を抜けたのではないでしょうか?

main関数で何をしたいのかを日本語で箇条書きにしていただけると、それに合わせたコードをこちらで書きやすくなります。

1. s=0とする
2. iを1から10まで変化させ、それぞれのiをsに加える
3. sを出力する

コード:

#include <stdio.h>
int main(void) {
    int s=0,i;
    for(i=1;i<=10;i++)s+=i;
    printf("%d\n",s);
    return 0;
}

Re: コンパイルエラー

Posted: 2013年12月30日(月) 16:44
by may
丁寧な説明ありがとうございました!

どうしてfor文から抜けてしまうのでしょうか?
なんどもすみません…

Re: コンパイルエラー

Posted: 2013年12月30日(月) 16:52
by みけCAT
最初に17行目のfor文に来るとき、i==0であり、x[0]に580.0が代入されます。
17行目のfor文の中身を1回実行すると、iの値が6の状態で17行目に戻ってきます。
そして、x[6]の値を1減らした後、x[6]が10.0以上でなければfor文から抜ける、ということになります。
x[6]は配列の確保された領域の範囲外であり、かつコード中で代入されていないので、値は不定です。
したがって、たまたまmain関数の処理を開始した時点でx[6]の値が11.0未満ならfor文から抜け、そうでなければ抜けません。

補足:y[0]に250.0を代入していますが、x[6]がy[0]と一致する可能性は低いと考えられます。
一致するとしたらy[1]の可能性はあります。(必ず一致する保証はありません)
http://ideone.com/vpw7GW

Re: コンパイルエラー

Posted: 2013年12月30日(月) 16:58
by box
may さんが書きました:

コード:

    double x[5],y[5];
        for (i = 0; i < 6; i++) {
そもそも、配列定義が[5]であるのに
for文のループが0~5まで回っているのはなぜですか?

コード:

    double x[5],y[5];
と定義した配列において、有効な添字の範囲が0~4
(の5個、定義時の[5]とは5個のことであって、[0]~[5]にアクセスできる『という意味ではない』)ことを
十分理解できているでしょうか。