【发布时间】:2016-01-10 15:45:04
【问题描述】:
我在不使用任何指针的情况下遇到分段错误。 (我正在使用 gcc g++ 编译器)
代码(只有我得到错误的函数):
void printBoard(int boardOwn[][10], int boardState[][10], int boardType[][10])
{
char ownerOutput[3][2] = { {' ',' '}, { '*','X' }, { 'o','0' } };
char stateOutput[5][2] = { {' ', ' '}, {'-', '-'}, { '[', ']' }, {'>', '<'}, {'!', '!'} };
char verDivider = '|';
std::string horDivider = "---";
char characters[10] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' , 'I', 'J'};
std::cout << "\n\n\n\t";
for (int i = 0; i < 10; i++)
{
std::cout << ' ' << characters[i] << " ";
}
std::cout << "\n\n";
for (int y = 0; y < 10; y++)
{
std::cout << ' ' << y + 1 << '\t';
for (int x0 = 0; x0 < 10; x0++)
{
std::cout << stateOutput[boardState[y][x0]][0] << ownerOutput[boardOwn[y][x0]][boardType[y][x0]]<< stateOutput[boardState[y][x0]][1];
if (x0 != 9)
{
std::cout << verDivider;
}
else
{
std::cout << '\n';
}
}
if (y != 9)
{
std::cout << '\t';
for (int x1 = 0; x1 < 10; x1++)
{
std::cout << horDivider;
if (x1 != 9)
{
std::cout << verDivider;
}
else
{
std::cout << '\n';
}
}
}
}
std::cout << "\n\n\n";
}
如果我注释掉:
std::cout << stateOutput[boardState[y][x0]][0] << ownerOutput[boardOwn[y][x0]][boardType[y][x0]]<< stateOutput[boardState[y][x0]][1];
line 那么程序可以正常工作,但是该行似乎没有任何问题,因为此位置的任何 cout 语句都会导致段错误。
此外,如果 boardOwn、boardState 和 boardType 被声明并用作 2 维 8*8 数组(而不是 10*10)......那么它也可以正常工作。我确实检查了数组是否正确声明。这是我声明它们时的代码:
enum BoardObjectOwn { NONE_OWN, P1_OWN, P2_OWN };
enum BoardObjectStates {NORMAL_STATE, OWNED_STATE, SELECTED_STATE, POTENTIAL_LOCATION_STATE, UNDER_ATK_STATE};
enum BoardObjectsTypes {MAN_TYPE, KINGED_TYPE};
int boardOwn[10][10];
int boardState[10][10];
int boardType[10][10];
for (int y = 0; y < 10; y++)
{
for (int x = 10; x < 10; x++)
{
if (y != 4 && y != 5)
{
if (y % 2 == 0)
{
if (x % 2 == 0)
{
if (y < 5)
{
boardOwn[y][x] = P1_OWN;
boardState[y][x] = NORMAL_STATE;
boardType[y][x] = MAN_TYPE;
}
else
{
boardOwn[y][x] = P2_OWN;
boardState[y][x] = NORMAL_STATE;
boardType[y][x] = MAN_TYPE;
}
}
else
{
boardOwn[y][x] = NONE_OWN;
boardState[y][x] = NORMAL_STATE;
boardType[y][x] = MAN_TYPE;
}
}
else
{
if (x % 2 != 0)
{
if (y < 5)
{
boardOwn[y][x] = P1_OWN;
boardState[y][x] = NORMAL_STATE;
boardType[y][x] = MAN_TYPE;
}
else
{
boardOwn[y][x] = P2_OWN;
boardState[y][x] = NORMAL_STATE;
boardType[y][x] = MAN_TYPE;
}
}
else
{
boardOwn[y][x] = NONE_OWN;
boardState[y][x] = NORMAL_STATE;
boardType[y][x] = MAN_TYPE;
}
}
}
else
{
boardOwn[y][x] = NONE_OWN;
boardState[y][x] = NORMAL_STATE;
boardType[y][x] = MAN_TYPE;
}
}
}
然后当我调用 printBoard 函数时:
printBoard(boardOwn, boardState, boardType);
另外,我使用的是 gcc g++ 编译器,通常不会出现任何错误,但如果我添加 -Wall,则会出现以下错误:
pp
draughts.cpp: In function ‘int main()’:
draughts.cpp:74:16: warning: statement has no effect [-Wunused-value]
EXIT_SUCCESS;
^
draughts.cpp: In function ‘void game()’:
draughts.cpp:209:8: warning: variable ‘XCord’ set but not used [-Wunused-but-set-variable]
int XCord;
^
这些似乎都与我的问题无关。
我从来没有见过这个错误,我真的不知道如何解决它,所以请帮忙。
谢谢。
克莱门
附:如果您需要查看我的更多代码,我一定会发布它。
【问题讨论】:
-
你正在使用指针,你只是不知道它们。数组衰减为指针。
-
在编写 C++ 时,我可能从不使用
char*或char []开始。 -
在 C 中查找空终止符。如果您选择不使用
std::string,这将很有帮助。 -
所以你说我应该只使用字符串而不是字符数组?
-
是的!!!!请做。 :)