执行后,我的代码的退出状态为-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;
}
答案 0 :(得分:2)
在
fin >> dir >> steps;
您没有获得期望值
第一个输入是int n; fin >> n;
,如果输入文件像您在问题中所指示的那样, dir 的第一个值将是换行符(在输入文件中为6)。 >>
将绝对不做任何事情而出错,因为在存在 N 与 steps 不兼容的情况下,是 int
要解决该问题
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吗?
不仅任何人-您都能做到!
...,通过使用debugger在程序执行期间在不同位置停止程序并检查n
,ans
和其他变量的值。
我假设您正在使用某些IDE来编辑和编译代码。 IDE通常具有集成的调试器。例子: