配列に値が入らない【c言語】

このQ&Aのポイント
  • DivBdInfo配列の要素であるDivBdInfo[i].StgSizeAvgに値が入らない問題について質問です。
  • 変数iを3や5に変えると値が入ることが確認されていますが、なぜ全ての要素に値が入らないのか理解できていません。
  • 質問のプログラムを以下に記載します。配列の要素に値を正しく格納する方法についてアドバイスをいただきたいです。
回答を見る
  • ベストアンサー

配列に値が入らない【c言語】

下のプログラムで配列(DivBdInfo[i].StgSizeAvg)に値が入らず困っています。 やっていることは平均を求めているだけです。 DivBdInfo[i].StgSizeAvgの変数iを3や5に変えるとこちらは値が入ります。 デバッグ時にSumとcntに値が入っているのは確認しました。 DIVBD_INFO DivBdInfo[DIVBOARD_NUM];はグローバルです。 回答よろしくお願いします。 #define DIVBOARD_NUM 9 typedef struct _DIVBD_INFO { double StrgSizeAvg; double LinkNumAvg; double GrpSizeAvg; }DIVBD_INFO; DIVBD_INFO DivBdInfo[DIVBOARD_NUM]; void StrgSizeAvg(STRING *stringlist) { int x,y,i,id; int rfx,rfy; int Sum; int cnt; for(i=0;i<DIVBOARD_NUM;i++) { GetDivideRfXY(i,&rfx,&rfy); for(i=0;i<movenum;i++){stringlist[i].chk=FALSE;} Sum= cnt= 0; for(y=0;y<DIVIDE_SIZE;y++) { for(x=0;x<DIVIDE_SIZE;x++) { if(gostridboard[rfy+y][rfx+x]>SPACE){ id= gostridboard[rfy+y][rfx+x]-1; if(stringlist[id].chk==FALSE){ Sum+= stringlist[id].size; stringlist[id].chk=TRUE; cnt++; } } } } DivBdInfo[i].StrgSizeAvg=(double)Sum/cnt; //DivBdInfo[5].StrgSizeAvg=Sum/cnt; } }

質問者が選んだベストアンサー

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

>DivBdInfo[i].StgSizeAvgの変数iを3や5に変えるとこちらは値が入ります。 デバッグ時にSumとcntに値が入っているのは確認しました。 iはチェックしましたか? for(i=0;i<movenum;i++){stringlist[i].chk=FALSE;} ここで使った値のままでいいんですか? それと、 > for(i=0;i<DIVBOARD_NUM;i++) { GetDivideRfXY(i,&rfx,&rfy); for(i=0;i<movenum;i++){stringlist[i].chk=FALSE;} iの2重ループでいいんですか?

cliff_vers
質問者

お礼

ありがとうございました。

関連するQ&A

  • C++でオセロのCPUの処理を考えたのですが、40手目あたりからうまく

    C++でオセロのCPUの処理を考えたのですが、40手目あたりからうまくいきません。ReverseOthello関数の石を探して裏返す処理がおかしいと思われます。一番裏返せる石が多い位置を裏返すという処理をしています。プログラミング経験が豊富な方よろしくお願いします。 #include "stdafx.h" bool Othello(int (*pBoard)[8] ){ int i; int j; int ans; int k = 0; int num[3] = {0,0,0}; int sum[28][3]; i = 0; while(i < 28){ j = 0; while(j < 3){ sum[i][j] = 0; j++; } i++; } i = 0; while(i < 8){ j= 0; while(j < 8){ if(pBoard[i][j] == 0){ ans = SeachStone(i,j,pBoard); if(ans != 0){ sum[k][0] = i; sum[k][1] = j; sum[k][2] = ans; k++; } } j++; } i++; } i = 0; while(i < 28){ if(num[2] < sum[i][2]){ num[0] = sum[i][0]; num[1] = sum[i][1]; num[2] = sum[i][2]; } i++; } if(num[2] == 0){ return false; } ReverseStone(num[0],num[1],pBoard); return true; } void ReverseStone(int y1,int x1,int (*pBoard)[8]){ int cnt = 0; int y2; int x2; int i; int j; int k; if(y1 == 0){ i = 0; } else { i = y1-1; } while(i < y1 + 2){ if(x1 == 0){ j = 0; } else { j = x1-1; } while(j < x1 + 2){ y2 = i; x2 = j; cnt = 0; while(pBoard[y2][x2] == -1){ y2 = y2 + (i - y1); x2 = x2 + (j - x1); cnt++; } if(pBoard[y2][x2] == 1&& cnt != 0){ k = 0; while(k < cnt + 1){ y2 = y2 + (y1 - i); x2 = x2 + (x1 - j); pBoard[y2][x2] = 1; printf("%d\n",pBoard[y2][x2]); k++; } } j++; } i++; } } int SeachStone(int y1,int x1,int (*pBoard)[8]){ int cnt = 0; int sumCnt = 0; int y2; int x2; int i; int j; if(y1 == 0){ i = 0; } else { i = y1-1; } while(i < y1 + 2){ if(x1 == 0){ j = 0; } else { j = x1-1; } while(j < x1 + 2){ y2 = i; x2 = j; cnt = 0; while(pBoard[y2][x2] == -1){ y2 = y2 + (i - y1); x2 = x2 + (j - x1); cnt++; } if(pBoard[y2][x2] == 1&& cnt != 0){ sumCnt = sumCnt + cnt; } j++; } i++; } return sumCnt; }

  • c言語

    #include<stdio.h> main(void) { int x; double y,sum; void p(double *); for(sum=0.0,x=1;x<10;x++){ sum+=1.0/p(&x); ここでエラーがでます。 } printf("%d\n",sum); } void p(double *y) { *y*=*y; } どうしてエラーがでるかわかりません。教えてください!

  • C言語。どうしてコンパイルできません^^;

    最近プログラミングの勉強をはじめました。 C言語を勉強しています。 /*入力した値の、平均値・最大値・最小値・を出す。*/ #include <stdio.h> int main(void) { int x[5],i,j,w,x,y,z,sum; printf("5つの実数の平均、最大値、最小値を求めます\n"); sum = 0; for(i=0; i<5; i++){ printf("値%d:",i+1); scanf("%d",&x[i]); sum += x[i]; } for(y=0; y<5; y++){ for(j=0; j<4; j++){ w=j+1; if(x[j] < x[w]){ z = x[i]; x[i] = x[w]; x[w] = z; } } } printf("平均値:%f\n最大値:%d\n最小値:%d\n", (double)sum/5, x[0], x[4]); return 0; } Microsoft Visual C++ 2008 Express Edition でコンパイルをしようとしたのですが、 「error C2040: 'x' : 'int' は 'int [5]' と間接操作のレベルが異なります。」 と出てできませんでした^^; 何度も見直したのですが、どうしても間違っている場所がわかりません^^; どこがいけないのでしょうか^^;

  • C言語 入力した数値の平均値の近似値(関数を利用)

    double型の配列 a[] と、要素数 n を受け取り、 a の最初の n 要素の平均を値として返す関数 double average(double a[], int n) および、double型の配列 a[] と、要素数 n を受け取り、 a の最初の n 要素のなかで、それら n 要素の平均値と最も近い値を返す関数 double closest_to_average(double a[], int n) を作成して、main関数で、平均値と最も近い値を出力しろ という問題をやってみたのですが、私のプログラムでは実行して、数値を入力した後強制終了されてしまいます。 どこが間違えているのか教えていただけないでしょうか? 以下が私の作ったプログラムです。 ---------------------------------------------------------------------- #include <stdio.h> double average(double a[], int n) { int i; double sum,avg; sum=0; for(i=0;i<n;i=i+1){ sum=sum+a[i]; } avg=sum/n; return(avg); } double closest_to_average(double a[], int n) { int i; double avg,num1,num2,ans; avg=average(a,n); num1=avg-a[0]; if(num1<0){ num1=num1*(-1); } for(i=1;i<n;i=i+1){ num2=avg-a[i]; if(num2<0){ num2=num2*(-1); } if(num1>num2){ num1=num2; ans=a[i]; } } return(ans); } int main (void) { int i,n; double a[100]; double ans; scanf("%d",&n); for(i=0;i<n;i=i+1){ scanf("%d",a[i]); } ans=closest_to_average(a,n); printf("%f",ans); return(0); } ---------------------------------------------------------------------- ちなみに「3 3.0 5.0 11.0」と入力すれば「5.000」となるはずです。 よろしくお願いします。

  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }

  • C言語 入力した数値の平均値の近似値

    n個の数値を入力して、その平均値にもっとも近い値を求めよ。(double型の配列を用いること) nは実数データの前に最初に入力するものとする。 必要ならばnは100以下と仮定せよ。 答えは指数なしの表現で、欄の最小幅は8とし、精度は3とする。 という問題なのですが、作ってみたプログラムでは正しく動作できませんでした。 どこが違うのか教えてください。 以下が私の作ったプログラムです。 _____________________________________________________________________________________________________________________ #include <stdio.h> int main (void) { int i,n; double c[100],sum,avg,num1,num2,ans; sum=0.0; scanf("%d",&n); for(i=0;i<n;i=i+1) { scanf("%lf",&c[i]); sum=sum+c[i]; } avg=sum/n; num1=avg-c[0]; if(num1<0){ num1=num1*(-1); } for(i=1;i<n;i=i+1){ num2=avg-c[i]; if(num2<0){ num2=num2*(-1); } if(num1>num2); num1=num2; } printf("%8.3f",num1); return(0); } _____________________________________________________________________________________________________________________ ちなみに「3 3.0 5.0 11.0」と入力すれば「5.000」となるはずなのですが、 私のでは「4.667」と表示されてしまいます。 よろしくお願いします。

  • C言語での質問

    プログラミングの課題をやっているのですが、一部どうしてもわからないことがあるので質問させて下さい。 課題では100個の点のX座標、Y座標を0から5の間でランダムに設定し、ファイルに書き出すといった内容なのですが、この点を設定した時、任意の2点のX座標、Y座標の差が0.01以下になる場合は設定し直さないといけません。 これは後々の課題に関係してくるから、みたいなのですが。 そこで点の設定の関数として以下のようなプログラムを考えてみました。(ちなみに構造体pointを前に宣言してあり、p[].xは点のX座標、p[].yは点のY座標です。また、NUM=100と最初に宣言してあります。) void tensettei(point p[], int num){ int i, j, k; double sa; for(i=0; i < num; i++){ p[i].x = ((double) rand()) / ((double) RAND_MAX) * 5; p[i].y = ((double) rand()) / ((double) RAND_MAX) * 5; } for(j=0; j < (num - 1); j++){ for(k=j+1; k < num; k++){ if(p[j].x > p[k].x) sa = p[j].x - p[k].x; else sa = p[k].x - p[j].x; if(sa < 0.01) tensettei(p, NUM) } } for(j=0; j < (num - 1); j++){ for(k=j+1; k < num; k++){ if(mp[j].y > mp[k].y) sa = mp[j].y - mp[k].y; else sa = mp[k].y - mp[j].y; if(sa < 0.01) tensettei(p, NUM) } } } しかし、実行してもエラーが起こったのかすぐに終了してしまい、この後に点データを出力するプログラムを書いているのですが、ちゃんと出力されません。 いろいろプログラムを変えて試した結果、原因は「tensettei(p, NUM)」にあることはわかりました。 それさえ変えればすればうまく動作しましたので。 再帰と同じ感じでいけるかと思ったのですがどうやら駄目のようです。 そこで質問なのですが、ループの中である条件が起こったら最初からやり直し、てなプログラムはどんな風にすればいいのでしょうか?

  • C言語の配列の入れ方について質問です。

    下記のプログラムで1234という連続した数字を入れたら配列val[0]~[3]に val[0] = 1 val[1] = 2 val[2] = 3 val[3] = 4 というように入れたいのですが、どのようにして別々にすれば良いですか?宜しくお願いします。 #include<stdio.h> int main(void) { int num[10]; int val[4]; int i; printf("式:"); scanf("%d",num); for(i=0;i<4;i++){ val[i] = 0; } for(i=0; i<4; i++){ if((num[i] >= 1) && (num[i] <= 9)){ /*1から9の数値が入ったならば*/ val[i] = num[i]; } } for(i=0; i<4; i++){ printf("答え%d:%d\n",i,val[i]); } }

  • c言語 for文

    /*指定された個数だけ整数を読み込んで合計値・平均値を算出*/ #include <stdio.h> int main(void) { int i; int sum=0; int num,tmp; printf("整数は何個ですか:"); scanf("%d",&num); for(i=0;i<num;i++) {printf("No.%d:",++i); scanf("%d",&tmp); sum = sum + tmp; } printf("合計値:%d\n",sum); printf("平均値:%.2f\n",(double)sum / num); return(0); } C言語の勉強を始めたばかりのものです。 指定された個数だけ読み込めません 汗 前置と後置をまぜたあたりがよくないのかなと思うのですが。。。 どうしておかしくなるのか教えてください。 内部でどういった処理が行われているのかまだあまりわからない状態です。 ちなみに4と入力した結果は以下です。 整数は何個ですか:4 No.1:4 No.3:3 合計値:7 平均値:1.75

  • c言語

    #include<stdio.h> #define N 5 int main(){ double x[] = {1, 3, 4, 5.5, 7}; double y[] = {3, 5, 6, 8, 11}; double a = 0.028; double eta = 0.001; double dEda; int ite, i ; for (ite = 1; ite <= 1000; ++ite){ dEda = 0; for(i = 0; i < N; i++){ dEda = dEda + (a * x[i] - y[i]) * x[i]; } a = if (ite == 1 || ite == 10 || ite == 100) printf("%4d: a = %.8lf\n", ite, a); } printf("%4d: a = %.8lf\n", 1000, a); return 0; } このプログラムの a = の部分にa-(dE/da)*((d^2)E/d(a^2))^-1を代入したいのですがうまくいきません。((d^2)E/d(a^2))の値を格納する変数を用意してちゃんと計算できるようにするにはどうすればよいでしょうか? 補足 dE/da = Σ(ax-y)*x (d^2)E/d(a^2) = Σx^2 という計算になります。

専門家に質問してみよう