Консольное приложение Visual Studio 2017 — неизвестная ошибка компиляции

Я использовал Visual Studio 2017 (версия для сообщества) в течение нескольких месяцев и сделал несколько приложений, но никогда не сталкивался с этой ошибкой компиляции, которую я получил здесь. Я нашел некоторые темы с ошибкой, аналогичной моей, но ни одна из них на самом деле не помогла.

Сегодня я открыл открытую визуальную студию и решил сделать классическую консольную игру в крестики-нолики. Я начал кодировать его, но я никогда не отлаживал время от времени. Когда я наконец скомпилировал и протестировал программу, я получил эту ошибку:

Exception thrown at 0x00007FFC120B0FE1 (ucrtbased.dll) in
CppTicTacToe.exe: 0xC0000005: Access violation reading location
0x0000000000000000.

Я предполагаю, что это связано с нарушением синтаксиса, но не знаю, что это на самом деле означает. Со стороны консоли он как бы запускается, а потом останавливается, но на самом деле не закрывается. Это код, который, кажется, работает нормально:

#include "stdafx.h"#include <iostream>

using namespace std;
using byte = unsigned char;

const enum letter { x = 'x', o = 'o' };

static letter human(x);
static letter bot(o);

const unsigned short _x = 3;
const unsigned short _y = 3;

const byte* board[_x][_y] =
{
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 }
};

const unsigned char& get_board_value(unsigned short &x, unsigned short &y) {
return *board[x][y];
}

void put_board_char(const byte* (&_char), unsigned short &x, unsigned short &y) {
board[x][y] = _char;
}

void put_board_chars(const byte* (&chars)[_x][_y], unsigned short &chars_cnt_x, unsigned short &chars_cnt_y) {
unsigned short x1, y1 = 0;

for (x1 = 0; x1 < chars_cnt_x; x1++) {
for (y1 = 0; y1 < chars_cnt_y; y1++) {
put_board_char(chars[x1][y1], x1, y1);
}
}
}

void draw_board() {
unsigned short x1, y1 = 0;

for (x1 = 0; x1 < _x; x1 += 1) {
cout << "-----" << endl;
for (y1 = 0; y1 < _y; y1 += 1) {
if (y1 == 3 || y1 == 6) {
cout << board[x1][y1] << endl;
continue;
}
cout << board[y1][x1] << "|";
}
}
}

void ai(void){
//todo
}

void logic(void) {
//todo
}

int main(int argc, const char ** argv[]) {

while (1) {
draw_board();
}

return 0;
}

-1

Решение

const byte* board[_x][_y] =
{
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 }
};

Вы инициализируете элементы board до 0, таким образом nullptr,

В draw_board():

cout << board[y1][x1] << "|";

board[y1][x1] является nullptrи вы пытаетесь читать с него.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]