質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

3回答

9029閲覧

visual studio 2019でC言語のプログラムをデバッグしていたらエラーがでました。よくわからないので助けてください。

Beginner_Prog

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/03/07 17:11

##C言語でデバッグをしたらエラーが出ました。
何が書いてあるかよく理解できないので、解説していただけませんか?
ちなみにオセロを作っていました。

エラー文

Debug Asserition Failed!! (省略) Expressin: result_pointer != nullptr For information on how your program can cause an assertion failure, see the visual C++documentation on asserts. (Press retry to debug the application)

該当のソースコード

C言語

1#include < stdio.h > 2#include < stdlib.h > 3#include < time.h > 4 5 6#define BOARDSIZE 8 7 8#define NONE 0 9#define BLACK 1 10#define WHITE 2 11char board[BOARDSIZE][BOARDSIZE]; 12int vec_y[] = { -1,-1,0,1,1,1,0,-1 }; 13int vec_x[] = { 0,1,1,1,0,-1,-1,-1 }; 14 15void setBoard(void) 16{ 17 int i; 18 19 for (i = 0; i < BOARDSIZE * BOARDSIZE; ++i) { 20 board[i / BOARDSIZE][i % BOARDSIZE] = NONE; 21 } 22 board[BOARDSIZE / 2 - 1][BOARDSIZE / 2] = BLACK; 23 board[BOARDSIZE / 2][BOARDSIZE / 2 - 1] = BLACK; 24 board[BOARDSIZE / 2][BOARDSIZE / 2] = WHITE; 25 board[BOARDSIZE / 2 - 1][BOARDSIZE / 2 - 1] = WHITE; 26 27} 28void disp(void) { 29 int i, j; 30 printf(" "); 31 for (i = 0; i < BOARDSIZE; ++i) printf("%2d", i + 1); 32 printf("\n"); 33 34 for (i = 0; i < BOARDSIZE; ++i) { 35 printf("%d", (i + 1) * 10); 36 for (j = 0; j < BOARDSIZE; ++j) { 37 switch (board[i][j]) { 38 case NONE: 39 printf("・"); 40 break; 41 case BLACK: 42 printf("○"); 43 break; 44 case WHITE: 45 printf("●"); 46 break; 47 default: 48 printf("er"); 49 break; 50 } 51 } 52 printf("\n"); 53 } 54 55} 56int checkFlip(int y, int x, int turn, int vec) 57{ 58 int flag = 0; 59 while (1) { 60 y += vec_y[vec]; 61 x += vec_x[vec]; 62 if (x < 0 || y < 0 || x > BOARDSIZE - 1 || y > BOARDSIZE - 1) return 0; 63 64 if (board[y][x] == NONE) return 0; 65 66 67 if (board[y][x] == (turn ? BLACK : WHITE)) { 68 flag = 1; 69 continue; 70 } 71 if (flag == 1) break; 72 return 0; 73 } 74 return 1; 75} 76 77int check(int y, int x, int turn) 78{ 79 int vec; 80 81 for (vec = 0; vec < 8; ++vec) { 82 if (checkFlip(y, x, turn, vec) == 1) return 1; 83 } 84 85 return 0; 86} 87 88 89void flip(int y, int x, int turn, int vec) { 90 while (1) { 91 y += vec_y[vec]; 92 x += vec_x[vec]; 93 94 95 if (board[y][x] == (turn ? WHITE : BLACK)) break; 96 board[y][x] = (turn ? WHITE : BLACK); 97 } 98} 99 100int put(int y, int x, int turn) { 101 int vec, flag = 0; 102 if (board[y][x] != NONE) return 0; 103 for (vec = 0; vec < 8; ++vec) { 104 if (checkFlip(y, x, turn, vec) == 1) { 105 flip(y, x, turn, vec); 106 flag = 1; 107 } 108 } 109 if (flag == 1) { 110 board[y][x] = (turn ? WHITE : BLACK); 111 return 1; 112 } 113 114 return 0; 115} 116void input(int turn) 117{ 118 int place = 0, y, x; 119 while (1) { 120 121 printf(">"); 122 if (scanf_s("%d", &place) == 0) { 123 124 scanf_s("%*[^\n]%*c"); 125 printf("input error\n"); 126 continue; 127 } 128 129 130 if (place < 11 || place > 88) { 131 printf("input[%d]:error\n", place); 132 place = 0; 133 continue; 134 } 135 y = place / 10; 136 x = place % 10; 137 138 139 if (x < 1 || y < 1 || x > 8 || y > 8) { 140 printf("input[%d]:error\n", place); 141 place = 0; 142 continue; 143 } 144 145 if (put(y - 1, x - 1, turn) == 1) break; 146 else printf("input[%d]:can't flip\n", place); 147 place = 0; 148 } 149} 150 151 152void ai_rand(int turn) 153{ 154 int place = 0, y, x; 155 while (1) { 156 157 place = rand() % 89; 158 159 160 if (place < 11 || place > 88) { 161 place = 0; 162 continue; 163 } 164 y = place / 10; 165 x = place % 10; 166 167 168 if (x < 1 || y < 1 || x > 8 || y > 8) { 169 place = 0; 170 continue; 171 } 172 173 if (put(y - 1, x - 1, turn) == 1) { 174 printf(">%d\n", place); 175 break; 176 } 177 place = 0; 178 } 179} 180 181 182 183int checkEnd(int turn) 184{ 185 int i, j; 186 187 for (i = 0; i < BOARDSIZE; ++i) { 188 for (j = 0; j < BOARDSIZE; ++j) { 189 190 if (board[i][j] == NONE && check(i, j, turn) == 1) return 0; 191 } 192 } 193 194 turn = (turn + 1) % 2; 195 for (i = 0; i < BOARDSIZE; ++i) { 196 for (j = 0; j < BOARDSIZE; ++j) { 197 198 if (board[i][j] == NONE && check(i, j, turn) == 1) return 1; 199 } 200 } 201 202 return 2; 203} 204void checkWinner() { 205 int i, j, b = 0, w = 0; 206 207 208 209 210 for (i = 0; i < BOARDSIZE; ++i) { 211 for (j = 0; j < BOARDSIZE; ++j) { 212 switch (board[i][j]) { 213 case BLACK: 214 ++b; 215 break; 216 case WHITE: 217 ++w; 218 break; 219 default: 220 break; 221 } 222 } 223 } 224 225 226 disp(); 227 228 229 if (b > w) printf("○:Winner BLACK!\n"); 230 else if (b < w) printf("●:Winner WHITE!\n"); 231 else printf("Drawn game."); 232 233 234} 235int be() { 236 int* a = 0; 237 int* b = 0; 238 int c = 0; 239 printf(" オセロ\n"); 240 printf("ゲームを始める 1\n留まる 2\n"); 241 scanf_s(" %d", b); 242 if ("b == 1") { 243 244 } 245 else if ("b == 2") { 246 printf("また遊んでね~~"); 247 } 248 else { 249 printf("また遊んでね~_~"); 250 251 } 252 if ("b == 1") { 253 254 } 255 if ("b == 1") { 256 int turn = 0; 257 setBoard(); 258 srand(time(NULL)); 259 260 261 while (turn < 2) { 262 263 if (turn == 0) printf("turn:○\n"); 264 else printf("turn:●\n"); 265 266 267 disp(); 268 269 270 switch (turn) { 271 case 0: 272 input(turn); 273 break; 274 case 1: 275 ai_rand(turn); 276 break; 277 default: 278 printf("error\n"); 279 return -1; 280 } 281 282 283 turn = (turn + 1) % 2; 284 switch (checkEnd(turn)) { 285 case 1: 286 printf("pass\n"); 287 turn = (turn + 1) % 2; 288 break; 289 case 2: 290 printf("game end\n"); 291 turn = 2; 292 break; 293 default: 294 break; 295 } 296 297 } 298 checkWinner(); 299 } 300} 301 302int main() { 303 be(); 304 int* a = 0; 305 306 307 308 printf("\nゲームを終わるなら0を入力してね\n終わらないなら0以外を入力してね!"); 309 scanf_s(" %d", a); 310 if (a == 0) { 311 ; 312 } 313 else if (a != 0) { 314 be(); 315 } 316 317 return 0; 318 319}

(僕は馬鹿なのでたまにprintfの文字出力でふざけていることがあります。あとこれはあるサイトを参考にしたものです。)

エラーの写真

イメージ説明説](cbac463daf5effa613c8a2f2b3a7db6a.png)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ランタイムライブラリでエラーになっていますが、ランタイムライブラリが悪いわけではなく、関数を呼び出した時のパラメータに問題があると指摘しています。

エラーの原因ですが、

int be() { int* a = 0; int* b = 0; int c = 0; printf(" オセロ\n"); printf("ゲームを始める 1\n留まる 2\n"); scanf_s(" %d", b);

これです。
b を0で初期化しているので、NULL ポインターです。b は有効なオブジェクトを指し示していません。そこにscanfで値を格納しようとしてしてエラーになっています。

デバッグ中に何らかのエラーで中断した際は「呼び出し履歴」で、どこから呼びたしたのが調査することにより、バグのある箇所を特定することが出来ます。

画像の赤線の箇所がプログラムの呼び出し元です。
呼び出し履歴

投稿2020/03/08 01:14

編集2020/03/08 01:16
Bull

総合スコア986

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/03/08 03:02 編集

scanf_s()って使ったこと無いんですが・・・・(" %d", b);←この書式って、先頭の空白はどうなるんでしょう?
Bull

2020/03/08 03:24

" %d" だと余り意味はないですね。 元々 %d は先行する空白文字は読み飛ばしますので、結果的には同じです。 " %c" ですとスペースなどを読み飛ばしてから、読込みます。
cateye

2020/03/08 03:33

scanf()と同等の動作をするという事ですね。ありがとう、了解しました
Bull

2020/03/08 04:35

そっちの疑問でしたか。 scanf_s() は "%s" や "%c" などで、バッファオーバーランを防ぐ目的で導入されたようです。 "%d" や "%f" などは変更がなかったと思います。
Beginner_Prog

2020/03/08 07:38

Bullさんありがとうございます!おかげでちゃんと動作しました! 感謝します!
guest

0

ちょっと見ですが、Cあるいは、C++に"if ("b == 1") {"と言うような構文はありません
・・・あえて言えば、"b == 1"は文字列のアドレスですから、常に真になります。

投稿2020/03/07 18:11

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/03/07 21:53 編集

"result_pointer != nullptr"←結果がnullptrではない 「For information on how your program can cause an assertion failure, see the visual C++documentation on asserts.」 ↓ →あなたのプログラムがアサーションを引き起こす可能性があります。 方法については、Visual C ++のマニュアルのassertsを参照してください。
guest

0

Visual Studioを持ってないけど

C

1int main() { 2 be(); 3 int* a = 0; 4 5 printf("\nゲームを終わるなら0を入力してね\n終わらないなら0以外を入力してね!"); 6 scanf_s(" %d", a);

これじゃ落ちるでしょう。
int* a = 0; とは、a という名前のポインタ変数を、0 という値で初期化する、ということ。
scanf_s(" %d", a); とは、キー入力した数値を、0 番地に格納しろ、ということ。
悪名高きゼロ番地アクセスするのだから、何を言われても仕方ないでしょう。

投稿2020/03/08 02:17

rubato6809

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rubato6809

2020/03/08 02:28

ああ、be()関数の先頭で同じことをしていたのね〜。Bullさんが既に指摘してますね。 この手の勘違いをする人が後を断ちません。教え方・テキストの説明が悪いんじゃないかと思います。質問者は何で・誰に学んだか、興味あります。
Beginner_Prog

2020/03/08 07:36

指摘ありがとうございます!使ったC言語の参考書はやさしいCと言う本です!あとはネットなどのサイトを見たりして、いろんなものを使って作りました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問