Я использовал 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;
}
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
и вы пытаетесь читать с него.
Других решений пока нет …