社区导航

 
查看: 2145|回复: 20

[原创] 【板块老帖子】十年前的一个51帖子

[复制链接]

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-9-5 00:16:43 | 显示全部楼层 |阅读模式
本帖最后由 辛昕 于 2018-9-5 00:44 编辑

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

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

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


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


此帖出自编程基础论坛
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

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

以下是代码,那时候还没有 CODE 各种格式,看着太难受,我重新整一下
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-9-5 00:20:14 | 显示全部楼层
  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'
复制代码

点评

以前看到这么编程的 每次第一感觉就是大神  详情 回复 发表于 2018-9-5 08:15
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-9-5 00:24:07 | 显示全部楼层
本帖最后由 辛昕 于 2018-9-5 00:46 编辑

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

说起来,最终这段代码遇到的问题主要就两个
1.<iostream.h>,当然,楼主说,他一时忘了去掉,他也知道,这是他在VC下用C++时做的。
是的,这个是C++的标准库(头文件)之一,不在C标准库之列,更不在C51之列;
2.一个意外,他定义的变量使用了 data 这个关键字——说实话,太久没用51了,反正我是一直没注意到。
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

5459

TA的帖子

185

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-9-5 00:28:09 | 显示全部楼层
教主要么不发帖,一发帖就前三名

点评

队长,你好。 队长,再见。  详情 回复 发表于 2018-9-5 00:49
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

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

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

所以渐渐的我就很不在意了,但是为了让这个帖子多点技术含量,以防止我被女神neng死,我还是决定扯扯。
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-9-5 00:31:53 | 显示全部楼层
就不多说了,大半夜的。举最开始的俩个楼层作为例子吧。

example 1:
C,不是C++

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


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


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-9-5 00:32:31 | 显示全部楼层
example 2:
#include <iostream.h>

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”的。
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-9-5 00:40:52 | 显示全部楼层
最后 ,留一个小问题,发散思维。
其实很简单。
不知道大家有没注意。

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问题,欢迎你的回答。
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-9-5 00:49:19 | 显示全部楼层
lcofjp 发表于 2018-9-5 00:28
教主要么不发帖,一发帖就前三名

队长,你好。
队长,再见。
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

6898

TA的帖子

176

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2018-9-5 08:15:38 | 显示全部楼层

以前看到这么编程的 每次第一感觉就是大神

点评

哪里大神了。 我感觉这就是一肉鸡。  详情 回复 发表于 2018-9-5 09:48


回复

使用道具 举报

8500

TA的帖子

128

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2018-9-5 08:28:40 来自手机 | 显示全部楼层
欣欣你太可爱了。被我炸出来了!辛苦这么撅贴啦

点评

是的,女神。 女神永远都是对的  详情 回复 发表于 2018-9-5 09:47


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-9-5 09:47:38 | 显示全部楼层
okhxyyo 发表于 2018-9-5 08:28
欣欣你太可爱了。被我炸出来了!辛苦这么撅贴啦

是的,女神。
女神永远都是对的
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-9-5 09:48:17 | 显示全部楼层
常见泽1 发表于 2018-9-5 08:15
以前看到这么编程的 每次第一感觉就是大神

哪里大神了。
我感觉这就是一肉鸡。
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

115

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-9-5 14:01:02 | 显示全部楼层
ESP32的SDK底层好像就是用C++写的。

点评

嗯,我之前面试过两家很大的企业。 它们也要求用C++写单片机  详情 回复 发表于 2018-9-5 21:02


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-9-5 21:02:05 | 显示全部楼层
lcn1992 发表于 2018-9-5 14:01
ESP32的SDK底层好像就是用C++写的。

嗯,我之前面试过两家很大的企业。
它们也要求用C++写单片机
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

954

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-9-6 08:25:16 | 显示全部楼层
1)  选择正确的平台,适合项目就好
2)  开发产品是以项目为导向的,一切脱离的项目谈开发,都是耍流氓

点评

大哥,您这话我完全同意。 不过你是指?  详情 回复 发表于 2018-9-6 17:10
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: 422240210


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

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

大哥,您这话我完全同意。
不过你是指?

点评

我是说,不管是C++开发,还是c开发,适合快速开发就好 不管是8位MCU还是32位MCU,适合项目的就好  详情 回复 发表于 2018-9-7 12:58
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

954

TA的帖子

2

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-9-7 12:58:26 | 显示全部楼层
辛昕 发表于 2018-9-6 17:10
大哥,您这话我完全同意。
不过你是指?

  我是说,不管是C++开发,还是c开发,适合快速开发就好
不管是8位MCU还是32位MCU,适合项目的就好

点评

哦,是的是的。 我是在现实中听到太多有人 听到C++就抵触。  详情 回复 发表于 2018-9-7 14:38
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: 422240210


回复

使用道具 举报

7789

TA的帖子

54

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-9-7 14:38:36 | 显示全部楼层
懒猫爱飞 发表于 2018-9-7 12:58
我是说,不管是C++开发,还是c开发,适合快速开发就好
不管是8位MCU还是32位MCU,适合项目的就好

哦,是的是的。
我是在现实中听到太多有人 听到C++就抵触。

点评

从来不抵触新事物,当年火车还跑不过马车,这很正常,只要你觉得合适,用心去做就好  详情 回复 发表于 2018-9-7 15:13
没有一件事情是容易的,所以,起念头时,一定要好好琢磨


回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-12-15 12:49 , Processed in 0.494667 second(s), 16 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表