トップページ > 過去ログ > 記事閲覧
poi
名前:ファイルに書き込めない 日時: 2010/02/01 07:54

12X12 の大きさのmeshpanelを読み込んで、fprintfでtakasa / takasairoに書き込むのはどうすればよいのでしょうか? 実行すると、白い画面が出ます。パネルをマウス左で色が変わり、画面を閉じるとmeshpanelに数字が入ります。 数値の1〜9はそのまま、10〜12は、PQRで表します。 ↓のようにクリックすると、格子の色が変わります。  (左端を青、右端を緑にしました)  プログラムを実行しましたが、エラーが出てしまい、困っています。  宜しくお願いいたします。 meshpanel(例) takasa (期待の数値)  takasairo(期待の数値) 1000000000002 12 11 1 2 1000000000002 1000000000002 1000000000002 1000000000002 1000000000002 1000000000002 1000000000002 1000000000002 1000000000002 1000000000002 1000000000000 #include "DxLib.h" #define BOX (20) #define MESH_Y (12) #define MESH_X (12) #pragma warning(disable:4996) void hikaku(int suuji){ if (suuji <= 0) printf(" "); else if (suuji < 10) suuji= suuji; else if (suuji == 10) suuji='P'; else if (suuji == 11) suuji='Q'; else if (suuji == 12) suuji='R'; else if (suuji >= 13) printf("NO\n"); } /***********/ int PIEL(int x, int y, int color){ int Wh=GetColor(255,255,255), Bw=GetColor(70,70,255), Gr=GetColor(70,255,70), int col[]={Wh,Bw,Gr}, sx=x*BOX, sy=y*BOX; DrawBox(sx, sy, sx+BOX-1, sy+BOX-1, col[color], TRUE); return 0; } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ int SetFontThickness(int TinckPal), CheckHitKey(int KeyCode), i, j, MouseX, MouseY; int PIXjoho[MESH_Y][MESH_X]={0}, d=0, sum=0, Gry,genzaiti=0; int jMX=0, P=15, p[18][18], t[18], bango[18][18], ironanba[18][18], mm; FILE *file; ChangeWindowMode(TRUE); if(DxLib_Init() == -1){return -1;} SetMouseDispFlag(TRUE); Gry=GetColor(200, 200, 200); DrawBox(0, 0, 800, 600, Gry, TRUE); for(i=0; i<MESH_Y; i++){ for(j=0; j<MESH_X; j++){ PIEL(j, i, 0); } } /***********/ while(!ProcessMessage()){ if((GetMouseInput() & MOUSE_INPUT_LEFT)){ while (GetMouseInput() & MOUSE_INPUT_LEFT); GetMousePoint(&MouseX, &MouseY); MouseX = MouseX/BOX; MouseY = MouseY/BOX; if(MouseX<MESH_X && MouseY<MESH_Y){ PIXjoho[MouseY][MouseX]++; if( PIXjoho[MouseY][MouseX]>2) PIXjoho[MouseY][MouseX]=0; PIEL(MouseX,MouseY, PIXjoho[MouseY][MouseX]); } } } /*********/ file=fopen("meshpanel.txt","w"); for(i=0; i<MESH_Y; i++){ for(j=0; j<MESH_X; j++){ fprintf(file,"%d ", PIXjoho[i][j]); } fprintf(file,"\n"); } fclose(file); file=fopen("meshpanel.txt","r"); for(i=0; i<MESH_Y; i++){ for(j=0; j<MESH_X; j++){ fscanf(file,"%d", &PIXjoho[i][j]); } } fclose(file); /**********/ for (mm = 0; mm < P; mm++) { for (j = 0; j < P; j++){ t[j] = p[j][mm]; } for (j = 0; j < P+10;j++){ bango[mm][j] = 0; ironanba[mm][j] = 0; } while (genzaiti < P){ while ((t[genzaiti] == 0) && (genzaiti< MESH_Y)) genzaiti += genzaiti; if (genzaiti >= MESH_Y) break; i = t[genzaiti]; while (t[genzaiti] == i){ sum += sum; genzaiti += genzaiti; } bango[mm][d] = sum; ironanba[mm][d] = i; d += d; sum = 0; } } for (mm = 0; mm < P; mm++) { for (j = jMX+1; j < 20 ; j++){ if (bango[mm][j] > 0) jMX = j; printf("\n"); } } for (j = 0; j <= jMX ; j++) { for (mm = 0; mm < P; mm++){ printf("%2d", bango[mm][j]); } printf("\n"); } printf("\n"); for (j = 0; j <= jMX ; j++) { for (mm = 0; mm < P; mm++) { printf("%2d", ironanba[mm][j]); } printf("\n"); } printf("\n"); file=fopen("takasa.txt","w"); for (j = 0; j <= jMX ; j++) { for (mm = 0; mm < P; mm++) { hikaku(bango[mm][j]); scanf("%d",bango[mm][j]); fprintf(file,"%d",bango[mm][j]); } printf("\n"); } for (j = 0; j <= jMX; j++) { for (mm = 0; mm < P; mm++){ hikaku(bango[mm][j]); scanf("%d", bango[mm][j]); fprintf(file,"%d",bango[mm][j]); } printf("\n"); } printf("\n"); fclose(file); file=fopen("takasairo.txt","w"); for (j = 0; j <= jMX ; j++) { for (mm = 0; mm < P; mm++){ hikaku(ironanba[mm][j]); fprintf(file,"%2d",ironanba[mm][j]); } printf("\n"); } fclose(file); return 0; }

Page: 1 |

Re: poi ( No.1 )
名前:Will 日時:2010/02/01 10:18

質問の意味がさっぱりわからないのでざっと見て思った事書いておきます。 ・コメントが全く無いのでプログラムの意図が理解しにくい ・Windowsプログラムなのにprintfやscanfが使用されている ・hikaku関数で何をしたいのか意味不明 suuji= suuji; やsuuji='Q'; としたところで呼び元の値が変わるわけではないことが理解できていないのかな? ・メモリ破壊しているところがある for (j = 0; j < P+10;j++){ bango[mm][j] = 0; ironanba[mm][j] = 0; } の部分とか。 P=15と定義されているのでjは0〜24となる。 だけどbangoもironanbaも[18][18]しか存在しない。 よって18〜24までの間オーバーランしている。 メモリ破壊している時点でそのプログラムは正常に動作しないものになるので、 それ以降の処理が正しく動作しないことを検証しても意味が無いと思いますよ。
ファイルに書き込めない ( No.2 )
名前:poi 日時:2010/02/01 10:50

>Willさん ご回答・ご指摘ありがとうございます。 再度プログラムを見直してみます。 >管理人さんへ C言語の方で投稿してましたので、 削除お願い致します。
Re: poi ( No.3 )
名前:いっち 日時:2010/02/01 19:16

もうご覧になってはいないと思いますが、気になった点を書かせていただきます。 1.制御文の後の改行 おそらく書き込む行数を節約するためになさったことだとは思いますが、 制御文の後に続けて文(式)を書かずに改行を入れたほうが良いです。 if( PIXjoho[MouseY][MouseX]>2) PIXjoho[MouseY][MouseX]=0; ↓↓↓ if( PIXjoho[MouseY][MouseX]>2) PIXjoho[MouseY][MouseX]=0; あわせてタブインデントをしっかりつけることをお勧めします。 (もしかして、こういったスタイルで書いてある教本等があるのでしょうか?) 2.変数の役割、定数の意味 以下のようなコードがありますが > int jMX=0, P=15, p[18][18], t[18], bango[18][18], ironanba[18][18], mm; FILE *file; 変数 P がどの様な役割を果たすのか、18と言う定数が何を意味するのか一見してわかりにくいので、 変数にはわかりやすい名前を、定数は#defineかconst定数にしたほうが良いと思います。 3.変数のインクリメント 所々で以下のようなコードが見受けられますが、 > genzaiti += genzaiti; これはおそらく genzaiti を+1したいのだと思いますので、正しくは以下のようになります。 genzaiti++; 4.変数の初期化 ソースの74行目当たりに以下のコードがありますが、 > t[j] = p[j][mm]; p は未初期化と思われます。 5.関数内の変数 hikaku関数内の変数 suuji の中の値を利用したいようですが、suuji はローカル変数ですので無理です。 以下のように戻り値を返して利用してください。 int hikaku(int suuji){ if (suuji <= 0) printf(" "); else if (suuji < 10) suuji= suuji; else if (suuji == 10) suuji='P'; else if (suuji == 11) suuji='Q'; else if (suuji == 12) suuji='R'; else if (suuji >= 13) printf("NO\n"); return suuji; }

Page: 1 |