所以我已经在这个项目上工作了一段时间,我终于得到了编译,但现在它是segfaulting。我问过我的老师问题是什么,但是他无法理解,所以我认为你们可能会有所帮助。我的项目是让程序显示一个棋盘,然后就可以在它上面玩棋盘游戏。当我尝试显示棋盘时,该程序是seg faulting。这是相关代码:
注意:每个检查器代表棋盘上的一个正方形 - 值" isOccupied"表示空间是否被一件作品占据,并且"颜色"表示颜色是黑色还是红色。颜色从我将发布的单独文件呈现。颜色可以是黑色或红色。
这是Checker.h文件的输出函数。它在Checkers类的显示功能中被调用(跳棋就是实际的游戏)
std::ostream output(std::ostream& otp, int i) const
{
if (isOccupied) {
if (i == 1) {
otp << B_RED << color << " @ ";
}
else if (i == 0) {
otp << B_BLACK << color << " @ ";
}
}
else if (!isOccupied) {
if (i == 1) {
otp << B_RED << " ";
}
else {
otp << B_BLACK << " ";
}
}
}
// THE PROGRAM SEG FAULTS AT THIS LINE, WHICH MAKES ME THINK IT HAS
// TO DO WITH THE DISPLAY FUNCTION
显示功能和在checkers.h文件中设置电路板的功能
void display_status() const
{
int i, j;
for (j = 0; j < 8; j++) {
for (i = 0; i < 8; i++) {
board[i][j].output(cout, ((i+j)%2));
}
}
}
void set_board()
{
checker c = checker();
int i, j, k;
for (j = 0;j < 8; j++) { //this block sets up the actual board with no pieces on it
for (i = 0; i < 8; i++) {
string s = c.make_name((i+1), (j+1));
if ((i+j) % 2 == 0) {
board[i][j].input(s, B_BLACK, false, false);
}
else {
board[i][j].input(s, B_RED, false, false);
}
}
}
k = 0;
while (k < 12) { //this block here sets up the black pieces on the board
for (j = 0; j < 8; j++) {
for (i = 0; i < 8; i++) {
string s = c.make_name((i+1), (j+1));
if ((i+j)%2 == 0) {
c.input(s, BLACK, true, false);
board[i][j] = c;
k++;
}
else {
c.input(s, B_RED, false, false);
board[i][j] = c;
}
}
}
}
k = 0;
int j1;
int i1;
while (k < 12) { //this block fills the red pieces starting with block 64 at the top right corner
for (j1 = 7; j1 >= 0; j1--) {
for (i1 = 7; i1 >= 0; i1--) {
string l = c.make_name((i1+1), (j1+1));
if ((i1+j1)%2 == 0) {
c.input(l, B_RED, true, false);
board[i1][j1] = c;
k++;
}
else {
c.input(l, B_RED, false, false);
board[i1][j1] = c;
}
}
}
}
}
和colors.h文件代表不同的颜色,如果有帮助
#ifndef COLORS_H
#define COLORS_H
#include <string>
using namespace std;
const string BLINK = "\e[5m"; //don't use this your
//professor will probibly
//beat you to death if
//you do feel the need to
//use blink!!!
const string BOLD = "\e[1m";
const string RESET = "\e[0m";
const string ERROR = "\e[1;41;37m\a";
const string MENU = "\e[44;37m";
const string BLACK = "\e[30m";
const string RED = "\e[31m";
const string B_BLACK = "\e[40m";
const string B_RED = "\e[41m";
#endif //COLORS_H
colors.h缺少一些,但我绝不会使用大多数颜色,因此无关紧要。
因为你们要求查看电路板的初始化我只是要发布我的main.cc
#include "game.h"
#include "checker.h"
#include "colors.h"
#include <iostream>
#include <cstring>
#include <string>
#include "checkers.h"
using namespace main_savitch_14;
using namespace std;
int main()
{
string move="";
checkers* c = new checkers;
c->restart();
c->display_status();
cout << "where would you like to make your first move? \n";
cout << "Enter, without spaces, and which piece you would like ";
cout << "to move and where(designated by space)\n for example: A3D4\n" ;
cin >> move;
c->make_move(move);
c->display_status();
return 0;
}
董事会在restart()
初始化。
答案 0 :(得分:2)
您的output
函数承诺返回std::ostream
,但没有任何return
语句。这导致了不确定的行为和各种各样的肮脏。
即使它确实如此,流也是不可复制的。
此时您有两个选择:
该函数应该有返回类型std::ostream&
,您应该在其末尾写return otp;
;
该函数的返回类型应为void
。
打开你的编译器警告:它会告诉你这个,以及谁知道其他什么问题。
答案 1 :(得分:1)
您没有返回std:: ostream
。
那不行!
我可以建议您下次使用-Wall
或其他替代标志进行编译,以便您阅读no return value in a function returning non-void
,包含行号以及一大堆其他有用的信息。< / p>
实际上,您的代码需要以两种方式进行修改 - 将函数的返回值更改为std:: ostream &
,因此它返回引用而不是副本,并且应该return otp;
在末尾。