宏修真高手在都市宏涛进来,有关宏的问题

后使用快捷导航没有帐号?
查看: 4363|回复: 43
c语言高手请进,关于宏定义问题
在线时间1101 小时
威望1950 分
芯币10737 枚
E金币716 枚
TA的帖子TA的资源
本帖最后由 littleshrimp 于
10:28 编辑
想使用宏创建一个指定长度的数组,例如
#define CREATE_ARRAY(x)&&uint8_t buf[x] = {1,\
& && && && && && && && & 2,\
& && && && && && && && & 3,\
& && && && && && && && & 4};复制代码
执行下边代码
CREATE_ARRAY(4);复制代码会生成下边的文本
uint8_t buf[4] = {1,2,3,4};复制代码现在我希望能在执行CREATE_ARRAY(5);时自动将第5个字节添加进去,例如:
uint8_t buf[5] = {1,2,3,4,5};复制代码问过高手了,貌似不可能实现,不死心,在这里提问,希望能有奇迹出现。
在线时间760 小时
威望1056 分
芯币2157 枚
E金币719 枚
TA的帖子TA的资源
纯净的硅(中级), 积分 1056, 距离下一级还需 144 积分
纯净的硅(中级), 积分 1056, 距离下一级还需 144 积分
话说以前上学那会也想过这种问题,这种数组多节约空间啊,现在想想那会。。。
在线时间290 小时
威望322 分
芯币909 枚
E金币200 枚
TA的帖子TA的资源
一粒金砂(高级), 积分 322, 距离下一级还需 178 积分
一粒金砂(高级), 积分 322, 距离下一级还需 178 积分
c/c++ 不可能实现。其他语言也许可以
在线时间1270 小时
威望1552 分
芯币4387 枚
E金币208 枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1552, 距离下一级还需 448 积分
纯净的硅(高级), 积分 1552, 距离下一级还需 448 积分
按照我目前的认知,我也认为不可能实现
在线时间1270 小时
威望1552 分
芯币4387 枚
E金币208 枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1552, 距离下一级还需 448 积分
纯净的硅(高级), 积分 1552, 距离下一级还需 448 积分
按照我目前的认知,我也认为不可能实现,虽然我是菜鸟
在线时间1540 小时
威望23081 分
芯币9809 枚
E金币380 枚
TA的帖子TA的资源
这是不可能的
第一个最根本的,C语言不存在动态数组,就是说,定义时必须明确数组大小,并且此后都没办法改变这个数组的大小;
第二,照你这么用这个宏,你在第二次添加时,就变成了重复定义。
其实这个地方,我的建议就是。
直接用 malloc/free函数完成;
假如是单片机环境,不适合大量使用。
不妨自己构造一个 栈区。这个涉及内存管理,事情可复杂可简单,但总之就是麻烦事一桩。
在没必要的情况下大可不必如此。
假如代码中出现了 这种情况下很麻烦很拗口的使用情形,那就考虑重新思索如何改进实现方案。
山不转水转。
没有人说,如果不存在动态数组或者 动态分配 就活不了的实现方案的
>>>C语言不存在动态数组,就是说,定义时必须明确数组大小
动态数组 C99可以用在函数里,x未知
int stupid(int x)
int me[x] = {0};
这个不同于动态数组,使用宏创建数据在编译前数组的大小就已经确定了。
这么提问是为了简化问题,让看的人容易理解,其实我是想实现这样的功能。
例如BLE代码里有这样一段代码
"SimpleBLEBroadcaster"这样的&
本人变态,生物勿近
在线时间554 小时
威望949 分
芯币23013 枚
E金币230 枚
TA的帖子TA的资源
纯净的硅(中级), 积分 949, 距离下一级还需 251 积分
纯净的硅(中级), 积分 949, 距离下一级还需 251 积分
有点厉害。。。
分享铸就美好未来。。。
在线时间1540 小时
威望23081 分
芯币9809 枚
E金币380 枚
TA的帖子TA的资源
楼上的说,C++也不行
其实,,C++是可以的,C++可以用 new方法,不过在我眼里,它的数组已经等同于指针了。虽然我没研究过它里面的实现方法,但显然那和C的实现方案不是一回事。
本人变态,生物勿近
在线时间1101 小时
威望1950 分
芯币10737 枚
E金币716 枚
TA的帖子TA的资源
本帖最后由 littleshrimp 于
13:57 编辑
这是不可能的
第一个最根本的,C语言不存在动态数组,就是说,定义时必须明确数组大小,并且此后都没办法改变这个数组的大小;
第二,照你这么用这个宏,你在第二次添加时,就变成了重复定义。
其实这个地方,我的建议就是。
直接用 malloc/free函数完成;
假如是单片机环境,不适合大量使用。
不妨自己构造一个 栈区。这个涉及内存管理,事情可复杂可简单,但总之就是麻烦事一桩。
在没必要的情况下大可不必如此。
假如代码中出现了 这种情况下很麻烦很拗口的使用情形,那就考虑重新思索如何改进实现方案。
山不转水转。
没有人说,如果不存在动态数组或者 动态分配 就活不了的实现方案的
这个不同于动态数组,使用宏创建数据在编译前数组的大小就已经确定了。
这么提问是为了简化问题,让看的人容易理解,其实我是想实现这样的功能。
例如BLE代码里有这样一段代码
// GAP - SCAN RSP data (max size = 31 bytes)
static uint8 scanRspData[] =
{
&&// complete name
&&0x15,& &// length of this data
&&GAP_ADTYPE_LOCAL_NAME_COMPLETE,
&&0x53,& &// 'S'
&&0x69,& &// 'i'
&&0x6d,& &// 'm'
&&0x70,& &// 'p'
&&0x6c,& &// 'l'
&&0x65,& &// 'e'
&&0x42,& &// 'B'
&&0x4c,& &// 'L'
&&0x45,& &// 'E'
&&0x42,& &// 'B'
&&0x72,& &// 'r'
&&0x6f,& &// 'o'
&&0x61,& &// 'a'
&&0x64,& &// 'd'
&&0x63,& &// 'c'
&&0x61,& &// 'a'
&&0x73,& &// 's'
&&0x74,& &// 't'
&&0x65,& &// 'e'
&&0x72,& &// 'r'
&&// Tx power level
&&0x02,& &// length of this data
&&GAP_ADTYPE_POWER_LEVEL,
&&0& && & // 0dBm&&
};
&SimpleBLEBroadcaster&这样的代码要一个一个敲到数组里,很麻烦。
而使用下边这种方法又不被允许
static uint8 scanRspData[] =
{
&&// complete name
&&0x15,& &// length of this data
&&GAP_ADTYPE_LOCAL_NAME_COMPLETE,
&&&SimpleBLEBroadcaster&,
&&// Tx power level
&&0x02,& &// length of this data
&&GAP_ADTYPE_POWER_LEVEL,
&&0& && & // 0dBm&&
};
复制代码
我能想到比较好的方法就是
static uint8 scanRspData[] =
{
&&// complete name
&&0x15,& &// length of this data
&&GAP_ADTYPE_LOCAL_NAME_COMPLETE,
&&&SimpleBLEBroadcaster&[0],
&&&SimpleBLEBroadcaster&[1],
&&&SimpleBLEBroadcaster&[2],
&&&SimpleBLEBroadcaster&[3],
&&&SimpleBLEBroadcaster&[n],
&&// Tx power level
&&0x02,& &// length of this data
&&GAP_ADTYPE_POWER_LEVEL,
&&0& && & // 0dBm&&
};
复制代码
但这样还是比较麻烦,所以如果能实现上边的功能我就可以把代码写成这样
#define STRINGARRAY(str,count)&&\
str##[0],\
str##[1],\
str##[3],\
str##[count - 1],
复制代码
然后这样调用
static uint8 scanRspData[] =
{
&&// complete name
&&0x15,& &// length of this data
&&GAP_ADTYPE_LOCAL_NAME_COMPLETE,
&&STRINGARRAY(&SimpleBLEBroadcaster&,20),
&&// Tx power level
&&0x02,& &// length of this data
&&GAP_ADTYPE_POWER_LEVEL,
&&0& && & // 0dBm&&
};
复制代码
在线时间1249 小时
威望6087 分
芯币18704 枚
E金币300 枚
TA的帖子TA的资源
这个是可以实现的,以前整过类似的功能,需要另外定义一个带_的宏函数可以将字符再转化为数字参数,不过你这个多行没想好怎么办
换行只是为了看起来方便,单行也可以的,如果能让
uint8_t buf[5] = {1,2,3,4,5};
大括号内的数值随着传入参数的大小变化就成功了。
例如传入的参数是6
uint8_t buf[6] = {1,2,3,4,5,6};&
在线时间1101 小时
威望1950 分
芯币10737 枚
E金币716 枚
TA的帖子TA的资源
这个是可以实现的,以前整过类似的功能,需要另外定义一个带_的宏函数可以将字符再转化为数字参数,不过你这个多行没想好怎么办
换行只是为了看起来方便,单行也可以的,如果能让
uint8_t buf[5] = {1,2,3,4,5};
大括号内的数值随着传入参数的大小变化就成功了。
例如传入的参数是6
uint8_t buf[6] = {1,2,3,4,5,6};
在线时间1432 小时
威望1389 分
芯币4981 枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1389, 距离下一级还需 611 积分
纯净的硅(高级), 积分 1389, 距离下一级还需 611 积分
本帖最后由 freebsder 于
15:08 编辑
ISO宏没办法递归,所以只好自己include自己来递归。借助gcc的扩展来结束递归。
不过,话说,你确定 &SimpleBLEBroadcaster&[0], 这种形式可以初始化数组?// res.h
#if (__INCLUDE_LEVEL__ == 1)
& & int buffer[NEST] = {
& && &&&__INCLUDE_LEVEL__ - 1,
#include &res.h&
#elif (__INCLUDE_LEVEL__ & NEST)
& & };
#else
& && &&&__INCLUDE_LEVEL__ - 1,
#include &res.h&
#endif复制代码// res.c
#define NEST& & 4& && &&&// &---- change me
#include &res.h&
int main(void)
{
& && &&&for(int x = 0; x & sizeof(buffer)/sizeof(buffer[0]); x++)
& && && && && & printf(&%d\n&, buffer[x]);
}
复制代码
"SimpleBLEBroadcaster"[0]在IAR和MDK中都可以正常使用。
你的参考代码也能在IAR和MDK平台下运行吗?我刚刚试过两个平台,都错在对__INCLUDE_LEVEL__ 减 1这里。&
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
这个问题我今晚思考看看如何解决
在线时间1432 小时
威望1389 分
芯币4981 枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1389, 距离下一级还需 611 积分
纯净的硅(高级), 积分 1389, 距离下一级还需 611 积分
这是不可能的
第一个最根本的,C语言不存在动态数组,就是说,定义时必须明确数组大小,并且此后都没办法改变这个数组的大小;
第二,照你这么用这个宏,你在第二次添加时,就变成了重复定义。
其实这个地方,我的建议就是。
直接用 malloc/free函数完成;
假如是单片机环境,不适合大量使用。
不妨自己构造一个 栈区。这个涉及内存管理,事情可复杂可简单,但总之就是麻烦事一桩。
在没必要的情况下大可不必如此。
假如代码中出现了 这种情况下很麻烦很拗口的使用情形,那就考虑重新思索如何改进实现方案。
山不转水转。
没有人说,如果不存在动态数组或者 动态分配 就活不了的实现方案的
&&&C语言不存在动态数组,就是说,定义时必须明确数组大小
动态数组 C99可以用在函数里,x未知
int stupid(int x)
& & int me[x] = {0};
& & ......
在线时间807 小时
威望1661 分
芯币965 枚
E金币704 枚
TA的帖子TA的资源
把字符串倒到数组里. strcpy应该就是干这事的, sprintf(....)应该也有这个能力吧.可以试下.
用strcpy memcpy,这个问题就没意义了&
如果把字符串存到数组里,使用strcopy就需要在buf里预留一段和字符串等长的空间用来存放数据,这样使用起来还是很麻烦。&
在线时间1101 小时
威望1950 分
芯币10737 枚
E金币716 枚
TA的帖子TA的资源
ISO宏没办法递归,所以只好自己include自己来递归。借助gcc的扩展来结束递归。
不过,话说,你确定 &SimpleBLEBroadcaster&[0], 这种形式可以初始化数组?
&SimpleBLEBroadcaster&[0]在IAR和MDK中都可以正常使用。
你的参考代码也能在IAR和MDK平台下运行吗?我刚刚试过两个平台,都错在对__INCLUDE_LEVEL__ 减 1这里。
》》》 "SimpleBLEBroadcaster"[0]在IAR和MDK中都可以正常使用。
哦,还真行,不过这个非标准的,IAR扩展的,把扩展关掉就不行了。。。
[attachimg]195426[/attachimg]&
IAR 试试这个:&
在线时间1101 小时
威望1950 分
芯币10737 枚
E金币716 枚
TA的帖子TA的资源
把字符串倒到数组里. strcpy应该就是干这事的, sprintf(....)应该也有这个能力吧.可以试下.
如果把字符串存到数组里,使用strcopy就需要在buf里预留一段和字符串等长的空间用来存放数据,这样使用起来还是很麻烦。
穷举算么??
#include "stdio.h"
unsigned char aa[]="开";
int i=-122113;
#define A_1(s) unsigned int buf[]={s[0]};
#define A_2(s) unsigned int buf[]={s[0],s[1]};
#define A_3(s) unsigned int buf&
在线时间910 小时
芯币1044 枚
E金币19 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 82, 距离下一级还需 118 积分
一粒金砂(中级), 积分 82, 距离下一级还需 118 积分
本帖最后由 EETUX 于
16:24 编辑
#include &stdio.h&
#define A_1(s) unsigned int buf[]={s[0]};
#define A_2(s) unsigned int buf[]={s[0],s[1]};
#define A_3(s) unsigned int buf[]={s[0],s[1],s[2]};
#define A_4(s) unsigned int buf[]={s[0],s[1],s[2],s[3]};
#define A_5(s) unsigned int buf[]={s[0],s[1],s[2],s[3],s[4]};
#define A_6(s) unsigned int buf[]={s[0],s[1],s[2],s[3],s[4],s[5]};
#define B(x,y) AA(x,y);
#define AA(x,y) A_##x(y)
int main()
& &B(5,&HELLO&);
& &printf(&%c %c %c %c %c&,buf[0],buf[1],buf[2],buf[3],buf[4]);
& &getchar();&&
在线时间1432 小时
威望1389 分
芯币4981 枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1389, 距离下一级还需 611 积分
纯净的硅(高级), 积分 1389, 距离下一级还需 611 积分
本帖最后由 freebsder 于
16:49 编辑
&SimpleBLEBroadcaster&[0]在IAR和MDK中都可以正常使用。
你的参考代码也能在IAR和MDK平台下运行吗?我刚刚试过两个平台,都错在对__INCLUDE_LEVEL__ 减 1这里。
IAR 试试这个:
& && &&&__COUNTER__/2,
#if (__COUNTER__ &= NEST*2)
#include &res.h&
#endif复制代码// res.c
#define NEST& & 4
int buffer[NEST] = {
#include &res.h&
};
int main(void)
{
& && &&&for(int x = 0; x & sizeof(buffer)/sizeof(buffer[0]); x++)
& && && && && & printf(&%d\n&, buffer[x]);
}复制代码
和刚才的代码提示错误相同,IAR,MDK都提示&
在线时间1101 小时
威望1950 分
芯币10737 枚
E金币716 枚
TA的帖子TA的资源
IAR 试试这个:
和刚才的代码提示错误相同,IAR,MDK都提示
this declaration has no storage class or type specifier
把int buffer[NEST]改成 int buffer[]
IAR的扩展初始化只支持后一种形式。。。
[attachimg]195425[/attachimg]&
论坛测评队员
Powered by
逛了这许久,何不进去瞧瞧?vs中的路径宏问题,求高手指教
[问题点数:20分,结帖人feiwu]
vs中的路径宏问题,求高手指教
[问题点数:20分,结帖人feiwu]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年1月 C/C++大版内专家分月排行榜第二
2013年1月 C/C++大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。后使用快捷导航没有帐号?
查看: 291|回复: 3
新人欢迎积分1 阅读权限30积分205精华0UID帖子金钱498 威望0
Lv.3, 积分 205, 距离下一级还需 45 积分
UID帖子威望0 多玩草0 草
猫鼬打击是个充能技能,cd挡住了层数,现在想做个宏取消cd显示,showtooltip后面加了乱码,cd是不显示了,但是层数也不显示了,有没有什么命令能只去掉cd,不去掉层数,求大神指点
新人欢迎积分0 阅读权限30积分127精华0UID帖子金钱1646 威望0
Lv.3, 积分 127, 距离下一级还需 123 积分
UID帖子威望0 多玩草0 草
哦呵呵2 发表于
猫鼬打击是个充能技能,cd挡住了层数,现在想做个宏取消cd显示,showtooltip后面加了乱码,cd是不显示了, ...
CD? 冷却倒计时?
新人欢迎积分1 阅读权限30积分205精华0UID帖子金钱498 威望0
Lv.3, 积分 205, 距离下一级还需 45 积分
UID帖子威望0 多玩草0 草
一剑一诺 发表于
CD? 冷却倒计时?
对啊,现在想只取消cd显示,层数显示还想留着
新人欢迎积分1 阅读权限30积分205精华0UID帖子金钱498 威望0
Lv.3, 积分 205, 距离下一级还需 45 积分
UID帖子威望0 多玩草0 草
多玩的大神都在哪里
需要金钱:1100
Powered by
手机盒子客户端点击或扫描下载查看: 1392|回复: 11
录制宏的问题,请高手帮忙
阅读权限20
在线时间 小时
我的一个表里有多个工作表,其中Sheet10负责导入WEB查询,但是它不是常用的工作表,常用的工作表Sheet1里的数据从Sheet10得到。于是我录制了一个宏,在Sheet10理进行数据刷新操作,然后Sheet1里做了一个控件把代码复制进去后点击控件没有实现数据刷新。请问:我这样得到的宏代码有问题还是实现不了Sheet1理进行刷新Sheet10的数据操作?
阅读权限100
在线时间 小时
回复 1楼 jeavons 的帖子
楼主问的问题太难回答了!
最好是上传附件,别人才好帮你查找问题的症结所在!离开望、闻、问、切四大法宝,神医也很难回答这样的问题!::o
阅读权限50
在线时间 小时
原帖由 lu_zhao_long 于
21:34 发表
楼主问的问题太难回答了!
最好是上传附件,别人才好帮你查找问题的症结所在!离开望、闻、问、切四大法宝,神医也很难回答这样的问题!::o
说的好,诊断Excel问题真的像老中医看病[em07]
阅读权限20
在线时间 小时
谢谢你,请看附件:
21:50 上传
点击文件名下载附件
144.11 KB, 下载次数: 13
阅读权限20
在线时间 小时
回复 3楼 amolin 的帖子
谢谢你们的热心,论坛限制附件大小,删了不少。:handshake :handshake
阅读权限100
在线时间 小时
原帖由 jeavons 于
21:50 发表
谢谢你,请看附件:
你的按钮控件没有指定运行的宏!
阅读权限20
在线时间 小时
回复 6楼 lu_zhao_long 的帖子
那就是代码有问题了,请问修改代码后能不能达到我的目的?肯请高手帮忙修改一下,VBA我一窍不通。
阅读权限20
在线时间 小时
lu_zhao_long 老师还在吗?
阅读权限20
在线时间 小时
高手帮忙一下,:handshake :handshake
阅读权限100
在线时间 小时
回复 8楼 jeavons 的帖子
我在Sheet1下将你的 VBA 代码简单改了一下,请楼主试一下看:
Sub Macro5()
' Macro5 Macro
' &ê&O&E ·&&C&N&¨&O° &A¼&O&AE&&&E±¼&:
& & 'Range(&BO421&).Select
& & Sheets(&Sheet1&).Range(&I478&).Select
& & Selection.QueryTable.Refresh BackgroundQuery:=False
Private Sub CommandButton1_Click()
Call Macro5
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师

参考资料

 

随机推荐