在C ++程序上退出状态-1

时间:2019-03-27 22:32:22

标签: c++ c++11 exitstatus

执行后,我的代码的退出状态为-1。我可以显示输入是否有任何区别。有人能找到原因吗?

输入:

  

6

     

N 10

     

E 2

     

S 3

     

W 4

     

S 5

     

E 8

我已经查看了2D整数数组,并在代码中查找了未初始化的变量,但没有发现此类错误。有人可以看到我为什么要获得退出状态-1吗?

#include <iostream>
#include <algorithm>
#include <fstream>
using namespace std;

int main() {
  ofstream fout("mowing.out");
  ifstream fin("mowing.in");
  int n; fin >> n;
  int ans = 0;
  int field[2003][2003];
  for (int i = 0; i < 2003; i++) {
    for (int j = 0; j < 2003; j++) {
      field[i][j] = 0;
    }
  }
  int xloc = 1001, yloc = 1001, time = 0;
  for (int i = 0; i < n; i++) {
    char dir; int steps;
    fin >> dir >> steps;
    if (dir == 'N') {
      for (int j = 1; j < steps; j++) {
        yloc++;
        time++;
        if (field[xloc][yloc] != 0) ans = max(ans, time-field[xloc][yloc]);
        field[xloc][yloc] = time;
      }
    }
    if (dir == 'S') {
      for (int j = 1; j < steps; j++) {
        yloc--;
        time++;
        if (field[xloc][yloc] != 0) ans = max(ans, time-field[xloc][yloc]);
        field[xloc][yloc] = time;
      }
    }
    if (dir == 'W') {
      for (int j = 1; j < steps; j++) {
        xloc--;
        time++;
        if (field[xloc][yloc] != 0) ans = max(ans, time-field[xloc][yloc]);
        field[xloc][yloc] = time;
      }
    }
    else {
      for (int j = 1; j < steps; j++) {
        xloc++;
        time++;
        if (field[xloc][yloc] != 0) ans = max(ans, time-field[xloc][yloc]);
        field[xloc][yloc] = time;
      }
    }
  }
  if (ans == 0) fout << -1 << "\n";
  else fout << ans << "\n";
  return 0;
}

3 个答案:

答案 0 :(得分:2)

fin >> dir >> steps;

您没有获得期望值

第一个输入是int n; fin >> n;,如果输入文件像您在问题中所指示的那样, dir 的第一个值将是换行符(在输入文件中为6)。 >>将绝对不做任何事情而出错,因为在存在 N steps 不兼容的情况下,是 int

要解决该问题

  • 不必将读取的 int char 混合使用,无需确定格式并明确绕过所有必需的字符
  • 或更简单,更安全的方法不是读取 dir char ,而是读取字符串,因此string dir;而不是char dir;,当然在 X N S W (dir == 'X')更改为(dir == "X") >

可能是因为您错过了添加 else 的原因,

if (dir == 'N') {
  ...
}
if (dir == 'S') {
  ...
}
if (dir == 'W') {
  ...
}
else {
  ...
}

所以通常情况下,对于'E'情况,最后一个 else 也适用于N和S情况,

if (dir == 'N') { // in fact (dir == "N") see remark above
  ...
}
else if (dir == 'S') { // in fact (dir == "S") see remark above
  ...
}
else if (dir == 'W') { // in fact (dir == "W") see remark above
  ...
}
else {
  ...
}

我鼓励您检查是否已成功打开文件,目前假设您已打开文件,并确保在输入文件中阅读得很好

请注意,在我的raspberrypi上,堆栈限制为8192K(ulimit -s),因此 field 的大小太大,我将其更改为 static 能够执行程序(我使用2 for 代替了复杂的初始化)

mowing.out 的预期内容是什么?进行以上更改,我得到18


如果我使用定义:

#include <iostream>
#include <algorithm>
#include <fstream>
using namespace std;

int main() {
  ofstream fout("mowing.out");

  if (!fout.is_open()) {
    cerr << "cannot open mowing.out" << endl;
    return -1;
  }

  ifstream fin("mowing.in");

  if (! fin.is_open()) {
    cerr << "cannot open mowing.int" << endl;
    return -1;
  }

  int n; 

  if ((!(fin >> n)) || (n < 0)) {
    cerr << "invalid number of couples" << endl;
    return -1;
  }

  int ans = 0;
  static int field[2003][2003] = { 0};
  int xloc = 1001, yloc = 1001, time = 0;

  for (int i = 0; i < n; i++) {
    string dir; int steps;

    if (!(fin >> dir >> steps)) {
      cerr << "error while reading fin & dir" << endl;
      return -1;
    }

    if (dir == "N") {
      for (int j = 1; j < steps; j++) {
        yloc++;
        time++;
        if (field[xloc][yloc] != 0) ans = max(ans, time-field[xloc][yloc]);
        field[xloc][yloc] = time;
      }
    }
    else if (dir == "S") {
      for (int j = 1; j < steps; j++) {
        yloc--;
        time++;
        if (field[xloc][yloc] != 0) ans = max(ans, time-field[xloc][yloc]);
        field[xloc][yloc] = time;
      }
    }
    else if (dir == "W") {
      for (int j = 1; j < steps; j++) {
        xloc--;
        time++;
        if (field[xloc][yloc] != 0) ans = max(ans, time-field[xloc][yloc]);
        field[xloc][yloc] = time;
      }
    }
    else {
      for (int j = 1; j < steps; j++) {
        xloc++;
        time++;
        if (field[xloc][yloc] != 0) ans = max(ans, time-field[xloc][yloc]);
        field[xloc][yloc] = time;
      }
    }
  }
  if (ans == 0) fout << -1 << "\n";
  else fout << ans << "\n";
  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -g -pedantic -Wextra -Wall e.cc
pi@raspberrypi:/tmp $ cat mowing.in 
6

N 10

E 2

S 3

W 4

S 5

E 8
pi@raspberrypi:/tmp $ ./a.out
pi@raspberrypi:/tmp $ cat mowing.out 
18

答案 1 :(得分:1)

在bruno提出的出色观点之上,我相信您遇到的问题的根本原因是(nomen预兆!)堆栈溢出。

您的数组太大,无法放在堆栈中。快速计算(假设sizeof(int) == 4):

2003 * 2003 * 4 B = 16048036 B = 15671.91015625 KiB = 15.304599761962890625 MiB

您正在尝试在堆栈上分配15.3 MiB的内存,而根据this question,默认情况下Windows允许1 MiB,Linux通常允许8 MiB。

您应该自己在堆上分配内存,或者(最好)使用std::vector,如下所示:

std::vector<std::vector<int>> field (2003, std::vector(2003));
//it is already initialized above, no need for for loops ;)
//later on it can be used like regular array in most of the cases

答案 2 :(得分:0)

  

有人可以看到我为什么要获得退出状态-1吗?

不仅任何人-都能做到!

enter image description here

...,通过使用debugger在程序执行期间在不同位置停止程序并检查nans和其他变量的值。

我假设您正在使用某些IDE来编辑和编译代码。 IDE通常具有集成的调试器。例子:

好像students these days really aren't taught to debug...:-(