搜索
bottom↓
回复: 50

[原创]在C语言数组初始化中放入任意数据类型

  [复制链接]

出0入93汤圆

发表于 2018-11-30 07:25:21 | 显示全部楼层 |阅读模式
版权所有,使用随意。

我们经常在其他编程语言中看到数组初始化内容时,里面的内容参差不齐,而且数据类型千奇百怪,所以用C的也想获取这项便利,然而C89根本不支持,很是烦人。
先来个例子,JavaScript的:
  1. var arr = [ 1, '2', Math.sin, false, 0.4, null, [1, 2, 3], ['8', 'this', Object] ];
复制代码

然后就是C89的数组初始化了,可以这样:
  1. int arr[] = {1, 2, 3, 4};
复制代码

然而现在我在做液晶屏显示,做了一个菜单,有主菜单,不知道多少项。主菜单还有子菜单,同样不知道多少项。现在简单点,就写菜单标题吧,于是这样写:
  1. const char* MenuItems[][] = {
  2.     {
  3.         "New", "Open", "Save", "Exit"
  4.     },
  5.     {
  6.         "About"
  7.     }
  8. };
复制代码
编译,报错。C语言的数组必须在编译期就能够确定大小,一维数组编译器还能算出来,二维的就傻眼了。

终于,过了好多好多年,估计程序猿的呼声终于有了回应了,于是GCC就有解决方案了,然后C99标准化了。然而,20年过去了,还是好多人不知道。C99说,这点小问题能难住我吗,不知道大小就变成指针啊。于是变成这样:注意,必须开启C99或GNU编译选项,用到了复合字面量。
  1. const char** MenuItems[] = {
  2.     (const char*[]){
  3.         "New", "Open", "Save", "Exit"
  4.     },
  5.     (const char*[]){
  6.         "About"
  7.     }
  8. };
复制代码


然而,细心的朋友会发现,这里居然只有子菜单的菜单项,主菜单的居然不见了!解决方案也简单啊,每一个主菜单做成一个结构体,不就好了?像这样:
  1. struct MainMenuItem {
  2.     const char* Title;
  3.     const char* Children[];
  4. };
复制代码

完美解决!

然而,现在无良老板又要我们加了三级菜单,又得改结构,干脆加入链表。
过了几天,无良老板说,子菜单中不但要有菜单名,还要菜单分隔符,还要菜单Action(好吧,这个Delphi中偷来的概念,就当做一个函数吧),而且顺序不定,要是每个菜单项都用一个超大的结构体容纳,占用空间不说,写起来还超级费事,就算码农是搬砖的,那力气也是有限的对不。

终于还是有人看不下去了,开始华丽的魔法,透明联合体!注意,下面的代码如果C99不管用,那就还是开启GNU选项吧。
先声明一个联合体类型,有用没有的全往里面塞。当然了,这个类型占用了最大的成员size。
  1. typedef union _ANY {
  2.     int Int;
  3.     float Float;
  4.     char Char;
  5.     char* String;
  6.     int* IntArray;
  7.     void (*Function)();
  8.     union _ANY* pAny;
  9. } Any;
复制代码
然后范例来了,初始化往里面填内容,啥都往里装,当然看起来一点都不好看,那个链表甚至编译都有警告,我也不知道怎样消除,反正能正常运行,程序猿是不管警告的。
  1. const Any any[] = {
  2.     1, 1.2f, 'a', (Any)"Hello", (Any)(int[]){1, 2, 3, 4}, (Any)SystemInit,
  3.     (Any[]) {
  4.         2, 2.4f, 'b', (Any)"World", (Any)(int[]){5, 6, 7, 8}, (Any)SystemInit,        
  5.     }
  6. };
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2018-11-30 07:52:31 | 显示全部楼层
我竟然看不懂
const char** MenuItems[] = {
    (const char*[]){
        "New", "Open", "Save", "Exit"
    },
    (const char*[]){
        "About"
    }
};
这是什么操作,是什么意思

出0入0汤圆

发表于 2018-11-30 08:05:29 | 显示全部楼层

出0入0汤圆

发表于 2018-11-30 08:30:33 | 显示全部楼层
感觉这种太过于追求技巧的程序不怎么好接手

出0入93汤圆

 楼主| 发表于 2018-11-30 08:45:22 | 显示全部楼层
myxiaonia 发表于 2018-11-30 07:52
我竟然看不懂
const char** MenuItems[] = {
    (const char*[]){

复合字面量啊,我在上面说过了。请参考C99或GCC关于这方面的描述。如果你的编译器在这里编译不过去,请再次强制转换一次,变成(const char**)(const char*[]) { }。然后你亲自在IDE中操作一下,就明白啦

出0入0汤圆

发表于 2018-11-30 08:55:47 | 显示全部楼层
myxiaonia 发表于 2018-11-30 07:52
我竟然看不懂
const char** MenuItems[] = {
    (const char*[]){

const char*[] pNOSE = { "New", "Open", "Save", "Exit" };
const char*[] pAbout = { "About" };

const char** MenuItems[] = {
   pNOSE ,
   pAbout
};

我的理解大概是这样的;

出0入0汤圆

发表于 2018-11-30 09:11:00 | 显示全部楼层
你那union是怎么应运的呢?  联合体变量写了一堆,但最后内存里不就是一个末尾的指针吗?其它不是应该全被覆盖了?

出0入0汤圆

发表于 2018-11-30 09:19:24 来自手机 | 显示全部楼层
这是个坑,还是慢慢垒码吧

出0入0汤圆

发表于 2018-11-30 09:20:07 | 显示全部楼层
jiege0119 发表于 2018-11-30 08:55
const char*[] pNOSE = { "New", "Open", "Save", "Exit" };
const char*[] pAbout = { "About" };

你这一解释为有点明白了,而且正如你所说,这个数组初始化的时候其实产生了3个数组,分别是MenuItems,pNOSE,pAbout ,后两个是匿名的,只能通过MenuItems[0],MenuItems[1]来访问

这个确实需要扩展了,不是标准c做法

出0入93汤圆

 楼主| 发表于 2018-11-30 09:40:45 | 显示全部楼层
myxiaonia 发表于 2018-11-30 09:20
你这一解释为有点明白了,而且正如你所说,这个数组初始化的时候其实产生了3个数组,分别是MenuItems,pN ...

标准C99语法,怎么算是扩展呢。

出0入93汤圆

 楼主| 发表于 2018-11-30 09:43:07 | 显示全部楼层
xf331785508 发表于 2018-11-30 09:11
你那union是怎么应运的呢?  联合体变量写了一堆,但最后内存里不就是一个末尾的指针吗?其它不是应该全被 ...

透明联合体,无需指定具体是哪一个字段,编译器自动对应,存的不是末尾的指针哦。
这个GCC是支持的,C99标准里也有但是不见得编译器支持。

出330入0汤圆

发表于 2018-11-30 10:16:12 来自手机 | 显示全部楼层
这个太烧脑,某天想起来再来理解。

出0入0汤圆

发表于 2018-11-30 10:35:32 | 显示全部楼层
富翁式编程思维,一个变量至少占8byte                                 

出0入42汤圆

发表于 2018-11-30 10:55:14 | 显示全部楼层
要我想的话, 菜单文字统一放起来. 每个节点类型一样的结构体. 标记兄弟姐妹子节点, 搞个树

出0入4汤圆

发表于 2018-11-30 10:59:23 | 显示全部楼层
三级菜单范例能来个吗

出0入0汤圆

发表于 2018-11-30 11:02:43 | 显示全部楼层
没搞懂那个联合体在这里充当什么角色?

出0入76汤圆

发表于 2018-11-30 11:22:44 | 显示全部楼层
xf331785508 发表于 2018-11-30 09:11
你那union是怎么应运的呢?  联合体变量写了一堆,但最后内存里不就是一个末尾的指针吗?其它不是应该全被 ...

估计你没看清楚,any[]是Any类的一个数组哇
const Any any[] = {

出0入93汤圆

 楼主| 发表于 2018-11-30 11:37:31 | 显示全部楼层
ztrx 发表于 2018-11-30 10:59
三级菜单范例能来个吗

直接给个简单范例,简单的:
  1. ttypedef struct _MENUITEM {
  2.     const char* Text;
  3.     const struct _MENUITEM* Children;
  4.     void (*OnMenuClick)( struct _MENUITEM* );
  5. } MenuItem_t;

  6. const MenuItem_t MenuItems[] = {
  7.     {    // 文件菜单项
  8.         "文件",
  9.         (MenuItem_t[]){
  10.             {
  11.                 "新建",
  12.                 (MenuItem_t[]){
  13.                     {"新建文本文件", NULL /* 还可以继续写,想写多长写多长 */, miNewTextClick},
  14.                     {"新建Word文件", NULL, miNewDocClick},
  15.                     {"新建Excel文件", NULL, miNewXlsClick},
  16.                 },               
  17.             },
  18.             {"打开文件", NULL, miOpenClick},
  19.             {"退出", NULL, miExitClick},
  20.         }
  21.     },
  22.     {    // 关于
  23.         "关于",
  24.         (MenuItem_t[]){
  25.             {"关于本程序", NULL, miAboutClick}
  26.         }
  27.     }
  28. };
复制代码

出0入0汤圆

发表于 2018-11-30 12:17:26 来自手机 | 显示全部楼层
myxiaonia 发表于 2018-11-30 07:52
我竟然看不懂
const char** MenuItems[] = {
    (const char*[]){

看着像二维指针数组

出0入0汤圆

发表于 2018-11-30 12:18:54 来自手机 | 显示全部楼层
takashiki 发表于 2018-11-30 08:45
复合字面量啊,我在上面说过了。请参考C99或GCC关于这方面的描述。如果你的编译器在这里编译不过去,请再 ...

https://www.amobbs.com/forum.php?mod=viewthread&tid=5703032&extra=page%3D1&mobile=2&_dsign=e080a694
看起来楼主是回答这个贴

出0入93汤圆

 楼主| 发表于 2018-11-30 12:24:26 | 显示全部楼层
huangqi412 发表于 2018-11-30 12:18
https://www.amobbs.com/forum.php?mod=viewthread&tid=5703032&extra=page%3D1&mobile=2&_dsign=e080a69 ...

这个贴也是我回答的,而且我还这个坛子至少还回答过两次这样的问题。
但是,透明联合这个我没有回答过,也没有人问过。只是看着C这种强类型(算不那么强的次强类型?)语言表达能力没有很多脚本语言随意书写的方便而发的,带来的后果就是一堆强制转换,很难看。

出0入8汤圆

发表于 2018-11-30 13:47:00 来自手机 | 显示全部楼层
新的语法糖
原来需要写一个中间数组来中转
现在用复合字面量少写一个中间数组,由编译器自己分配
非常适合菜单这类程序
如果按照传统写法,要写一堆别的地方用不到的中转数组

出0入0汤圆

发表于 2018-11-30 19:29:33 | 显示全部楼层
takashiki 发表于 2018-11-30 11:37
直接给个简单范例,简单的:

这种如何printf?

出0入93汤圆

 楼主| 发表于 2018-11-30 19:34:45 | 显示全部楼层

你要printf哪一项?比如"新建Word文件"这个吧:
  1. printf("%s", MenuItems[0].Children[0].Children[1].Text);
复制代码

出0入0汤圆

发表于 2018-11-30 19:47:40 | 显示全部楼层
takashiki 发表于 2018-11-30 19:34
你要printf哪一项?比如"新建Word文件"这个吧:

你这个
    void (*OnMenuClick)( struct _MENUITEM* );
这个是如何定义的?感觉有点怪,这个链表看着很费劲啊,

出0入0汤圆

发表于 2018-11-30 20:17:31 来自手机 | 显示全部楼层
二维数组初始化,必须要给列数啊,就是第二个[]

出0入93汤圆

 楼主| 发表于 2018-11-30 20:30:29 | 显示全部楼层
jlhgold 发表于 2018-11-30 19:47
你这个
    void (*OnMenuClick)( struct _MENUITEM* );
这个是如何定义的?感觉有点怪,这个链表看着很 ...

这个是函数指针

出0入93汤圆

 楼主| 发表于 2018-11-30 20:34:18 | 显示全部楼层
sbusr 发表于 2018-11-30 20:17
二维数组初始化,必须要给列数啊,就是第二个[]

没关系,把里面的那个退化成指针后就不用给出列数了,或者干脆全都退化成指针。只是退化后,sizeof就没法用了,用了得到的也不是自己预期的值;但是下标还是可以用的

出0入0汤圆

发表于 2018-11-30 21:42:55 | 显示全部楼层
虽然看不懂,但还是觉得很神奇,楼主牛,mark

出0入0汤圆

发表于 2018-12-1 00:19:03 | 显示全部楼层
takashiki 发表于 2018-11-30 08:45
复合字面量啊,我在上面说过了。请参考C99或GCC关于这方面的描述。如果你的编译器在这里编译不过去,请再 ...

受教了。。。又学习了新知识

出0入0汤圆

发表于 2018-12-26 15:54:19 | 显示全部楼层
首先这样很费RAM,第二这样很难理解,对后面维护的人来说可能比较吃力,第三也是最重要的,一大堆告警无法接受

出0入93汤圆

 楼主| 发表于 2018-12-26 16:11:11 | 显示全部楼层
技术宅 发表于 2018-12-26 15:54
首先这样很费RAM,第二这样很难理解,对后面维护的人来说可能比较吃力,第三也是最重要的,一大堆告警无法 ...

第一,费RAM从何说起。
第二,不是更好理解吗,好多动态语言数据就是这么干的。
第三,把警告关了就好了,作为程序员,不用关心警告,好了,开玩笑的。不用那个链表是没有警告的。

出0入0汤圆

发表于 2018-12-26 17:18:42 | 显示全部楼层
这个有点烧脑,暂时没理解了

出0入0汤圆

发表于 2018-12-26 17:21:55 | 显示全部楼层
这个有点烧脑,暂时没理解了

出0入8汤圆

发表于 2018-12-26 18:00:16 | 显示全部楼层
楼主

出0入0汤圆

发表于 2018-12-26 20:29:32 | 显示全部楼层
技术宅 发表于 2018-12-26 15:54
首先这样很费RAM,第二这样很难理解,对后面维护的人来说可能比较吃力,第三也是最重要的,一大堆告警无法 ...

警告可以消除,对于有严重强迫症的嵌入式工程师,绝对是不能容忍任何警告的:




类型及全局变量声明/定义:
  1. typedef union AnyUnionTag {
  2.   int   Int;
  3.   float Float;
  4.   char  Char;
  5.   char  *pString;
  6.   int   *pIntArray;
  7.   void  (*pFunction)(void);
  8.   union AnyUnionTag *pAnyUnion;
  9. } AnyUnionType;

  10. const AnyUnionType AnyUnionVariable1 = {
  11.   .Int = 1,
  12.   .Float = 1.2f,
  13.   .Char = 'a',
  14.   .pString = "Hello",
  15.   .pIntArray = (int []){1, 2, 3, 4},
  16.   .pFunction = SystemInit,
  17.   .pAnyUnion = &(AnyUnionType){.Int = 2, .Float = 2.4f, .Char = 'b', .pString = "World", .pIntArray = (int []){5, 6, 7, 8}, .pFunction = SystemInit}
  18. };

  19. const AnyUnionType AnyUnionVariable2 = {
  20.   .Int = 1,
  21.   .Float = 1.2f,
  22.   .Char = 'a',
  23.   .pString = "Hello",
  24.   .pIntArray = (int []){1, 2, 3, 4},
  25.   .pFunction = SystemInit,
  26.   .pAnyUnion = &(AnyUnionType){.Int = 2, .Float = 2.4f, .Char = 'b', .pString = "World", .pIntArray = (int []){5, 6, 7, 8}, .pFunction = SystemInit}
  27. };
复制代码




局部变量声明/定义:
  1.       AnyUnionType AnyUnionArray3[] = {
  2.         ((AnyUnionType){.Int = 1},
  3.          (AnyUnionType){.Float = 1.2f},
  4.          (AnyUnionType){.Char = 'a'},
  5.          (AnyUnionType){.pString = "Hello"},
  6.          (AnyUnionType){.pIntArray = (int []){1, 2, 3, 4}},
  7.          (AnyUnionType){.pFunction = SystemInit},
  8.          (AnyUnionType){.pAnyUnion = (AnyUnionType *)AnyUnionArray3}),
  9.          
  10.         ((AnyUnionType){.Int = 2},
  11.          // (AnyUnionType){.Float = 2.4f},
  12.          (AnyUnionType){.Char = 'b'},
  13.          (AnyUnionType){.pString = "World"},
  14.          (AnyUnionType){.pIntArray = (int []){5, 6, 7, 8}},
  15.          (AnyUnionType){.pFunction = SystemInit},
  16.          (AnyUnionType){.pAnyUnion = (AnyUnionType *)AnyUnionArray3},
  17.          (AnyUnionType){.Float = 2.4f}),
  18.       };
  19. //-------------------------------------------------------------
  20.       AnyUnionType AnyUnionArray4[] = {
  21.         ((AnyUnionType){.Int = 1},
  22.          (AnyUnionType){.Float = 1.2f},
  23.          (AnyUnionType){.Char = 'a'},
  24.          (AnyUnionType){.pString = "Hello"},
  25.          (AnyUnionType){.pIntArray = (int []){1, 2, 3, 4}},
  26.          (AnyUnionType){.pFunction = SystemInit},
  27.          (AnyUnionType){.pAnyUnion = (AnyUnionType []){(AnyUnionType){.Int = 2},
  28.                                                        (AnyUnionType){.Float = 2.4f},
  29.                                                        (AnyUnionType){.Char = 'b'},
  30.                                                        (AnyUnionType){.pString = "World"},
  31.                                                        (AnyUnionType){.pIntArray = (int []){5, 6, 7, 8}},
  32.                                                        (AnyUnionType){.pFunction = SystemInit},
  33.                                                        (AnyUnionType){.pAnyUnion = (AnyUnionType *)AnyUnionArray4}}}),
  34.          
  35.         ((AnyUnionType){.Int = 3},
  36.          (AnyUnionType){.Float = 3.6f},
  37.          (AnyUnionType){.Char = 'c'},
  38.          (AnyUnionType){.pString = "Hello"},
  39.          (AnyUnionType){.pIntArray = (int []){9, 10, 11, 12}},
  40.          (AnyUnionType){.pFunction = SystemInit},
  41.          (AnyUnionType){.pAnyUnion = (AnyUnionType []){(AnyUnionType){.Int = 4},
  42.                                                        (AnyUnionType){.Float = 4.8f},
  43.                                                        (AnyUnionType){.Char = 'd'},
  44.                                                        (AnyUnionType){.pString = "World"},
  45.                                                        (AnyUnionType){.pIntArray = (int []){13, 14, 15, 16}},
  46.                                                        (AnyUnionType){.pFunction = SystemInit},
  47.                                                        (AnyUnionType){.pAnyUnion = (AnyUnionType *)AnyUnionArray4}}}),
  48.       };
复制代码




编译设置:

  
Union初始化:

  
Union成员赋值:

  
Union成员赋值:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-12-26 20:50:53 | 显示全部楼层
技术宅 发表于 2018-12-26 15:54
首先这样很费RAM,第二这样很难理解,对后面维护的人来说可能比较吃力,第三也是最重要的,一大堆告警无法 ...

补张图片:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-12-26 21:02:50 来自手机 | 显示全部楼层
收藏,好好看看

出0入93汤圆

 楼主| 发表于 2018-12-27 06:50:32 | 显示全部楼层
laoshuhunya 发表于 2018-12-26 20:29
警告可以消除,对于有严重强迫症的嵌入式工程师,绝对是不能容忍任何警告的:


看您写的代码这么规整,看来平时一定是个认真的人,有代码洁癖,比我强多了。
不过不好意思,我估计您是没有理解我的意思还是忘了[]还是曲解了,您这个和我的完全不一样啊,全都少了一个维度。
比如您的AnyUnionVariable1,我的原意是MyAnyUnionVariable1,是数组而不是单个联合体,其中的每一项是数组的成员而不是联合体的成员:

但是遗憾的是,警告依然无法消除,不知道怎么搞。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-12-27 09:31:31 | 显示全部楼层
我就是不注重警告的人,这种新写法学习了。

出0入0汤圆

发表于 2018-12-27 09:34:28 | 显示全部楼层
基础太薄弱没看懂,哪位大神给个工程范例好好的理解下。谢谢

出0入0汤圆

发表于 2018-12-27 10:01:47 | 显示全部楼层
takashiki 发表于 2018-12-27 06:50
看您写的代码这么规整,看来平时一定是个认真的人,有代码洁癖,比我强多了。
不过不好意思,我估计您是 ...


过谦了,有空再好好研究下。
从语言角度讲,数组的维度应该不是问题,大部分警告是强制类型转换引起的。

出0入362汤圆

发表于 2018-12-27 10:28:36 | 显示全部楼层
albert_w 发表于 2018-11-30 10:55
要我想的话, 菜单文字统一放起来. 每个节点类型一样的结构体. 标记兄弟姐妹子节点, 搞个树 ...

只要记录一个父节点就行了,遍历所有菜单项把所有相同父节点的子项放在一起作为当前层级菜单项显示,反正菜单项一般不会很多

我的菜单程序,用了很久了:
  1. #define MAX_NAME_LEN 24
  2. #define MAX_MENU_ITEMS 64
  3. #define ITEMS_PER_PAGE 4
  4. #define TOPLEVEL 255

  5. typedef struct {
  6.     unsigned char parent;   // 上层菜单项, TOPLEVEL则为顶层菜单   
  7.     bool isdir;             // 是否是目录, 是则进入下层菜单, 否则执行action操作  
  8.     unsigned short val;      // 菜单项值     
  9.     char *name;             // 菜单项名称      
  10.     void (*action)(int param);  // 操作
  11. } MenuItemTypeDef;

  12. static struct {
  13.     int item_count;
  14.     int menu_group;
  15.     int menu_pos;
  16.     MenuItemTypeDef menu[MAX_MENU_ITEMS];
  17. } g;

  18. static int AddItem(int parent, bool isdir, unsigned char* name,  unsigned short val)
  19. {
  20.     int ret, namelen = 0;
  21.     g.menu[g.item_count].parent = parent;
  22.     g.menu[g.item_count].isdir = isdir;

  23.     namelen = strlen((char*)name);
  24.     if(namelen > MAX_NAME_LEN)
  25.         namelen = MAX_NAME_LEN;
  26.     g.menu[g.item_count].name = malloc(namelen + 2);
  27.     if(g.menu[g.item_count].name == NULL)
  28.         return -1;
  29.     bzero(g.menu[g.item_count].name, namelen + 2);
  30.     strncpy(g.menu[g.item_count].name, (char*)name, namelen);
  31.     g.menu[g.item_count].val = val;
  32.     ret = g.item_count;
  33.     g.item_count++;

  34.     return ret;
  35. }
复制代码

使用时只要先建立几个顶级菜单项,
  1. int top1 = AddItem(TOPLEVEL, true,  "1111111111111", 0);
  2. int top2 = AddItem(TOPLEVEL, true,  "22222222222", 0);
  3. int top3 = AddItem(TOPLEVEL, true,  "3333333333", 0);
  4. 然后继续用顶级菜单项的id创建子菜单项就行了
  5. AddItem(top1, false, "aaaaaa", 100);
  6. AddItem(top1, false, "bbbbbb", 200);
复制代码

出0入0汤圆

发表于 2018-12-27 10:54:00 来自手机 | 显示全部楼层
myrgb 发表于 2018-12-27 09:34
基础太薄弱没看懂,哪位大神给个工程范例好好的理解下。谢谢

复合字面量,就是生成并初始化一个指定类型的无名对象。个人认为重点要理解的还是类型、地址、指针、栈这些基本概念,这篇文章非常不错,可以看看:
深入理解C语言指针的奥秘



然后再看这个图:




最后,任何指针问题都可以在这张图里找到答案:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-12-31 15:14:03 | 显示全部楼层
takashiki 发表于 2018-12-27 06:50
看您写的代码这么规整,看来平时一定是个认真的人,有代码洁癖,比我强多了。
不过不好意思,我估计您是 ...

这样可以消除警告:




编译输出:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入296汤圆

发表于 2019-1-5 09:08:43 来自手机 | 显示全部楼层
看到也有人用类似的方法,我就放心了。以后看来挨打的时候,我知道,不是只有我一个人挨打。

出0入0汤圆

发表于 2020-3-31 20:38:01 | 显示全部楼层
takashiki 发表于 2018-12-26 16:11
第一,费RAM从何说起。
第二,不是更好理解吗,好多动态语言数据就是这么干的。
第三,把警告关了就好了 ...

有警告强迫症的接收不了

出0入0汤圆

发表于 2020-4-1 00:11:33 来自手机 | 显示全部楼层
收蔵学习!

出0入0汤圆

发表于 2020-4-1 00:43:32 来自手机 | 显示全部楼层
记号一下,现在还无法完全理解。

出0入0汤圆

发表于 2020-4-3 14:11:43 | 显示全部楼层
lihai le
无法完全理解

出0入0汤圆

发表于 2020-4-4 16:19:43 | 显示全部楼层
我的天那,感觉像是打开了新世界!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-28 23:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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