当前位置: 首页 > article >正文

【hustoj注意事项】函数返回值问题

原文

https://lg.h-fmc.cn/index.php/BC/27.html

问题回顾

此题目选自HFMC_OJ:4312: 简单递归操作
hustoj测试
此问题错误的代码是

#include<bits/stdc++.h>
using namespace std;
int a[10000];int n;
int b[10000]={0};
int pailie(int deep)
{
    int i; 
    for(i=1;i<=n;i++)
    {
        if (b[i]==0)
        {
            a[deep]=i; b[i]=1;
            if(deep<n) 
                pailie(deep+1);
            else{
                for(int j=1;j<=n;j++) 
                    cout<<a[j]<<" ";
                cout<<'\n';
            }
            b[i]=0;
        }
    }
}
int main()
{
    cin>>n;
    pailie(1);  
    return 0;
}

提交到hustoj的返回是
m5gsyipa.png
CCR Plus测试
代码同样:

#include<bits/stdc++.h>
using namespace std;
int a[10000];int n;
int b[10000]={0};
int pailie(int deep)
{
    int i; 
    for(i=1;i<=n;i++)
    {
        if (b[i]==0)
        {
            a[deep]=i; b[i]=1;
            if(deep<n) 
                pailie(deep+1);
            else{
                for(int j=1;j<=n;j++) 
                    cout<<a[j]<<" ";
                cout<<'\n';
            }
            b[i]=0;
        }
    }
}
int main()
{
    cin>>n;
    pailie(1);  
    return 0;
}

测评之后的返回是
m5gt0t8j.png
测试数据 testdata
点我下载:P4312_Testdata.zip

问题解析回顾

首先,可以得出要么是hustoj的问题,要么是ubuntu的问题,于是,我们使用宝塔Linux面板编译了代码,视频如下
https://lg.h-fmc.cn/usr/uploads/2025/01/3108223426.mp4
从上视频最后一帧可以看出,是第23行关于return有一定的关系。
23行是},于是,我们截取了整个子程序

int pailie(int deep)
{
    int i; 
    for(i=1;i<=n;i++)
    {
        if (b[i]==0)
        {
            a[deep]=i; b[i]=1;
            if(deep<n) 
                pailie(deep+1);
            else{
                for(int j=1;j<=n;j++) 
                    cout<<a[j]<<" ";
                cout<<'\n';
            }
            b[i]=0;
        }
    }
}

根据计算机程序设计基本尝试,我们可以知晓

子函数返回类型规则
int 整型
long long 长整型
char 字符型
string 字符型
double 双精度浮点型
float 单精度浮点型
void 无返回
注意看void,如果子函数的类型是void,则可以不需要return,但是上述代码的类型是int,也就是说,必须要返回一个整型,但是程序没有返回整型,所以出现了运行时错误

调整代码并重新测试

已知问题,那么我们就可以修复代码
修复方法1:修改类型int为void

#include<bits/stdc++.h>
using namespace std;
int a[10000];int n;
int b[10000]={0};
void pailie(int deep)
{
    int i; 
    for(i=1;i<=n;i++)
    {
        if (b[i]==0)
        {
            a[deep]=i; b[i]=1;
            if(deep<n) 
                pailie(deep+1);
            else{
                for(int j=1;j<=n;j++) 
                    cout<<a[j]<<" ";
                cout<<'\n';
            }
            b[i]=0;
        }
    }
}
int main()
{
    cin>>n;
    pailie(1);  
    return 0;
}

修复方法2:返回0

#include<bits/stdc++.h>
using namespace std;
int a[10000];int n;
int b[10000]={0};
int pailie(int deep)
{
    int i; 
    for(i=1;i<=n;i++)
    {
        if (b[i]==0)
        {
            a[deep]=i; b[i]=1;
            if(deep<n) 
                pailie(deep+1);
            else{
                for(int j=1;j<=n;j++) 
                    cout<<a[j]<<" ";
                cout<<'\n';
            }
            b[i]=0;
        }
    }
    return 0;
}
int main()
{
    cin>>n;
    pailie(1);  
    return 0;
}

提交代码
提交代码后,hustoj返回
m5gtqe3l.png
Linux重新编译
m5gtr261.png
已经编译成功,代码运行后正确

问题:为什么Windows下运行不会报错?

我们注意一下Linux的编译指令:-std=c++17
如果在Windows加上-std=c++17,那么一般会直接编译错误
因为Windows上的版本是C++11,如果是C++17,那么同样会报错

我们应该怎样做

1.严格遵守程序设计规则


http://www.kler.cn/a/467080.html

相关文章:

  • 【CSS】第二天 画盒子、文字控制属性
  • 创建并配置华为云虚拟私有云
  • Fabric部署-docker安装
  • python.exe无法找到程序入口 无法定位程序输入点(Anaconda Prompt报错)
  • QML自定义滑动条Slider的样式
  • 在arm平台Euler系统上编译安装ffmpeg
  • asp.net core 属性路由和约定路由
  • 用Redis缓存数据、SpringCache
  • lovelyAIMaster - 在windows任何地方调用AI进行输入
  • 如何批量注册Outlook邮箱账号并防止关联?
  • MySQL(五)MySQL图形化工具-Navicat
  • Oracle 多租户架构简介
  • 深入浅出 Pytest:自动化测试的最佳实践 pytest教程 程序测试 单元化测试
  • 面向对象分析和设计OOA/D,UML,GRASP
  • vue代理问题
  • 对计网大题的一些指正(中间介绍一下CDM的原理和应用)
  • 51单片机——按键实验
  • YOLOv10-1.1部分代码阅读笔记-autobackend.py
  • python3GUI--智慧交通监控与管理系统 By:PyQt5
  • Chromebook 的 4 个最佳变声器
  • Dart语言的软件工程
  • 回调机制实现观察者模式
  • 什么是索引
  • PyTorch FlexAttention技术实践:基于BlockMask实现因果注意力与变长序列处理
  • SMMU软件指南之系统架构考虑
  • 【玩转全栈】----Django连接MySQL