搜索
bottom↓
回复: 25

如何定义一个数组,可以进行16位数组元素操作,8位调用

[复制链接]

出0入0汤圆

发表于 2013-6-7 18:56:32 | 显示全部楼层 |阅读模式
本帖最后由 qingyin2009 于 2013-6-7 20:19 编辑

数据是16位数据,但是要分开传送,单个字节用联合体就好,数组不知道怎么用       

就是想用一种方法,既可以进行8位数组元素操作,又可以16位数组元素操作,8位数组的每两个字节组成一个16位字,分别操作都能改变数据。

联合是这样定义的:
typedef        union  {
        words                bit_t;
        uint8        byte[2];
        uint16        word;                        
        } Typ_IOW;

函数是这样的格式:SendFrock_Start(uint8 a[]);

我现在这样定义:Typ_IOW ReWidthData[8];

中间需要对16位数组元素进行赋值操作,然后

这样调用 :SendFrock_Start(&ReWidthData[0]);

但事实是,出来的数据都是00

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2013-6-7 19:06:36 | 显示全部楼层
不是很明白   

出0入0汤圆

发表于 2013-6-7 19:08:20 | 显示全部楼层
union
联合联合联合联合联合联合联合联合

出0入0汤圆

发表于 2013-6-7 19:38:38 | 显示全部楼层
强制类型转换不可以吗   low=char(int) high = char(int>>8)

出0入0汤圆

 楼主| 发表于 2013-6-7 20:18:13 | 显示全部楼层
本帖最后由 qingyin2009 于 2013-6-7 20:19 编辑
365mcu 发表于 2013-6-7 19:06
不是很明白


重新编辑了一下,不知道能表达清楚不能

出0入0汤圆

 楼主| 发表于 2013-6-7 20:23:15 | 显示全部楼层
shandian 发表于 2013-6-7 19:08
union
联合联合联合联合联合联合联合联合

联合数组没怎么用过,网上貌似也没什么资料

出0入0汤圆

发表于 2013-6-7 21:10:26 | 显示全部楼层
顶一下,联合数组

出0入0汤圆

发表于 2013-6-7 21:12:31 | 显示全部楼层
你试下这样行不行。

typedef struct tag_BYTE_FILED
{
        unsigned char        low;
        unsigned char        high;
} BYTE_FILED;

typedef union
{
        unsigned int                word;
        BYTE_FILED                  byte;
} INT_BYTE_FIELD;

定义数组的时候:
INT_BYTE_FIELD test_array[];

以16位访问时:
test_array[x].word

以8位访问时:
test_array[x].byte.high
test_array[x].byte.low

出0入224汤圆

发表于 2013-6-7 21:15:06 | 显示全部楼层
数组的话就用指针

出0入0汤圆

发表于 2013-6-7 21:15:37 | 显示全部楼层
实验了一下
貌似这样是可以的
SendFrock_Start(Typ_IOW a[]);
SendFrock_Start(Typ_IOW a[]){
uint16 tmp;
uint8 t1,t2;
tmp = a[4].word;
t1 = a[4].byte[0];
t2 = a[4].byte[1];
return 0;
}

出0入0汤圆

发表于 2013-6-7 21:17:46 | 显示全部楼层
在MAIN里面给数组的某个成员赋值比如ReWidthData[4].word = 11111;然后调用这个函数,在临时变量窗口里面可以看到tmp,t1,t2的值是显示的
不知道楼主要的是不是这样的

出0入0汤圆

发表于 2013-6-7 21:18:38 | 显示全部楼层
补充一下调用是这样的SendFrock_Start(ReWidthData);

出0入0汤圆

发表于 2013-6-7 21:20:36 | 显示全部楼层
或者直接传送地址比如SendFrock_Start(&ReWidthData[4]);
然后函数中就要这样变化
tmp = a[0].word;
t1 = a[0].byte[0];
t2 = a[0].byte[1];
则得到的是ReWidthData[4]的值了
是这样吗?

出0入0汤圆

 楼主| 发表于 2013-6-7 23:06:08 | 显示全部楼层
shandian 发表于 2013-6-7 21:12
你试下这样行不行。

typedef struct tag_BYTE_FILED

这是一个一个用,我是想对整个数组一下传递过去,用指针好像没法传递

出0入0汤圆

 楼主| 发表于 2013-6-7 23:09:46 | 显示全部楼层
本帖最后由 qingyin2009 于 2013-6-7 23:12 编辑
xiaobendan001 发表于 2013-6-7 21:20
或者直接传送地址比如SendFrock_Start(&ReWidthData[4]);
然后函数中就要这样变化
tmp = a[0].word;


这样是能实现,不过我这个函数是因为既要调用8位数据,还要调用16位,你这样是改成16位了

这个函数是一个发送数据函数,调用是通过8位调用,主要是其他地方也有调用这个函数,而且传递的是8位的,要改兼容的话也是能实现,我只是感觉有更简单的办法,不改变原来函数,改变数据定义

出0入93汤圆

发表于 2013-6-8 06:30:37 | 显示全部楼层
数据类型都不匹配,玩编译器呢。
规矩点,这样访问:
  1. SendFrock_Start(ReWidthData[0].byte);
复制代码
变态点,这样访问(极其不推荐!):
  1. SendFront_Start((uint8*)&ReWidthData[0]);
复制代码

出0入93汤圆

发表于 2013-6-8 06:37:47 | 显示全部楼层
qingyin2009 发表于 2013-6-7 23:09
这样是能实现,不过我这个函数是因为既要调用8位数据,还要调用16位,你这样是改成16位了

这个函数是一 ...

搞不明白你的意图究竟是什么。用我上面所说的第二种方法,强制转换成uint8*的类型(注意不能强制转换成uint8[]类型),一切问题就解决了。但是毕竟uint8*和uint8[]是有差别的(事实上作为C语言函数的参数,它们内部实现上是没有任何差别的),有的编译器可能会报错。

出0入0汤圆

发表于 2013-6-8 07:47:44 来自手机 | 显示全部楼层
定义数组为16 位,读出后赋给联合体变量,最后想怎么用就怎么用。

出0入0汤圆

发表于 2013-6-8 18:45:13 | 显示全部楼层
我看起来是可以按8位来读的啊
只是访问起来比较麻烦
你可以定义一个指针是CHAR型的,然后把联合数组的首地址给他,这样是不是就是你所要实现的了?
uchar *ppp;
ppp =  ReWidthData;   //这句会报告警告信息但是可以用
然后这样用,用循环啥的都可以,是数组方式,很方便
t1 = ppp[8];
t2 = ppp[9];
或者这样
ppp += 8;
t1 = *ppp;
ppp++;
t2 = *ppp;
也可以啊,搞不懂你想怎样

顺便问一下怎么输入代码那种排列整齐的,就是TAB有效的那种?

出0入0汤圆

发表于 2013-6-8 18:46:22 | 显示全部楼层
代码复制测试:
  1. SendFrock_Start(Typ_IOW a[]){
  2. uint16 tmp;
  3. uint8 t1,t2;
  4. tmp = a[4].word;
  5. ppp += 8;
  6. t1 = *ppp;
  7. ppp++;
  8. t2 = *ppp;
  9. return 0;
  10. }
复制代码

出0入0汤圆

发表于 2013-6-8 18:46:47 | 显示全部楼层
懂了,哈哈,真方便啊

出0入0汤圆

发表于 2013-6-8 21:22:03 | 显示全部楼层
指针加类型转换就可以了,不建议用联合

出0入0汤圆

发表于 2013-6-8 23:15:14 来自手机 | 显示全部楼层
强制类型转换不行吗?

出70入0汤圆

发表于 2013-6-9 18:51:13 | 显示全部楼层
8楼正解!学习了!

出0入0汤圆

 楼主| 发表于 2013-6-9 19:22:33 | 显示全部楼层
本帖最后由 qingyin2009 于 2013-6-9 19:47 编辑

回复xiaobendan001:这样不能一下调用所有数组元素,如果数据少了还好,数据多了就麻烦了

今天让我师傅看了下程序,这样就行了:SendFrock_Start((uint8 *)&ReWidth)

貌似是我表达的不明白,   ReWidth为16位数组,而函数只能支持8位数据指针,单片机是8位的,用强制类型转换为8位指针,直接传递16位数据的8位RAM首地址。

谢谢大家,下面贴出来部分代码:

数据类型之联合体定义
  1. typedef        union  {
  2.         uint16        word;       
  3.         uint8        byte[2];       
  4.         } Typ_IOW;
复制代码
数据类型之结构体定义:
  1. typedef struct{
  2.         Typ_IOW ms9;
  3.         Typ_IOW        ms4_5;
  4.         Typ_IOW        LowMax;
  5.         Typ_IOW        LowMin;
  6.         Typ_IOW        Data0Max;
  7.         Typ_IOW        Data0Min;
  8.         Typ_IOW        Data1Max;
  9.         Typ_IOW        Data1Min;
  10. } Typ_ReWidth;
复制代码
数据之结构体联合数组定义
  1. static Typ_ReWidth ReWidth ;
复制代码
数据操作之各数据按字访问
  1. ReWidth.LowMax.word = 1;
  2.         ReWidth.LowMin.word = 2;
  3.         ReWidth.Data1Max.word = 3;
  4.         ReWidth.Data1Min.word = 0xff;
复制代码
函数之调用8位数组地址作参数 :
  1. void SendFrock_Start(uint8 a[])
复制代码
数据操作之16位结构体联合数组按8位数据调用
  1. SendFrock_Start((uint8 *)&ReWidth);
复制代码
汇报完毕,不知各位看官懂了没

出0入0汤圆

 楼主| 发表于 2013-6-9 19:52:16 | 显示全部楼层
本帖最后由 qingyin2009 于 2013-6-9 19:56 编辑

貌似搞的复杂了点,简单点就不用什么联合,结构体了,直接定义一个16位数组就好,然后22楼所说的强制转换一下就好。

不过这样的好处是,随意性很强,拿过来数据随便玩,那个联合类型定义里面再用上位定义,就是随便用了,如果想高级的还可以搞上32位,64位神马的,一起赋值可能要麻烦些,因为有联合
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-3 09:07

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

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