返回   cpper编程论坛 > C/CPP/TMP/GP
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2005-04-10
yumagi 的头像
高级会员
 
注册日期: 2003-06-09
住址: 上海
帖子: 314
yumagi 正向着好的方向发展
发送 MSN 消息给 yumagi
默认 C语言里有没有什么magic macro可以把一种类型不支持数组的变成支

rt,一种类型不支持数组。有没有什么magic macro可以搞一下,然后看上去这种类型就支持数组了?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2005-04-11
高级会员
 
注册日期: 2002-09-19
帖子: 840
文章: 7
tomato 正向着好的方向发展
默认

sigh,好久没看cpp,现在连标题都看不懂了……
不支持数组是指不支持vector吧?也就是说不支持copy ctor吧
可不可以写个类封装一下,实现一个copy ctor

不过我觉得如果一个类不支持数组,肯定是有特殊的语义在里面
你能否给个具体的例子
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #3 (permalink)  
旧 2005-04-11
高级会员
 
注册日期: 2002-09-19
帖子: 840
文章: 7
tomato 正向着好的方向发展
默认

晕,看错了
是c语言……

c语言什么类型不支持数组?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #4 (permalink)  
旧 2005-04-11
cat cat 当前离线
高级会员
 
注册日期: 2003-11-06
帖子: 1,563
文章: 6
cat 正向着好的方向发展
默认

偶也没看懂~~~
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #5 (permalink)  
旧 2005-04-11
yumagi 的头像
高级会员
 
注册日期: 2003-06-09
住址: 上海
帖子: 314
yumagi 正向着好的方向发展
发送 MSN 消息给 yumagi
默认

cat起的好早啊。
嗯,是这样的。我们现在要在51系列的单片机上写一点程序。
他们里面有种类型是bit/sbit类,可以位寻址。相当于只改某个变量的某个位。
代码:
unsigned char output_sel; sbit led_1 = output_sel^5;
然而比较BT的是,这种sbit不支持数组,写起来不太爽。
so....
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #6 (permalink)  
旧 2005-04-11
cat cat 当前离线
高级会员
 
注册日期: 2003-11-06
帖子: 1,563
文章: 6
cat 正向着好的方向发展
默认

macro? 好像…… 用macro应该可以做到这个:
GET_BIT(led, 1);
SET_BIT(led, 1);
CLEAR_BIT(led, 1);
但应该比较难做到
GET_BIT(led, i);
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #7 (permalink)  
旧 2005-04-11
polyrandom 的头像
超级版主
 
注册日期: 2002-09-03
帖子: 3,138
文章: 20
polyrandom 正向着好的方向发展
默认

说实话,昨天我来这里,看到这个帖子,我也看不懂,当时就下去擦眼泪了。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #8 (permalink)  
旧 2005-04-11
Eric 的头像
普通会员
 
注册日期: 2003-05-09
帖子: 61
Eric 正向着好的方向发展
默认

引用:
作者: yumagi
cat起的好早啊。
嗯,是这样的。我们现在要在51系列的单片机上写一点程序。
他们里面有种类型是bit/sbit类,可以位寻址。相当于只改某个变量的某个位。
代码:
unsigned char output_sel; sbit led_1 = output_sel^5;
然而比较BT的是,这种sbit不支持数组,写起来不太爽。
so....
如果我没记错(当然首先是也没理解错 )的话,这些都是位寻址区的字节各位的映射,你用那整个字节不就差不多是位数组了?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #9 (permalink)  
旧 2005-04-11
yumagi 的头像
高级会员
 
注册日期: 2003-06-09
住址: 上海
帖子: 314
yumagi 正向着好的方向发展
发送 MSN 消息给 yumagi
默认

引用:
作者: PolyRandom
说实话,昨天我来这里,看到这个帖子,我也看不懂,当时就下去擦眼泪了。
…………………………
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #10 (permalink)  
旧 2005-04-11
yumagi 的头像
高级会员
 
注册日期: 2003-06-09
住址: 上海
帖子: 314
yumagi 正向着好的方向发展
发送 MSN 消息给 yumagi
默认

引用:
作者: Eric
引用:
作者: yumagi
cat起的好早啊。
嗯,是这样的。我们现在要在51系列的单片机上写一点程序。
他们里面有种类型是bit/sbit类,可以位寻址。相当于只改某个变量的某个位。
代码:
unsigned char output_sel; sbit led_1 = output_sel^5;
然而比较BT的是,这种sbit不支持数组,写起来不太爽。
so....
如果我没记错(当然首先是也没理解错 )的话,这些都是位寻址区的字节各位的映射,你用那整个字节不就差不多是位数组了?
用整个字节当然可以,可是如果我要一次修改字节里的某几个位,就会不太方便,也不是很直观。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #11 (permalink)  
旧 2005-04-11
bankrock 的头像
高级会员
 
注册日期: 2003-12-11
帖子: 847
文章: 7
bankrock 正向着好的方向发展
默认

其实单片机用C语言是不大好操控单个位,不如用汇编写个子函数来执行查找和修改位。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #12 (permalink)  
旧 2005-04-11
cat cat 当前离线
高级会员
 
注册日期: 2003-11-06
帖子: 1,563
文章: 6
cat 正向着好的方向发展
默认

en... 如果不考虑你那个什么sbit类型的话,用宏道是能做到
GETBIT(n, i), SETBIT(n, i)这类东西

为什么汇编好?汇编里难道有这样的指令?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #13 (permalink)  
旧 2005-04-11
Eric 的头像
普通会员
 
注册日期: 2003-05-09
帖子: 61
Eric 正向着好的方向发展
默认

引用:
作者: yumagi
引用:
作者: Eric
引用:
作者: yumagi
cat起的好早啊。
嗯,是这样的。我们现在要在51系列的单片机上写一点程序。
他们里面有种类型是bit/sbit类,可以位寻址。相当于只改某个变量的某个位。
代码:
unsigned char output_sel; sbit led_1 = output_sel^5;
然而比较BT的是,这种sbit不支持数组,写起来不太爽。
so....
如果我没记错(当然首先是也没理解错 )的话,这些都是位寻址区的字节各位的映射,你用那整个字节不就差不多是位数组了?
用整个字节当然可以,可是如果我要一次修改字节里的某几个位,就会不太方便,也不是很直观。
为什么不直观?不知道你那个51编译器可不可以这样,
代码:
a_byte |= 0x3; /* 0位1位置位 */ a_byte &= 0x3; /* 其他位置零 */
a_byte又不一定要是可位寻址,你要异或也一样。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #14 (permalink)  
旧 2005-04-11
yumagi 的头像
高级会员
 
注册日期: 2003-06-09
住址: 上海
帖子: 314
yumagi 正向着好的方向发展
发送 MSN 消息给 yumagi
默认

这样是可以啦。不过这样总不如数组来的方便,比如我只要控制一个byte中的某几位,这个某几位可能是需要编程可控,而且这几位每一位的结果,都是需要经过计算比较,才能获得。这种按位与/或的方法就不是很方便了。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #15 (permalink)  
旧 2005-04-11
yumagi 的头像
高级会员
 
注册日期: 2003-06-09
住址: 上海
帖子: 314
yumagi 正向着好的方向发展
发送 MSN 消息给 yumagi
默认

引用:
作者: cat
en... 如果不考虑你那个什么sbit类型的话,用宏道是能做到
GETBIT(n, i), SETBIT(n, i)这类东西

为什么汇编好?汇编里难道有这样的指令?
哦?怎么做,说说看。
汇编可能比较好控制吧,51系列的指令我也不太清楚。bankrock做过?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #16 (permalink)  
旧 2005-04-11
Eric 的头像
普通会员
 
注册日期: 2003-05-09
帖子: 61
Eric 正向着好的方向发展
默认

呵呵,位域,不知支持否?地址是连续的,用宏裹点51汇编应该可以达到要求。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #17 (permalink)  
旧 2005-04-11
cat cat 当前离线
高级会员
 
注册日期: 2003-11-06
帖子: 1,563
文章: 6
cat 正向着好的方向发展
默认

SET 不就是 (n |= (1 << i)) 啊,不过这种CPU估计移位效率高不了……
如果移i位等于i次移1位,那么试试看(n |= bits[i]),浪费8个byte.
不过如果读内存还不如移i位快就免了 这类CPU,估计也不会有太多cache :P

CLEAR嘛 (n &= ~(1 << i))
FLIP: (n ^= (1 << i))
GET: ((n & (1 << i) != 0)

如果直接有指令来设置、清除、测试第i位当然还是指令好
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #18 (permalink)  
旧 2005-04-12
普通会员
 
注册日期: 2003-12-16
帖子: 49
ZiDing 正向着好的方向发展
默认

51系列以前在学校的时候玩过,我记得好像支持RX0,RX1,RX2(抱歉太久了记不清了)这样来引用寄存器的位的啊。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #19 (permalink)  
旧 2005-04-12
Eric 的头像
普通会员
 
注册日期: 2003-05-09
帖子: 61
Eric 正向着好的方向发展
默认

引用:
作者: ZiDing
51系列以前在学校的时候玩过,我记得好像支持RX0,RX1,RX2(抱歉太久了记不清了)这样来引用寄存器的位的啊。
不是的,要取当前R0~R7的某个位,除了向cat那样,一般是把整个字节mov到位寻址区,再到位映射区里取。而汇编书写上一般可以传给A,用类似A.4之类的记法(大约是这样,毕业后再没用过51,差不多还给老师了 )。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #20 (permalink)  
旧 2005-04-12
bankrock 的头像
高级会员
 
注册日期: 2003-12-11
帖子: 847
文章: 7
bankrock 正向着好的方向发展
默认

51的汇编其实我也不太熟,我以前做的东西用的是motorola的单片机,而且是用纯C语言写的。

51一般有256字节的RAM。后128字节是用在IO,定时器等上的特殊存储器,前一百二十八位才是用户可控制的了。从00H-1FH是4个工作寄存器,20H-2FH是位寻址区,可以用来对单独位寻址,其他部分就是用户自己制定使用。有Mov c, bit和Mov bit, c两个指令可以处理位数据的转移,但是要注意c是加法时用的进位端,操作之前别忘了push进栈保存,等完成了在pop出来。

c里结合汇编我以前没做过,可能会不小心把原来的数据搞乱。比如原来程序就在20H-2FH的区域内存了数据,或者栈指针没设好,把原来数据给盖了。最好找个高手来问问。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9。现在的时间是 09:02 AM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2009,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0