建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

月光

发帖: 1粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-4-28 23:32:17 813711 楼主 显示全部楼层
[问题求助] 决赛程序出错问题

决赛交了好多次一直"answer exit abnormal Missing output file.",调了几个bug还是不过,以为是自己的问题。
直到最后把复赛程序(复赛正常运行)的predict_server函数开头加了个while(1);    ,发现并不超时,而是还出这个错误,c++工程里predict_server之前的内容是选手不能修改的。
希望有大佬指正一下可能的错误,或者官方排查一下问题吧。
回复 举报
分享

分享文章到朋友圈

分享文章到微博

opop

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-4-29 09:34:43 沙发 显示全部楼层
+1,  同样C++, 出现一样问题。
点赞 回复 举报

netcan

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-4-29 22:56:04 板凳 显示全部楼层
之前给官方反馈一个漏洞,看来修复了呢= =

点评

大佬,知道这个问题吗?  发表于 2018-4-30 10:44
你不会是说通过超时测数据吧。。。通过抛出异常也能测数据啊,没必要封超时功能  发表于 2018-4-30 10:46
点赞 回复 举报

netcan

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-4-30 12:19:46 地板 显示全部楼层
netcan 发表于 2018-4-29 22:56
之前给官方反馈一个漏洞,看来修复了呢= =

目前看来某些文件应该是只读的了,被修改传上去应该没用
点赞 回复 举报

月光

发帖: 1粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-4-30 12:26:02 5# 显示全部楼层
netcan 发表于 2018-4-30 12:19
目前看来某些文件应该是只读的了,被修改传上去应该没用

之前按照readme,没修改过要求不允许修改的文件呢。如果只读的文件被替换了,那么出现的问题应该是编译错误,而不是运行时错误吧
点赞 回复 举报

Hezhu

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-4-30 13:08:00 6# 显示全部楼层
官方给的sdk-gcc有个bug,具体bug在io.cpp的read_file函数:
char line[MAX_LINE_LEN + 2];
unsigned int cnt = 0;
while ((cnt < spec) && !feof(fp))
{
    line[0] = 0;
    if (fgets(line, MAX_LINE_LEN + 2, fp) == NULL)  continue;
    if (line[0] == 0)   continue;
    buff[cnt] = (char *)malloc(MAX_LINE_LEN + 2);
    strncpy(buff[cnt], line, MAX_LINE_LEN + 2 - 1);
    buff[cnt][MAX_LINE_LEN + 1] = 0;
    cnt++;
}

其中MAX_LINE_LEN为55000,所以buff数组的每个元素都会malloc 55K空间,即使真实的字符串没有那么长。
而数据文件最大有10万条(然而lib_io.h里定义MAX_DATA_NUM为50000,希望官方重新能给个保证没有bug的sdk),所以当数据非常多的时候空间占用最大会达到5G,超过了评测环境的内存最大限制2G,从而使程序异常退出。
简单的解决方法:只需把malloc的空间大小改为读入进来的line字符串的真实长度。
参考代码:
char line[MAX_LINE_LEN + 2];
unsigned int cnt = 0;
while ((cnt < spec) && !feof(fp))
{
    line[0] = 0;
    if (fgets(line, MAX_LINE_LEN + 2, fp) == NULL)  continue;
    if (line[0] == 0)   continue;
    int len = strlen(line);
    buff[cnt] = (char *)malloc(len + 1);
    strncpy(buff[cnt], line, len);
    buff[cnt][len] = 0;
    cnt++;
}


希望能帮助到大家。

by La Vie En Rose - Hezhu
点赞3 回复 举报

opop

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-4-30 14:17:27 7# 显示全部楼层
Hezhu 发表于 2018-4-30 13:08
官方给的sdk-gcc有个bug,具体bug在io.cpp的read_file函数:
char line[MAX_LINE_LEN + 2];
unsigned int c ...

666,大佬就是大佬
点赞 回复 举报

月光

发帖: 1粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-5-1 19:28:42 8# 显示全部楼层
Hezhu 发表于 2018-4-30 13:08
官方给的sdk-gcc有个bug,具体bug在io.cpp的read_file函数:
char line[MAX_LINE_LEN + 2];
unsigned int c ...

跪谢大佬!!!666
点赞 回复 举报

小原2号

发帖: 0粉丝: 18

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2018-5-1 22:05:34 9# 显示全部楼层
嗯,应该是数据长度问题,可以通过动态内存分配来控制内存利用(谢谢5楼给出了参考修改意见)。另外,build.sh等文件是不能修改的,如有修改可能会编译不过。
点赞 回复 举报

月光

发帖: 1粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-5-1 23:32:05 10# 显示全部楼层
本帖最后由 月光 于 2018-5-1 23:52 编辑
小原2号 发表于 2018-5-1 22:05
嗯,应该是数据长度问题,可以通过动态内存分配来控制内存利用(谢谢5楼给出了参考修改意见)。另外,build ...

谢谢专家快速修正
点赞 回复 举报

游客

您需要登录后才可以回帖 登录 | 立即注册