code() 2024-04-03 12:29 采纳率: 0%
浏览 99

Keil仿真闪退问题

keil5 仿真 【51单片机 】闪退

img


如果在main函数外初始化赋值【定义写在外面没问题】,点击调试仿真就会闪退;但是把初始化赋值写在main函数外面build后hex文件烧录到单片机运行却没有问题,这是为什么

  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-04-03 12:29
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    这个问题可能是由于keil5编译器的一些特性导致的。在keil5中,当我们定义全局变量时,编译器会把它放在内存的静态存储区,而这个区域初始化时是以零值进行的。如果我们在定义全局变量时对它进行了赋值,编译器会把代码放在内存中的程序区域,并在main函数执行之前执行这些代码。 在调试仿真时,当我们尝试从静态存储区读取变量的值时,由于该区域中存储的值都是默认的零值,读取到的值可能会出现异常,从而导致程序出现错误。 解决这个问题的方法是在外部初始化全局变量时,将赋值操作放在函数内部,以确保执行顺序正确。 以下是一些可行的代码示例: 例1:
    int myVar = 0;
    int main()
    {
        myVar = 1;
        //其他代码
    }
    

    这里,全局变量myVar在定义时赋值为0,然后在main函数中将其赋值为1。这种方法可能导致程序出现错误。 例2:

    int myVar;
    void init()
    {
        myVar = 1;
    }
    int main()
    {
        init();
        //其他代码
    }
    

    这里,全局变量myVar被定义但未被初始化。然后,在init函数中将myVar赋值为1。在main函数中调用init函数以初始化myVar,然后执行其他代码。 通过这种方法,我们可以确保myVar的初始化发生在main函数执行之前,这可以确保myVar的值在程序正常执行期间是正确的。 注:如果您使用C++,则可以使用构造函数来解决这个问题。在这种情况下,全局变量myVar将自动初始化为零值,并在程序开始时使用构造函数进行初始化赋值。 例3:

    class MyClass
    {
    public:
        int myVar;
        MyClass()
        {
            myVar = 1;
        }
    };
    MyClass myObject;
    int main()
    {
        myObject.myVar = 2;
        //其他代码
    }
    

    这里,我们定义了一个包含一个整数成员变量的类MyClass。我们创建了一个全局对象myObject,在程序开始时使用MyClass构造函数初始化myVar。在main函数中,我们将myVar赋值为2,然后执行其他代码。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月3日

悬赏问题

  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 arbotix没有/cmd_vel话题
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀
  • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用