5335|20

7815

帖子

57

TA的资源

裸片初长成(中级)

楼主
 

【板块老帖子】十年前的一个51帖子 [复制链接]

 
本帖最后由 辛昕 于 2018-9-5 00:44 编辑

友情提要:
      在下面提到的正题:那个老帖子里,其实它的问题,无非是混合了C++编程,以及C51的一些特殊关键字。对于单片机开发的我们,这两个问题我认为我们是迟早要面对的,但我们也不能忽视目前乃至往后很长时间,C仍然是单片机世界的唯一通行语言,那么,请问你会怎么做,才能既不排斥C++和特殊的机器平台,但又可以更好地平滑地面对 “单片机,唯C不破”这个事实?
      欢迎讨论,本版主别的不多,胜在芯币多,散尽家财只为你的精彩回答!

在Queue的世界里,当Front走到尽头,它就会咬回头,从0开始,继续往前走。今天版主群里,xxoxk女神说,我再不动就要弄死我,可我已经有无数烂尾的黑历史,各种C的小语法题已经玩的没东西可玩了。
又不像 @队长 那么多才多艺,什么语言都会一点。

想来想去,我只好学习 女神,挖老帖子。
从哪开始挖呢?
一不做二不休。
今天记录一下,【编程基础】下共计23页,本着不负责不主动不坚持的三不原则,我从最早一个沉底贴开始.......没想到运气不错,这个帖子,大有可说的.......


此内容由EEWORLD论坛网友辛昕原创,如需转载或用于商业用途需征得作者同意并注明出处


此帖出自编程基础论坛

最新回复

从来不抵触新事物,当年火车还跑不过马车,这很正常,只要你觉得合适,用心去做就好  详情 回复 发表于 2018-9-7 15:13
点赞 关注(1)
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
我不知道这些老帖子有一天是不是会自然而然挂掉,也为了这个帖子完整,我决定简单提要一下这个兄弟的帖子内容:
他其实是想把一个在VC上用的图形菜单源码挪到51上用,结果就这段代码,遇到了N多问题。
他内心很不淡定,觉得"PC和KEIL真尼玛差别巨大"

以下是代码,那时候还没有 CODE 各种格式,看着太难受,我重新整一下
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

板凳
 
  1. #include <string.h>
  2. #include <iostream.h>
  3. #include <stdio.h>
  4. char MenuOne_Date[3][14]={"1 Module Text","2 Tools","3 About Me"};  
  5. //这里和下面的MenuName[]改为unsigned 为什么有错?
  6. char MenuTools_Date[4][11]={"1 SetTime","2 Dingshi","3 MiaoBiao","4 Book"};

  7. struct NodeDate
  8. {
  9.         char seq;
  10.         char MenuName[17];
  11. };

  12. struct MenuNode
  13. {
  14.         NodeDate data;       ///这里keil uvision说是有错误的
  15.         struct MenuNode *parent;
  16.         struct MenuNode *firstchild;
  17.         struct MenuNode *nextbrd;
  18.         
  19. }*Previous,Module_Struct,Tools_Struct,AboutMe_Struct,SetTime_Struct,DingShi_Struct,MiaoBiao_Struct,Book_Struct;

  20. void BuildNode(struct MenuNode * Self,struct MenuNode *Parent_Node,struct MenuNode *Firstchild_Node,
  21. struct MenuNode *Nextbrd_Node,char seq,char MenuName[17])

  22. {        
  23.         Self->parent=Parent_Node;
  24.         Self->firstchild=Firstchild_Node;
  25.         Self->nextbrd=Nextbrd_Node;
  26.         Self->data.seq=seq;
  27.         strcpy(Self->data.MenuName,MenuName);
  28. }

  29. void Initial_MenuStruct(void)
  30. {
  31.         //第一层Menu
  32.         BuildNode(&Module_Struct,NULL,&SetTime_Struct,&Tools_Struct,10,MenuOne_Date[0]);
  33.         BuildNode(&Tools_Struct,NULL,NULL,&AboutMe_Struct,11,MenuOne_Date[1]);
  34.         BuildNode(&AboutMe_Struct,NULL,NULL,&Module_Struct,12,MenuOne_Date[2]);
  35.         Previous=&Module_Struct;
  36.         //Module子层Menu
  37.         BuildNode(&SetTime_Struct,&Module_Struct,NULL,&DingShi_Struct,20,MenuTools_Date[0]);
  38.         BuildNode(&DingShi_Struct,&Module_Struct,NULL,&MiaoBiao_Struct,21,MenuTools_Date[1]);
  39.         BuildNode(&MiaoBiao_Struct,&Module_Struct,NULL,&Book_Struct,22,MenuTools_Date[2]);
  40.         BuildNode(&Book_Struct,&Module_Struct,NULL,&SetTime_Struct,23,MenuTools_Date[3]);
  41. }

  42. void main(void)
  43. {
  44.         Initial_MenuStruct();
  45.         for(int i=0;i<3;i++)
  46.         {
  47.                 //cout<<Previous->data.MenuName<<"     "<<Previous->data.seq<<endl;
  48.                 printf("%s\t%d\n",Previous->data.MenuName,Previous->data.seq);
  49.                 Previous=Previous->nextbrd;
  50.         }
  51.         Previous=Module_Struct.firstchild;
  52.         for(i=0;i<4;i++)
  53.         {
  54.                 printf("%s\t%d\n",Previous->data.MenuName,Previous->data.seq);
  55.                 Previous=Previous->nextbrd;
  56.         }
  57. }

  58. 这个程序在vc是没问题的。
  59. 但在keil环境下 我删除了这里的main函数(我的工程在其他.c中是有main的),结构体没改,进行编译。出现错误:
  60. struct MenuNode
  61. {
  62.         NodeDate data;
  63.         struct MenuNode *parent;
  64.         struct MenuNode *firstchild;
  65.         struct MenuNode *nextbrd;
  66.         
  67. }
  68. error 1: syntax error near 'NodeDate'
  69. error 2: missing ';'before 'data'
复制代码
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

4
 
本帖最后由 辛昕 于 2018-9-5 00:46 编辑

这个帖子不长,还没有 下一页 就结束了,回答的几个楼层一下就说到点子上了,这刷新了我对这个历史老帖子的印象——以前我翻过  嵌入式这个大板块的历史老帖子,那简直是令人发指的水贴和广告贴,当年农姐一定特别不容易。

说起来,最终这段代码遇到的问题主要就两个
1.,当然,楼主说,他一时忘了去掉,他也知道,这是他在VC下用C++时做的。
是的,这个是C++的标准库(头文件)之一,不在C标准库之列,更不在C51之列;
2.一个意外,他定义的变量使用了 data 这个关键字——说实话,太久没用51了,反正我是一直没注意到。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

6040

帖子

202

TA的资源

版主

5
 
教主要么不发帖,一发帖就前三名
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

6
 
但是,在回复里,有几处,我发现有人的回答,找到了症结所在,但说法本身却是有问题的。
当然这其实问题不大 ,说法上的事情,我已经不那么纠结了。
毕竟,据称,在 C的始祖,K&R大神 的 C语言程序设计 这本书里,大神都把
数组作为地址传递给函数 这件事说成 此时,数组蜕化成指针
我记得那时候,我还当场隔着qq痛吗了那个家伙,结果人家甩给我一句 英文原书的 截图,我当时的心情是这样的,脸是这样的

但是再后来想想,C都是人家发明的,我能说啥?
何况,就一个个说法而已,真的这么重要吗?

所以渐渐的我就很不在意了,但是为了让这个帖子多点技术含量,以防止我被女神neng死,我还是决定扯扯。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

7
 
就不多说了,大半夜的。举最开始的俩个楼层作为例子吧。

example 1:
C,不是C++

如果不用typedef 就得用struct MenuNode.
struct MenuNode{
    ...
};//这里得有个分号”


首先,typedef的定义,在C和C++里并没有区别。
而他的说法里还会引人误解。
其实,typedef 只是把数据类型重命名,它的写法有几种,很多时候我们只是刚好看过这种写法而熟悉了,因此误以为这是一种特别的写法。
实际上并非如此。
而MenuNode显然是一个 结构体定义,既然是结构体,标识符MenuNode以前必须跟一个struct,这和重定义没有关系。
否则,你上哪找一个  数据结构或者关键字叫 MenuNode,别的地方我不敢说,C标准库里绝对没有这个东西。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

8
 
example 2:
#include

KEIL里面没有这个库!!
单片机不是PC


首先,这个回答是错误的。因为,iostream.h这个库,和PC不PC没有关系,甚至和KEIL也没有关系。
本质上来说,我们可以认为,一般人说话的语境里,所谓PC,他其实想说的是WINDOWS或者LINUX或者其他操作系统这个宿主环境。而我们说KEIL的时候,大体上,指的是IDE。
但不管是OS还是IDE,他们和语言库 本身没有关系。
而 iostream本身是C++的标准库之一。
所以,KEIL里你说有没有呢?
如果(我不确认)有一个C51编译器支持C++,那你的KEIL里其实是“有iostream.h的”,而在PC上,如果你指定的是一个C工程,而不是C++工程,那么,你的PC里也是没有“iostream.h”的。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

9
 
最后 ,留一个小问题,发散思维。
其实很简单。
不知道大家有没注意。

C51这种 C语言的偏僻方言,自从我们熟悉了STM32以后,单片机的C语言开发越来越和所谓的“PC”上的C越来越没区别。
于是包括我在内,data这个关键词我们早就忘记了。
我们更加不太可能还记得除了 data其实还分 idata xdata。
我原来也以为我这辈子再也不会见到这货。

但最近,我在工作中因为做的项目要求达到车规级,因此我第一次使用了 NXP的MCU,S32K144
在他的C语句里,我再次见到了久违的 data 关键词(事实上这次,这个关键修饰词更长,以至于我都想不起来怎么打出来)

那么,有一个问题是——我们不能指望,永远都只和我们在 “PC上的标准C”一样的C,我们这一生可能没多少机会要去正儿八经写一个PC上的C程序。
但是,至少是我,我真的很希望我以后不管用什么单片机,我都不需要管这些 idata xdata.......

还有类似的,想把一个在PC的VC上的代码片段移植到单片机上,实在是一个很稀疏平常的想法,并没有什么过错。
但是动不动给我来个iostream还算小的 ,万一代码里一堆 vector contain那可如何是好?

当今,越来越多的单片机也早已支持C++。
其实C++在某些场合,的确要比C更适合编写代码,不仅简单,而且编译出来的 HEX,运行的速度丝毫不逊色。
因此可以预见,将来有一天,我一定会想用C++实现一个模块,甚至我可能要移植一个C++库,而这个库只有C++写的,比如,你去找你一个ucgui/emwin以外的适合单片机使用的图形库试试看?

那么,以上这些问题,请问对于更多只想用C或者只适应C来编写单片机程序的工程师——他们也没错。
这个时候我们如何做,会让这些事情过渡更缓和更平滑?

这是一个OPEN问题,欢迎你的回答。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

10
 
lcofjp 发表于 2018-9-5 00:28
教主要么不发帖,一发帖就前三名

队长,你好。
队长,再见。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7228

帖子

195

TA的资源

五彩晶圆(高级)

11
 

以前看到这么编程的 每次第一感觉就是大神
此帖出自编程基础论坛
 
 
 

回复

1万

帖子

203

TA的资源

管理员

12
 
欣欣你太可爱了。被我炸出来了!辛苦这么撅贴啦
此帖出自编程基础论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

13
 
okhxyyo 发表于 2018-9-5 08:28
欣欣你太可爱了。被我炸出来了!辛苦这么撅贴啦

是的,女神。
女神永远都是对的
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

14
 
常见泽1 发表于 2018-9-5 08:15
以前看到这么编程的 每次第一感觉就是大神

哪里大神了。
我感觉这就是一肉鸡。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

122

帖子

2

TA的资源

一粒金砂(中级)

15
 
ESP32的SDK底层好像就是用C++写的。
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

16
 
lcn1992 发表于 2018-9-5 14:01
ESP32的SDK底层好像就是用C++写的。

嗯,我之前面试过两家很大的企业。
它们也要求用C++写单片机
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1371

帖子

6

TA的资源

版主

17
 
1)  选择正确的平台,适合项目就好
2)  开发产品是以项目为导向的,一切脱离的项目谈开发,都是耍流氓
此帖出自编程基础论坛
 
个人签名专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

18
 
懒猫爱飞 发表于 2018-9-6 08:25
1)  选择正确的平台,适合项目就好
2)  开发产品是以项目为导向的,一切脱离的项目谈开发,都是耍流氓

大哥,您这话我完全同意。
不过你是指?
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1371

帖子

6

TA的资源

版主

19
 
辛昕 发表于 2018-9-6 17:10
大哥,您这话我完全同意。
不过你是指?

  我是说,不管是C++开发,还是c开发,适合快速开发就好
不管是8位MCU还是32位MCU,适合项目的就好
此帖出自编程基础论坛
 
个人签名专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

20
 
懒猫爱飞 发表于 2018-9-7 12:58
我是说,不管是C++开发,还是c开发,适合快速开发就好
不管是8位MCU还是32位MCU,适合项目的就好

哦,是的是的。
我是在现实中听到太多有人 听到C++就抵触。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表