社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 精华区
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
搜索
查看: 1395|回复: 7

[经验] 一些代码片段

[复制链接]

7122

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

发表于 2014-8-23 12:35:46 | 显示全部楼层 |阅读模式
本帖最后由 辛昕 于 2014-8-23 12:45 编辑

在编程的过程里,我发现记性不好,经常忘记一些语法,每次都百度,有让我觉得是很低效率的 反DRY模式(Don't Report Yourself),于是我萌生了为这些容易遗忘的语法点,写一些极其简单的,小小的测试程序,或者说demo程序。

同样的,对于一些不那么直接的语法,需要一些尝试的小细节也是。

这样的代码基本没法单独以什么特定的名目发布,所以我决定,写个帖子,把它们集合起来。没什么太特定的作用,不要打我~~

这个帖子的部分,是我公司的机器里的,周一出差,在整理电脑时发现的。


补充:
大多数时候我写这些简单的测试代码的时候,使用的是普通的PC环境——
因为我要测试的东西都只是普通的标准C语法和特性(即使是因为单片机编程引发的问题,我也只是用标准C语法,我一般不用特殊的扩展性语法)
我使用的是 windows下的 Dev Cpp,由于版本的不同。
有时候你会在代码的末尾看到 一句 System(''Pause');一类的,这只是为了让程序输出console时暂停下来查看效果。
没什么实际作用,如果你在你特定的环境下测试,可以把它去掉。
此帖出自编程基础论坛
无历史,不传奇,不号召
初九,潜龙勿用

回复

使用道具 举报

7122

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2014-8-23 12:42:43 | 显示全部楼层
本帖最后由 辛昕 于 2014-8-23 14:51 编辑

这段代码,是测试 const的功能的,看它是否真的可以起到限制作用,如其名:常量。
得出的结论是,没用
但是需要补充一点的是,事后我在和人讨论时,对此得到一个补充性信息:
对于局部变量,这个修饰是无效的,但是对于 全局 变量是有效的。
那么对于 静态变量呢?
于是我需要 补充一下 两个测试函数;

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void test1(char *temp)
  4. {
  5.      temp[0] = 3;
  6. }

  7. void test2(const char *temp)
  8. {
  9.      temp[0] = 3;
  10. }

  11. // 结论是,根本没用,只有警告,除非强行把警告视为错误,但即便如此,
  12. // 这仍然是一种不安全的操作。

  13. int main(void)
  14. {
  15.   char test[3];
  16.   const char tester[3];
  17.   
  18.   test2(test);
  19.   test2(tester);
  20.   printf("it's %d\n",test[0]);
  21.   printf("it's %d\n",tester[0]);
  22.       
  23.   system("PAUSE");        
  24.   return 0;
  25. }
复制代码
刚折腾了一下我电脑上的DevCpp。
折腾好后,重新试了试程序,然后发现一个很奇怪的地方:
我发现这个程序终于如我所愿的出现 编译错误了!

它终于不允许我修改temp了!(void test2()里)。

但是之前我在另一个版本的DevCpp上明明记得是可以的——当然是DevCpp,因为现在在WINDOWS下写 控制台程序 都用它。

看起来这是个与编译器有关的地方,简单地说,当然是这种事不能干,任何隐式依赖都是不可靠的。
不过一时半会要找出 为啥这里不行,还要点时间,先放下,先把剩余的代码放上来先。

无历史,不传奇,不号召
初九,潜龙勿用

回复

使用道具 举报

7122

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2014-8-23 14:57:59 | 显示全部楼层
这是个很简单的 复合结构体 的 初始化方法。
它背后隐含的知识点,其实是 在 一个结构体的 (内部?)这个地方我也不知道用什么术语描述。但是代码可以很好说明,看到那个点没,其实它不是什么神奇的东西,它只是因为在这个结构体内部,所以可以省略结构体自身的名字。

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct
  4. {
  5.         int a;
  6.         int b;
  7. }Sub;

  8. typedef struct
  9. {
  10.         Sub Slave;
  11.         int c;
  12.         int d;
  13. }Domain;

  14. int main(void)
  15. {
  16.   Sub Son = {1,2};
  17.   Domain Father = {{3,4},6,7};
  18.   Sub Daughter = {.a = 5,
  19.                   .b = 9};
  20.   
  21.   printf("Son is... a= %d,b = %d\n",Son.a,Son.b);
  22.   printf("Daughter is... a= %d,b = %d\n",Daughter.a,Daughter.b);
  23.   return 0;
  24. }
复制代码

无历史,不传奇,不号召
初九,潜龙勿用

回复

使用道具 举报

7122

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2014-8-23 15:01:16 | 显示全部楼层
代码中已经很好说明了,结构体之间是不能直接比较的,哈哈~~我老是忘
除非用重载,网上很多帖子都这么写,可是他奶奶的,C也可以重载么?如果可以那也不是标准C语法了,这可不是什么好主意

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct
  4. {
  5.         int   a;
  6.         short b;
  7. }TestStr;


  8. int main(int argc, char *argv[])
  9. {
  10.   TestStr A = {3,5};
  11.   TestStr B = {3,7};
  12.   
  13.   B = A;
  14.   // it dont allow struct compare at all!!
  15. /* if(A != B)
  16.   {
  17.      printf("first,it's not the same.\n");
  18.      
  19.      printf("then we copy it.\n");
  20.      if(A == B)
  21.         printf("well,it's the same!\n");
  22.      else
  23.         printf("oh no,it's not work the way you think.\n");
  24.   }
  25.   else
  26.      printf("what the hell!\n")
  27.   */
  28.   system("PAUSE");       
  29.   return 0;
  30. }
复制代码
无历史,不传奇,不号召
初九,潜龙勿用

回复

使用道具 举报

7122

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2014-8-23 15:04:22 | 显示全部楼层
以下这段代码,写的有点作孽,当时不知在想什么。
不过,这和一般的 sizeof(xxx)/sizeof(yy) 没啥区别,对这个,我只想说

对于以地址方式传递到函数里的 形参,不能用这个方法,因为在那个时候,形参就是一个纯粹地址,或者说指针,它的sizeof永远都是 4或者8 什么的(一般是机器的总线宽度),这个时候,结果是错的。

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct
  4. {
  5.         int a;
  6.         char b;
  7. }TestStruct;

  8. TestStruct dd[] = {
  9.                     {3,2},
  10.                     {1,65},
  11.                     {6,6}
  12.                   };

  13. int main(void)
  14. {
  15.   int SizeOf;
  16.   SizeOf = sizeof(dd);
  17.   
  18.   printf("element acount of  dd is %d\n",SizeOf/sizeof(dd[0]));
  19.   system("PAUSE");       
  20.   return 0;
  21. }
复制代码
无历史,不传奇,不号召
初九,潜龙勿用

回复

使用道具 举报

7122

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2014-8-23 15:07:32 | 显示全部楼层
这段代码,我忘了我当时写的目的了,但是看起来,运行不起来。
只不过我也想不太明白为啥。
先贴上来。
用红色字体标识

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void TestFunc(void)
  4. {
  5.        
  6. }


  7. typedef struct
  8. {
  9.         char text[10];
  10.         void (*pFunc)(void);
  11.         char value;
  12. }TestStruct;

  13. static TestStruct temp = {"IDo!",TestFunc,15};

  14. void copy(TestStruct *pTest)
  15. {
  16.         pTest = &temp;
  17. }

  18. void printStruct(TestStruct *p)
  19. {
  20.         printf("the text is %s\n",p->text);
  21.         printf("the Func is in addr %p\n",p->pFunc);
  22.         printf("the value is %d\n",p->value);
  23. }

  24. int main(void)
  25. {
  26.         TestStruct buff,*p = &buff;
  27.        
  28.         printStruct(&temp);
  29.        
  30.         copy(p);
  31.         printfStruct(p);
  32.        
  33.         return 0;
  34. }
复制代码
无历史,不传奇,不号召
初九,潜龙勿用

回复

使用道具 举报

7122

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2014-8-24 13:27:23 | 显示全部楼层
本帖最后由 辛昕 于 2014-8-24 13:31 编辑

[ 本帖最后由 辛昕 于 2014-8-24 13:30 编辑 ]\n\n[ 本帖最后由 辛昕 于 2014-8-24 13:30 编辑 ]\n\n#ifndef _PAGE_CLASS_
#define _PAGE_CLASS_#include <string>
#include <vector>
using namespace std;typedef struct
{
    string text;
}Display;

typedef void (*KeyAction)(void *);

class page
{
      int code;
      Display display;
      vector<KeyAction> fun;
      
      public:
      page();
      page(int index,Display something);
      ~page();
      
      void show(void);
};

#define UP    0
#define DOWN  1
#define RIGHT 2
#define LEFT  3

#endif

// end of file ---------------------------------------
无历史,不传奇,不号召
初九,潜龙勿用

回复

使用道具 举报

7122

TA的帖子

48

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2014-8-24 13:32:17 | 显示全部楼层
妈的,要么没了换行,要么出现一堆乱码,要么直接不用代码功能~~
无历史,不传奇,不号召
初九,潜龙勿用

回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2017-9-24 07:33 , Processed in 0.320121 second(s), 15 queries , Redis On.

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