刚刚有点程序的苗头,不过入门真的不容易

本文探讨了如何从字符数组中读取并解析浮点数,以及使用栈来实现后缀表达式的计算过程。通过对源代码的分析,揭示了算法背后的逻辑和细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

入门难,就算理解的写出了第一次,未必能写出第二次,就算写出了第二次也未必能保证每一个标点符号每一个变量都准确无误,至少是在理解的基础上未必能写的没有任何错误

写东西不熟练导致的根本就是写不出,要写,要练,要思考,人就是练出来的.

float readnumber(char f[],int *i)

{

{int k=0;

 float x=0.0;

while(f[*i]>='0'&&whilef[*i]<='9')

{x=x*10+(f[*i]-'0');

   (*i)++;}

 if(f[*i]=='.')

{(*i)++;

   whlie(f[*i]>='0'&&f[*i]<='9')

    {x=x*10+(f[*i]-'0');

     (*i)++;

     k++;}

whlie(k!=0)

{x=x/10.0;

 k=k-1;}

return x;

}

double evalpost(char f[])

{int i=0;

 double obst[100];

 double x1,x2,x;

 int top=0;

  whlie(f[i]!='#')

 {if(f[i]>='0'&&f[i]<='9'||f[i]='.')

    {obst[top]=readnumber(f,&i);

    top++;

    i++;}

       else if(f[i]=='+')

         {x1=obst[--top];

          x2=obst[--top];

          x=x1+x2;

          top++;

          i++;}

          else if(f[i]=='-')

          {x1=obst[--top];

           x2=obst[--top];

           x=x1-x2;

           top++;

           i++;}

               else if(f[i]=='*')

                 {x1=obst[--top];

                  x2=obst[--top];

                  x=x1*x2;

                  top++;

                  i++;}

                       else if(f[i]=='/')

                        {x1=obst[--top];

                         x2=obst[--top];

                         x=x1/x2;

                         top++;

                         i++;}

return obst[0];

}

double postfix(char e[],char  f[])

{char opst[100];

  int i,j,t;

  int top==0;

  while(e[i]!='#')

  {if(e[i]>='0'&&e[i]<='9'||e[i]=='.')

     {f[j++]=e[i];}

     else if(e[i]=='(')

       {opst[top]=e[i];

         top++;}

         else if(e[i]==')')

           {while(e[i]!='(')

                {f[j++]=opst[top];

                  top--;

                  opst[top]=e[i];

                   top++;}

                else if(e[i]=is_operation(e[i])

                  {while(opst[top]]>

写到这里吧,错误不少,也有写不出的,不行啊!

### 华大程序运行异常的原因分析及解决方法 #### 1. HardFault 的可能原因及解决方案 在将瑞萨芯片 R5F100FG 的程序移植到华大 HC32L176MATA 后,如果程序运行过程中频繁进入 HardFault 中断,可能是由于以下几个方面引起的: - **寄存器配置错误** 移植底层硬件初始化代码时,虽然尝试保持参数一致,但由于同芯片架构差异较大,某些寄存器的功能或默认值可能存在细微差别。例如,系统时钟、GPIO 配置、ADC 或串口中断优先级设置当可能导致异常行为[^1]。 解决方案:逐一核对两颗芯片的手册,确认每项寄存器的具体含义及其初始状态是否匹配目标平台需求。必要时可以简化测试场景,逐步排查问题所在。 - **堆栈溢出 (Stack Overflow)** 如果应用程序分配了较大的局部变量数组或其他动态内存结构,可能会超出 MCU 默认的堆栈大小限制,从而触发 HardFault。 解决方案:增加堆栈空间大小设定;或者优化算法减少必要的临时存储开销。可以通过 IAR 工具链中的诊断选项来检测是否存在潜在的堆栈冲突风险。 - **非法指针访问** 当存在越界读取/写入操作或是解引用空指针等情况时也会引发此类故障。这通常发生在未经充分验证即被使用的全局资源上。 解决方案:启用编译器警告级别至最高,并仔细审查所有涉及指针运算的部分代码逻辑。利用仿真工具观察实际执行路径下是否有意外跳转动作发生。 --- #### 2. 外设未正确初始化导致的问题 根据另一则案例描述可知,当某个外设尚未完成其必要的启动流程便贸然调用相应服务例程时也可能致使整个系统崩溃。具体表现为——即使是在非实时响应场合下的简单输入输出交互环节里头仍然隐藏着少隐患因素待挖掘出来加以规避处理掉才行呢! - **串口未初始化前调用发送函数** 若某段业务逻辑依赖于特定 IO 设备正常运作但却忽略了前期准备工作的话,则极有可能因此而导致可预见的结果出现比如前面提到过的那种情形就是典型代表之一啦!当时开发者忘记考虑到了如果没有开启 DEBUG 模式那么也就意味着相应的 UART 控制单元根本就没有准备好接受来自其他模块传递过来的数据包进而造成了严重的后果发生了哦~[^2] 解决办法很简单明了嘛那就是确保每次需要用到任何种类的新功能之前都要先做好充足的准备活动比如说在这里就需要提前把所有的通信端口按照既定规格给它全部激活起来然后再继续往下走就会再遇到类似的麻烦事咯~ --- #### 3. Flash 热擦除相关注意事项 对于涉及到在线更新固件的应用场景而言还需要特别留意关于闪存管理方面的细节规定以免小心触碰到一些敏感地带从而影响整体稳定性表现效果佳甚至还会带来额外的安全威胁等问题的发生几率增大很多倍数以上都夸张哟!!所以这里再次强调一下几点关键要素供大家参考学习借鉴使用哈😊 - **地址范围校验足** 如前所述的例子所示我们能够看到尽管表面上看起来相同的源码片段分别嵌套进了同的工程项目当中去可是最终呈现出的效果却是截然相反的状态这是为什么呢?原来是因为其中一个版本里面所指定的目标区域超出了允许的最大界限之外才引发了后续一系列连锁反应使得设备一直处于循环重启模式无法正常使用功能特性等等情况出现了唉😭[^3]. 正确做法当然是要严格遵循官方文档给出的相关指导原则合理规划好各自的分区布局图谱并且定期检查维护最新版资料库文件夹内的各项重要参数指标数值变化趋势图表等内容信息以便及时发现问题苗头并采取有效措施予以纠正改正回来恢复正常运转秩序即可达成预期目的啦🎉 - **主频提升后的适配调整** 另一方面值得注意的是随着处理器性能断增强的同时也需要同步修改配套组件的工作条件以适应新的环境要求否则很容易就会陷入困境之中难以自拔呀😢举个例子来说吧就像下面这段话讲的一样当我们试图加快 L072 微控制器的核心频率达到 48 MHz 以后却发现原来的 FLASH 存储介质已经跟上节奏开始频频报错提示进入了 HARDFAULT 错误分支去了原来是忘了同时也要更改对应的等待周期等相关属性设置了哎呀真是粗心大意惹出来的祸患呐😅[^5]. 所以说无论何时何地我们都应该时刻牢记这一点教训永远要忽略任何一个看似微足道的小地方也许正是这些起眼的因素决定了成败的关键之处呢😎 ```c // 示例代码展示如何安全地进行 flash 操作 void safe_flash_erase(uint32_t address, uint32_t size) { if ((address >= SECURE_REGION_START) && (address + size <= SECURE_REGION_END)) { HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); for (uint32_t i = 0; i < size / FLASH_PAGE_SIZE; ++i) { HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&erase_init, &page_error); if (status != HAL_OK) { // Handle error here } } HAL_FLASH_Lock(); } else { // Log invalid access attempt or handle as appropriate } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值