警告 W8075 問題のあるポインタの変換でお聞きしたいのですが

このQ&Aのポイント
  • 警告 W8075問題のあるポインタの変換(関数 map_data )
  • タイトルを生成するプログラムが警告 W8075 問題のあるポインタの変換という警告を出してしまい、対処方法を教えてほしいです。
  • map_data()関数が問題のあるポインタの変換をしている警告が出ていますが、具体的に何が問題なのか教えていただけますか。
回答を見る
  • ベストアンサー

警告 W8075 問題のあるポインタの変換でお聞きしたいのですが

下にあるようなプログラムを組んだのですが、 警告 W8075 test4.c 47: 問題のあるポインタの変換(関数 map_data ) といった警告が出てしまい、どのように対処したらいいのかわかりません。 警告内容からmap_data()関数がおかしいと思いますが、何がおかしいのか指摘していただけないでしょうか。 /*読み込むマップデータテキストの例10×10 0011111111 1000111111 1000011111 1100011111 1111011111 1111011111 1111000111 1111000111 1111000111 1111001111 */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #define MAXBUFF 256 void disp(char dt[][10]);//コントロール+表示 void map_data(char map_name[]);//マップデータ読み込み関数 int PC_ymove=0,PC_xmove=0;//キャラクターの初期値 int main(void) { //マップデータ読み込み関数 map_data("dun1.txt"); return 0; } //マップデータ読み込み関数 void map_data(char map_name[]) { FILE *fp; char str[MAXBUFF]; fp=fopen(map_name,"r"); if(NULL==fp){ fprintf(stderr,"ファイルのオープン失敗\n"); exit(0); } while(NULL!=fgets(str,MAXBUFF,fp)){ disp(str); } fclose(fp); } //読み込んだマップデータに床と壁とキャラを表示させる void disp(char dt[][10]) { int key; int y,x; system("cls"); for(y=0;y<10;y++){ for(x=0;x<10;x++){ if((y==PC_ymove)&&(x==PC_xmove)){ printf("@"); } else if(dt[y][x]==0){ printf("+"); } else{ printf("#"); } while(1){ //キャラクターの操作部分 if(kbhit()){ key=getch(); switch(key){ case 'w'://Key↑ 119 if((PC_ymove>0)&&(dt[PC_ymove-1][PC_xmove]!=1)) PC_ymove--; break; case 's'://Key↓ 115 if((PC_ymove<9)&&(dt[PC_ymove+1][PC_xmove]!=1)) PC_ymove++; break; case 'a'://Key← 97 if((PC_xmove>0)&&(dt[PC_ymove][PC_xmove-1]!=1)) PC_xmove--; break; case 'd'://Key→ 100 if((PC_xmove<9)&&(dt[PC_ymove][PC_xmove+1]!=1)) PC_xmove++; break; default: //printf("想定外のキー入力がありました。\n"); break; } } } } } printf("\n"); }

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.6

>@だけしか表示されないし動かないので そりゃそうです。 @だけしか表示されないのは、x=0,y=0で@を表示したあと > while(1){ //キャラクターの操作部分 の無限ループに入ってしまい、x,yのforループが回ってないから。 キーを押しても動かないのは > while(1){ //キャラクターの操作部分 のループの中で何も表示せず、ひたすらキー入力とPC_xmove, PC_ymoveの変更しかしていないから。 プログラムは書かれた通りに動いています。 配列云々以前に、プログラムの構成自体がおかしいのです。 また、 >else if(dt[y][x]==0){ >if((PC_ymove>0)&&(dt[PC_ymove-1][PC_xmove]!=1)) >if((PC_ymove<9)&&(dt[PC_ymove+1][PC_xmove]!=1)) >if((PC_xmove>0)&&(dt[PC_ymove][PC_xmove-1]!=1)) >if((PC_xmove<9)&&(dt[PC_ymove][PC_xmove+1]!=1)) ここでdt[][]と0/1を比較していますが、dtの中身はmain関数のstrの中身、つまり、テキストファイルから読み出した文字です。 文字'0'と数値0、文字'1'と数値1、とは一緒ではありません。 一つの解として。 ・disp( char dt[][10] )という宣言に合うように、マップデータの入った二次元配列を用意する。 → char map[10][10];とでもしておく。 ・map_data関数で取り込んだ文字'0','1'を数値0,1に変換してmapに入れる。 そのために、宣言をチョット変える ・disp関数はマップと自キャラの表示だけにする。 むやみに一つの関数でなにもかもやろうとしない。今回は表示と移動を同時にやろうとして失敗している。 →while(1)のループをばっさりと削除 →printf("\n")の場所もおかしい。これではマップの1行毎に改行されず、全部表示されたあとに改行される。 ・移動は別関数にする。moveとでも名付ける。 ↑で削ったwhile(1)ループを使うけど、キー入力があったらループを抜けるように工夫する ・main関数は次の通り 1)map_dataでファイルを読み込み 2)表示 3)移動 4) 2)へ戻る

その他の回答 (6)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.7

つづき) で、変更したらこうなりました。 エラー処理とか終了処理とか system("cls")とか、まだまだ不十分だけど、とりあえず動作は確認。 #include <stdio.h> #include <stdlib.h> #include <conio.h> #define MAXBUFF 256 void disp(char dt[][10]);//コントロール+表示 void map_data(char dt[][10], char map_name[]);//マップデータ読み込み関数 void move(char dt[][10]) ;//キャラクターの操作部分 int PC_ymove=0,PC_xmove=0;//キャラクターの初期値 int main(void) { char map[10][10]; //マップデータ //マップデータ読み込み関数 map_data(map,"dun1.txt"); //メインループ while (1) { disp(map); //表示する move(map);//移動する } return 0; } //マップデータ読み込み関数 void map_data(char dt[][10], char map_name[]) { FILE *fp; int x,y = 0 ; char str[MAXBUFF]; fp=fopen(map_name,"r"); if (NULL==fp) { fprintf(stderr,"ファイルのオープン失敗\n"); exit(0); } while (NULL!=fgets(str,MAXBUFF,fp)) { for ( x = 0 ; x < 10 ; ++ x ) { if ( str[x] == '1' ) { dt[y][x] = 1 ; } else { dt[y][x] = 0 ; } } y ++ ; } fclose(fp); } //読み込んだマップデータに床と壁とキャラを表示させる void disp(char dt[][10]) { int y,x; system("cls"); for (y=0; y<10; y++) { for (x=0; x<10; x++) { if ((y==PC_ymove)&&(x==PC_xmove)) { printf("@"); } else if (dt[y][x]==0) { printf("+"); } else { printf("#"); } } printf("\n"); } } //キャラクターの操作部分 void move(char dt[][10]) { int key; while ( ! kbhits()) { //キー入力待ち } key=getch(); switch (key) { case 'w'://Key↑ 119 if ((PC_ymove>0)&&(dt[PC_ymove-1][PC_xmove]!=1)) PC_ymove--; break; case 's'://Key↓ 115 if ((PC_ymove<9)&&(dt[PC_ymove+1][PC_xmove]!=1)) PC_ymove++; break; case 'a'://Key← 97 if ((PC_xmove>0)&&(dt[PC_ymove][PC_xmove-1]!=1)) PC_xmove--; break; case 'd'://Key→ 100 if ((PC_xmove<9)&&(dt[PC_ymove][PC_xmove+1]!=1)) PC_xmove++; break; default: //printf("想定外のキー入力がありました。\n"); break; } }

BeginnerZ
質問者

お礼

ありがとうございます。 まだまだ未熟者でした。 関数を覚えると、ついついmain関数の中を少しでもスッキリさせたくなって、余計に分からなくしていました。 あと、void map_data(char dt[][10], char map_name[])でchar dt[][10]とchar map_name[]の二つを引数に取るアイデアっていうか、そういったのが浮かんでこなかったです。 もっとがんばりますので、これからもよろしくお願いします。

回答No.5

  >disp(str); -> disp((char (*)[10])str);  これだけじゃ、だめだ。   int c, i; ... for(i = 0; i < 256 && (c = fgetc(fp)) != EOF; ){ if(c != '\n') str[i] = c, ++ i; } disp((char (*)[10])str); ... 他は見てないけど、とりあえずこんな感じにしてみる。    

BeginnerZ
質問者

お礼

1文字ずつ読み込ませて見るやり方も試してみましたが、なんかうまくいきません。 で、こっちもやって見ましたがだめでした。 while ((c = fgetc(fp)) != EOF){    str[i] = (char)c;    i++; @だけしか表示されないし動かないので、他に何か配列をいじれる別の方法を模索してみます。 受け取り側の、disp関数をもう少しいじってみたいと思います。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.4

#2追加(本題からはそれた内容です) キャストの具体的な方法が分からなかったので書かなかったんですが キャストで対応するにしても読み込みバッファを変更するにしても このプログラムでは質問者さんが期待してるととうりには動かないでしょう そもそも disp 関数の処理の中身を考えると関数呼んでる位置が悪いから (そこらへんは御自分でお考えください)

BeginnerZ
質問者

お礼

がんばってみましたが頭がパニックってしまい、何がなにやらわからなくなってしまいました。 普通に画面へ表示させるだけなら出来るのですが、読み込んだ配列データを他の関数にうまく渡せません。 もう少し悪戦苦闘はしてみます。

回答No.3

   disp(str); -> disp((char (*)[10])str);

BeginnerZ
質問者

お礼

質問に答えていただきありがとございます。 書かれている事をやってみましたが、残念ながらうまく表示されませんでした。 警告は出なくなりましたが@だけ表示され、キーコマンドは受け付けてくれません。 もう少し配列と関数について調べてみます。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

>警告内容からmap_data()関数がおかしいと思いますが、何がおかしいのか指摘していただけないでしょうか。 多分違う おかしいのは disp 関数で プロトタイプで void disp(char dt[][10]) にしてるのに 実際の呼び出しで disp(str); ってしてるからだと思いますが 型合わせてください

BeginnerZ
質問者

お礼

質問に答えていただきありがとございます。 書かれている事をやってみましたが、残念ながらうまく表示されませんでした。 おっしゃる通りで、disp関数側で二次元配列として受け取ってもらえないです。 もう少し配列と関数について調べてみます。

  • dido123
  • ベストアンサー率34% (11/32)
回答No.1

int main(void) { //マップデータ読み込み関数 map_data("dun1.txt"); return 0; } //マップデータ読み込み関数 void map_data(char map_name[]) ↓ void map_data(char *map_name) 後、プロトタイプ宣言の修正。 で、どうでしょうか。

BeginnerZ
質問者

お礼

質問に答えていただきありがとございます。 書かれている事をやってみましたが、残念ながらうまく表示されませんでした。 もう少し配列と関数について調べてみます。

関連するQ&A

  • ポインタと配列

    次のソースで、結果表示でポインタを使いたいのですが、うまくいきません。1件しか表示されないのです。 ポインタの扱いがおかしいのだと思いますが、どうしたらよいでしょうか? #include <stdio.h> #include <string.h> int search(char key[256],FILE *fp,char *result[256][256]); main(void) { FILE *fp; int rep,n,i; char x[256],key[256],*result[256][256]; printf("検索キーワードを入力してください。\n" "キーワード>"); gets(key); if((fp=fopen("personal.txt","r"))==NULL) { printf("ファイルをオープンできません\n"); exit(1); } printf("=====検索結果=====\n"); n=search(key,fp,result); for(i=0;i<n;i++) { printf("%s\n",result[i]); } printf("検索結果:%d件です。\n",n); fclose(fp); } int search(char key[256],FILE *fp,char *result[256][256]) { int n=0; char *p,word[256],*name; while((p=fgets(word,256,fp))!=NULL) { if(strstr(word,key)!=NULL) { name=strtok(p," "); strcpy(result[n],name); n++; } } return n; } 実行すると、下の警告がでます。 illegal pointer combination(param)

  • 問題のあるポインタ変換

    char *x; int i; x = f( i ); で、fは char * ( int y ); と言った関数なのですが、 警告で、問題のあるポインタ変換と出てしまいます。 これはなぜでしょう?ご教授お願い致します。

  • C言語にて至急質問!!

    授業でゲーム作成してますがタイム表示とえさの残り数表示と残りのライフ表示 のプログラムがわかりません プログラムは下にあります #include<stdio.h> #include<stdlib.h> #include<time.h> #include"utility.h" int map[25][40]; typedef struct{ int x; int y; int life; int col; }CHAR; void disp(int,int); void main(void) { FILE *fp; CHAR man,mapsize,teki[5]; int i,j,cnt = 0,x,y,flg,wx,wy,stime = 0,etime = 0 ; GetConsoleHandle( ); srand(time(NULL)); fp = fopen("map.txt","r"); if(fp == NULL){ printf("ファイルエラー\n"); return; } fscanf(fp,"%d %d",&mapsize.y,&mapsize.x); fscanf(fp,"%d %d",&man.y,&man.x); wy = man.y; wx = man.x; fscanf(fp,"%d" "%d",&y,&x); for(i = 0;i < mapsize.y;i++) for(j = 0;j < mapsize.x;j++){ fscanf(fp,"%d",&map[i][j]); if(map[i][j] == 1) cnt++; } fclose(fp); disp(mapsize.x,mapsize.y); Locate(man.x * 2 +10,man.y + 3); printf("Э"); if(map[man.y][man.x] == 1){ cnt--; map[man.y][man.x] = 0; } man.life = 10; man.col = 0x0e; for(i = 0;i < 5;i++){ teki[i].y = y; teki[i].x = x; teki[i].life = 1; teki[i].col = rand() % 7 + 9; } while(cnt && man.life){ Wait(100); if(KeyCheck(ESCAPE)) break; Locate(man.x * 2 + 10,man.y + 3); SetColor2(0x00); printf(" "); if(KeyCheck (LEFT) && map[man.y][man.x - 1] != 9){ man.x--; } if(KeyCheck (RIGHT) && map[man.y][man.x + 1] != 9){ man.x++; } if(KeyCheck (UP) && map[man.y - 1][man.x] != 9){ man.y--; } if(KeyCheck (DOWN) && map[man.y + 1][man.x] != 9){ man.y++; } flg = -1; for(i = 0;i < 5;i++){ if(man.y == teki[i].y && man.x == teki[i].x) flg = i; } if(flg == -1){ if(map[man.y][man.x] > 9){ j = map[man.y][man.x]; man.x = j / 100; man.y = j % 100; } if(map[man.y][man.x] == 1){ cnt--; map[man.y][man.x] = 0; } else if(map[man.y][man.x] == 2){ map[man.y][man.x] = 0; stime = time(NULL); etime = stime + 10; } }else{ stime = time(NULL); if(stime < etime){ teki[flg].life--; if(map[teki[flg].y][teki[flg].x] == 1){ map[teki[flg].y][teki[flg].x] = 0; cnt--; }else if(map[teki[flg].y][teki[flg].x] == 2){ map[man.y][man.x] = 0; stime = time(NULL); etime = stime + 10; } }else{ man.life--; SetColor(0x0f); Locate(60,3); Locate(teki[flg].x * 2,teki[flg].y); SetColor2(teki[flg].col); printf("Ψ"); man.x = wx; man.y = wy; Wait(3000); Locate(man.x * 2 + 10,man.y + 3); SetColor2(man.col); printf("Э"); } } Locate(man.x * 2 + 10,man.y + 3); SetColor2(man.col); printf("Э"); for(i = 0;i < 5;i++){ if(teki[i].life == 1){ Locate(teki[i].x * 2 + 10,teki[i].y +3); switch(map[teki[i].y][teki[i].x]){ case 0:SetColor2(0x0f); printf(" "); break; case 1:SetColor2(0x0f); printf("・"); break; case 2:SetColor2(0x0c); printf("♪"); break; } j = rand() % 4; if(j == 0 && map[teki[i].y - 1][teki[i].x] != 9){ teki[i].y--; } if(j == 1 && map[teki[i].y][teki[i].x + 1] != 9){ teki[i].x++; } if(j == 2 && map[teki[i].y + 1][teki[i].x] != 9){ teki[i].y++; } if(j == 3 && map[teki[i].y][teki[i].x - 1] != 9){ teki[i].x--; } Locate(teki[i].x * 2 + 10,teki[i].y + 3); stime = time(NULL); if(stime < etime) SetColor2(teki[i].col << 4); else SetColor2(teki[i].col); printf("Ψ"); }else{ stime = time(NULL); if(stime >= etime){ teki[i].life = 1; teki[i].y = y; teki[i].x = x; } } } } } void disp(int x,int y){ int i,j; for(i = 0;i < y;i++){ for(j = 0;j < x;j++){ Locate(j*2 + 10,i + 3); switch(map[i][j]){ case 0:SetColor2(0x00); printf(" "); break; case 1:SetColor2(0x0f); printf("・"); break; case 2:SetColor2(0x0c); printf("♪"); break; case 9:SetColor2(0x99); printf("■"); break; default:SetColor2(0x0d); printf(" "); } } } } このどこかに質問したプログラムがはいるかもおしえてほしいです。 至急回答をどうかおねがいします

  • RPGゲームの簡単なプログラムを打ってみたんですがうまく表示されません

    RPGゲームの簡単な初歩的なサンプルプログラムを自分で打ってみたんですが、思った通りに表示されません。 以下のソースのどこかおかしいとこありますでしょうか。 #include<stdio.h> #include<windows.h> #define MAP_SIZE_Y 10 #define MAP_SIZE_X 10 int x = 4,y = 5; int j,i; int map[100][100] = { {1,1,1,1,1,1,1}, {1,0,0,3,0,0,1}, {1,0,0,0,0,0,1}, {1,0,2,0,2,0,1}, {1,0,0,0,0,0,1}, {1,1,1,1,1,1,1}, }; void DrawMap(){ for(j = 0; i < MAP_SIZE_Y; j++){ for(i = 0; i < MAP_SIZE_X; i++){ if(j == y && i == x){ printf("勇"); }else{ switch ( map[j][i]){ case 1: printf("■"); break; case 2: printf("兵"); break; case 3: printf("王"); break; default:printf(" "); break; } } } printf("\n"); } } void main(){ while(1) { system("cls"); DrawMap(); } }

  • C言語 ゲーム

    このプログラムに関数を一つ増やしたいのですが、うまくできません。どこを、どうすればいいでしょう? 迷路の内容は未完成です。 #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> int KEY(int *Kn,int *Y,int *X); int main(void) { //数値格納 int kn; //入力キー int sty,stx; //座標 int fy,fx; //マップ範囲 int jm[25][40]; //移動可不判定 char mapc[3]={0};//複写されたマップ構成情報 //カウント int y,x; //判定生成、座標生成・描写用 //マップチップ char mc[2][3]={ /*mc[0] 移動可能*/" ", /*mc[1] 移動不可*/"■"}; //マップ構成 (最大値 25行x40列) char map[][81]={ /*00*/"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■", /*01*/"■ ■                                    ■", /*02*/"■ ■■■■ ■                               ■", /*03*/"■ ■■   ■                               ■", /*04*/"■  ■ ■■■                               ■", /*05*/"■■ ■ ■                                 ■", /*06*/"■  ■ ■                                 ■", /*07*/"■ ■■ ■                                 ■", /*08*/"■    ■ ■                               ■", /*09*/"■                                      ■", /*10*/"■                                      ■", /*11*/"■                                      ■", /*12*/"■                                      ■", /*13*/"■                                      ■", /*14*/"■                                      ■", /*15*/"■                                      ■", /*16*/"■                                      ■", /*17*/"■                                      ■", /*18*/"■                                      ■", /*19*/"■                                      ■", /*20*/"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■"}; //マップ範囲算出 fy=sizeof(map)/81; //行 fx=strlen(map[0])/2; //列 //キャラクター初期座標指定 sty=8,stx=8; /* 判定生成 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2 ); if(strncmp(mc[1],mapc,2)==0){jm[y][x]=1;} //移動不可判定 else if(strncmp(mc[0],mapc,2)==0){jm[y][x]=0;} //移動可能判定 } } /* 画面出力 */ while(1){ system("cls"); //画面消去 /* 座標生成、描写 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2); if(jm[y][x]==0){ if(y==sty&&x==stx) {printf("%s","○");} //キャラ表示 else if(strncmp(mc[0],mapc,2)==0) {printf("%s",mapc );} //移動可能表示 } else if (strncmp(mc[1],mapc,2)==0) {printf("%s",mapc );} //移動不可表示 } if(fx<40){printf("\n");} //fxが40未満の場合、改行 } if(sty==1&&stx==1){ printf("ゴールしました\n"); } /* 入力キー、移動座標出力 */ KEY(&kn,&sty,&stx); /* 壁、マップ外への侵入防止 */ for(y=0;y<sty+1;y++){ for(x=0;x<fx;x++){ if((y==sty&&x==stx&&jm[y][x]==1)||(fy<=sty||fx<=stx)){ if(kn==0x4b){stx++;} else if(kn==0x4d){stx--;} else if(kn==0x48){sty++;} else if(kn==0x50){sty--;} break; } } } /* 終了操作 */ if(kn==0x1b){printf("▼終了します。\n") ;break;} } } /* 入力キー、移動座標出力 */ int KEY(int *Kn,int *Y,int *X){ while(1){ *Kn=getch( ); //1:通常キー if (*Kn==0){ *Kn=getch( ); //2:特殊キー if (*Kn==0x4b){(*X)--;}// ← else if (*Kn==0x4d){(*X)++;}// → else if (*Kn==0x48){(*Y)--;}// ↑ else if (*Kn==0x50){(*Y)++;}// ↓ else if (*Kn==0x80){ }//特殊キー追加場所 else {continue;} break; } else if (*Kn==0x1b){}// Esc //else if (*Kn== ){} 通常キー追加場所 else {continue;} break; } return 0; }

  • C言語 ゲーム

    今回が質問初めてです。見にくかったらすいません。下のプログラムですが、これに構造体を使わなくてはいけないのですが、まったくわかりません。みなさんはどう書き換えますか? #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> int KEY(int *Kn,int *Y,int *X); int main(void) { //数値格納 int kn; //入力キー int sty,stx; //座標 int fy,fx; //マップ範囲 int jm[25][40]; //移動可不判定 char mapc[3]={0};//複写されたマップ構成情報 //カウント int y,x; //判定生成、座標生成・描写用 //マップチップ char mc[2][3]={ /*mc[0] 移動可能*/" ", /*mc[1] 移動不可*/"■"}; //マップ構成 (最大値 25行x40列) char map[][81]={ /*00*/"■■■■■■■■■■", /*01*/"■ ■      ■", /*02*/"■ ■■■■ ■ ■", /*03*/"■ ■■   ■ ■", /*04*/"■  ■ ■■■ ■", /*05*/"■■ ■ ■   ■", /*06*/"■  ■ ■ ■■■", /*07*/"■ ■■ ■   ■", /*08*/"■    ■ ■ ■", /*09*/"■■■■■■■■■■"}; //マップ範囲算出 fy=sizeof(map)/81; //行 fx=strlen(map[0])/2; //列 //キャラクター初期座標指定 sty=8,stx=8; /* 判定生成 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2 ); if(strncmp(mc[1],mapc,2)==0){jm[y][x]=1;} //移動不可判定 else if(strncmp(mc[0],mapc,2)==0){jm[y][x]=0;} //移動可能判定 } } /* 画面出力 */ while(1){ system("cls"); //画面消去 /* 座標生成、描写 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2); if(jm[y][x]==0){ if(y==sty&&x==stx) {printf("%s","○");} //キャラ表示 else if(strncmp(mc[0],mapc,2)==0) {printf("%s",mapc );} //移動可能表示 } else if (strncmp(mc[1],mapc,2)==0) {printf("%s",mapc );} //移動不可表示 } if(fx<40){printf("\n");} //fxが40未満の場合、改行 } if(sty==1&&stx==1){ printf("ゴールしました\n"); } /* 入力キー、移動座標出力 */ KEY(&kn,&sty,&stx); /* 壁、マップ外への侵入防止 */ for(y=0;y<sty+1;y++){ for(x=0;x<fx;x++){ if((y==sty&&x==stx&&jm[y][x]==1)||(fy<=sty||fx<=stx)){ if(kn==0x4b){stx++;} else if(kn==0x4d){stx--;} else if(kn==0x48){sty++;} else if(kn==0x50){sty--;} break; } } } /* 終了操作 */ if(kn==0x1b){printf("▼終了します。\n") ;break;} } } /* 入力キー、移動座標出力 */ int KEY(int *Kn,int *Y,int *X){ while(1){ *Kn=getch( ); //1:通常キー if (*Kn==0){ *Kn=getch( ); //2:特殊キー if (*Kn==0x4b){(*X)--;}// ← else if (*Kn==0x4d){(*X)++;}// → else if (*Kn==0x48){(*Y)--;}// ↑ else if (*Kn==0x50){(*Y)++;}// ↓ else if (*Kn==0x80){ }//特殊キー追加場所 else {continue;} break; } else if (*Kn==0x1b){}// Esc //else if (*Kn== ){} 通常キー追加場所 else {continue;} break; } return 0; }

  • セグメンテーション違反

    穴掘り方というやり方で迷路を作っています。 とりあえずすこしだけ作ってみて実行したらセグメンテーション違反が起こってしまいました。 解説お願いします。 次のサイトを参考にしています。ttp://www.ced.is.utsunomiya-u.ac.jp/lecture/2009/prog/p3/kadai4/5.html #include<stdio.h> #include<stdlib.h> #include<time.h> #define A 51 #define B 51 /*51ラ51マスの迷路*/ void initialize(int *x,int *y,int map[A][B]);  /*最初のステージ作成と座標決定*/ int dig(int *x,int *y,int map[A][B]);   /*道を作る*/ int main(void) { int x,y;   /*現在の座標*/ int map[A][B];    initialize(&x,&y,map); dig(&x,&y,map); map[1][0] = 2; map[A-2][B-1] = 2; for(y=0;y<B;y++){ for(x=0;x<A;x++){ if( map[x][y] == 0){ printf(" "); }else if( map[x][y] == 1){ printf("■"); }else if( map[x][y] == 2){ printf("..") ; } } printf("\n"); } } void initialize(int *x,int *y,int map[A][B]) { int i,h; for(i=0;i<A;i++){ for(h=0;h<B;i++){ map[i][h]=1; } } do{ *x=rand()%A; *y=rand()%B; }while(*x!=0 && *x!=A-1 && *y!=0 && *y!=B-1); } int dig(int *x,int *y,int map[A][B]) { int r,c,dx,dy,count=0; do{ r = rand()%4; switch(r){     /*道を進める方向を決める*/ case 0: dx = 0; dy = -1; break; case 1: dx = -1; dy = 0; break; case 2: dx = 0; dy = 1; break; case 3: dx = 1; dy = 0; break;    } if(*x+dx*2 <= 0 || *y+dy*2 <= 0 || *x+dx*2 >= A-1 || *y+dy*2 >= B-1 || map[*x+dx*2][*y+dy*2] == 0){ c = 0; count++; if(count ==4){     /*4方向とも進めなかったらループを抜ける*/ break; } }else if(map[*x+dx*2][*y+dy*2] == 1){ map[*x+dx][*y+dy] = 0; *x = *x + dx*2; *y = *y + dy*2; c =1; } }while(c==0); }

  • c言語迷路問題!!!緊急

    以下のプログラム毎行一つずつ、コマンド書いてほしいです。地図大きから書いてないでず、他のコマンドよろしくお願いします、ありがとうございます。 #include <stdio.h> #define MAP_X 39 // X座標 #define MAP_Y 43 // Y座標 #define LOL 24 void map() ; // 地図 void cm() ; void trap() ; void map1() ; int ws[ LOL * MAP_X ] ; int wk[ MAP_X * MAP_Y ] = { }; int a = 1 ; char com ; int pz = 1599 ; int main( void ) { int flg = 1 ; map() ; while( flg != 0 ) { cm() ; switch( com ) { case 'w' : if( wk[ pz - 39 ] == 0 ) { wk[ pz - 39 ] = 2 ; wk[ pz ] = 0 ; pz -= 39 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 's' : if( wk[ pz + 39 ] == 0 ) { wk[ pz + 39 ] = 2 ; wk[ pz ] = 0 ; pz += 39 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'a' : if( wk[ pz - 1 ] == 0 ) { wk[ pz - 1 ] = 2 ; wk[ pz ] = 0 ; pz -= 1 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'd' : if( wk[ pz + 1 ] == 0 ) { wk[ pz + 1 ] = 2 ; wk[ pz ] = 0 ; pz += 1 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'j' : if( wk[ pz + 2 ] == 0 ) { wk[ pz + 2 ] = 4 ; wk[ pz ] = 0 ; pz += 2 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'e' : printf( "GAME OVER\n" ) ; flg = 0 ; break ; } } } void map() { int i ; map1() ; for( i = 0 ; i < MAP_X * LOL ; i++ ) { if( ( i / MAP_X ) == a ) { printf( "\n" ) ; a++ ; } switch( ws[ i ] ) { case 1 : printf( "■" ) ; break ; case 2 : printf( "※" ) ; break ; case 3 : printf( "宝" ) ; break ; case 4 : printf( "☆" ) ; break ; case 5 : printf( "" ) ; break ; default : printf( " " ) ; break ; } } a = 1 ; printf( "\n" ) ; printf( "コマンド入力 : " ) ; } void map1() { int i ; for ( i = 0 ; i < (LOL * MAP_X) ; i++ ) { ws[i] = wk[i + (MAP_X * 19 ) ] ; } } void cm() { scanf( "%s" , &com ) ; }

  • C言語 シンプルソート

    C言語始めて1年の初心者です。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 10000 void swapData(char *x, char *y); void simpleSort(char data[], int first, int last); int main(int argc, char *argv[]) { int data[MAXSIZE][300]; int i, j, count; FILE *fp; if(argc != 2) { fprintf(stderr, "Usage: %s <filename>\n", argv[0]); exit(0); } if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "File %s is not found.\n", argv[1]); exit(0); } for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i]) == EOF) break; } simpleSort(data[], 0, i - 1); for(j = 0; j < i; j++) printf("%s\n", data[j]); } void swapData(char *x, char *y){ char tmp[300]; strcpy(tmp, x); strcpy(x, y); strcpy(y, tmp); } void simpleSort(char data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(strcmp(&data[i], &data[j]) > 0) swapData(&data[i], &data[j]); } } } 読み込んだ文字データをシンプルソートするプログラムなんですが、コンパイルできません。 simpleSortの部分がおかしいみたいなんですが、見直しても先入観からか間違いを見つけられません・・・・ どなたか間違いを指摘していただけたら助かります。

  • ポインタ配列

    "one","two","three","four","five","six","seven","eight","nine","ten" のポインタ配列の文字列を、ASCIIコード順に並べ変えようと思ったのですが、 もうどこが間違っているかさえわからないぐらいになってしまいました。 まだまだはじめたばかりなもので、わからないことだらけなんで、 できるだけわかりやすい説明おねがいします。 関数の引数に問題があるのじゃないかと思ったのですが、 何かいいアドバイスありましたら、お願いします。 #include <stdio.h> /* 関数のプロトタイプ宣言 */ int strmp(char *,char *); void cpy(char *,char *); int main (void) { /* ポインタ配列の定義 */ char *x[10]={"oneee","twooo","three","fourr","fivee","sixxx","seven","eight","ninee","tennn"}; /* ポインタのポインタの定義 */ char **pp=x; char k[100]; char *p=k; int i,t,a,b,c,d; a=0; /* ポインタ配列を自作関数を使って、ASCIIコードの大きいほうからに並び替える */ for(i=0;i<9;i++) { for(t=1;t<10;t++) { a=strmp(*(pp+i),*(pp+t)); if(a<0) { cpy(p,*(pp+i) ); cpy(*(pp+i),*(pp+t) ); cpy(*(pp+t),p); } } } for(i=0;i<10;i++) { printf("%s ,",x[i]); } printf("\n"); return 0; } /* 文字の比較をする関数 */ int strmp(char *x,char *y) { int i; for(i=0;*(x+i)==*(y+i);i++) { if( *(x+i)=='\0') { return 0; } } return *(x+i)-*(y+i); } /* 文字をコピーする関数 */ void cpy(char *a,char *b) { int i; for(i=0;*(b+i)!='\0';i++) { *(a+i)=*(b+i); } *(a+i)='\0'; }

専門家に質問してみよう