OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16479|回复: 13

关于结构体成员为二维数组时,并对其进行引用的操作

[复制链接]

24

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2012-3-21
在线时间
17 小时
发表于 2012-10-26 09:39:45 | 显示全部楼层 |阅读模式

有结构体

struct cmd_pattern
{
    unsigned int sign_start_high;

    unsigned int sign_start_low;  

    unsigned int sign_end_high;   

    unsigned int sign_end_low;   
    unsigned int cmd_contant[2][7];
};

//结构体变量初始化

struct cmd_pattern cmd_ram=  //cmd_ram初始化
{
   
    9024,4512,540,24414,540,540,540,540,
    {
        {68,2,0x83,0x55,0x90,0x6F,0},
        {68,2,0x83,0x55,0x90,0x6F,0}
    }

};


. . .

. . .

若一函数要用到结构体当中的cmd_contant数组

定义此函数时,如下书写其形参

unsigned char IR_Encode(unsigned int (*p)[7])
{
   ....;

   ....;
}

 

调用时实参如下书写:

IR_Encode ( & ( cmd_ram . cmd_contant+1 ) ) ;//把二维数组的1行的一维数组首地址传到形参。

 

但为什么会报错呢,找不到原因,请教。

 

 

 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

96

主题

762

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1228
金钱
1228
注册时间
2012-10-19
在线时间
15 小时
发表于 2012-10-26 10:45:03 | 显示全部楼层
用指针指向结构体成员。用指针比较好,看起来清晰,便于检查
回复 支持 反对

使用道具 举报

24

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2012-3-21
在线时间
17 小时
 楼主| 发表于 2012-10-26 12:01:44 | 显示全部楼层
回复【2楼】tian123chi:
用指针指向结构体成员。用指针比较好,看起来清晰,便于检查
---------------------------------
现在问题是要把结构体里面的二维数组的每一行(一行为一个一维数组)首地址传递到子程序。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-10-26 12:31:54 | 显示全部楼层
改为这样试试:unsigned char IR_Encode(unsigned int p[][7])
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-10-26 12:41:31 | 显示全部楼层
回复【楼主位】daiqh:
---------------------------------
你定义的是个二维数组,但是函数的形参却是个有7个变量的指针数组。
你把“unsigned char IR_Encode(unsigned int (*p)[7])”改成
“unsigned char IR_Encode(unsigned int (*p)[2])”应该就可以了。
喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

24

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2012-3-21
在线时间
17 小时
 楼主| 发表于 2012-10-26 12:44:28 | 显示全部楼层
回复【4楼】正点原子:
改为这样试试:unsigned char IR_Encode(unsigned int p[][7]) 
---------------------------------
原子老大终于出来
改成这样了:
函数原形:
void D02_Infrared_Encode ( unsigned int p[][7]);

调用时:
D02_Infrared_Encode(&(infrared_cmd_ram.cmd_contant));//传递二维数组第一行数的首地址。

还是出错
回复 支持 反对

使用道具 举报

24

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2012-3-21
在线时间
17 小时
 楼主| 发表于 2012-10-26 12:48:36 | 显示全部楼层
回复【5楼】爱吃水煮鱼:
回复【楼主位】daiqh: --------------------------------- 你定义的是个二维数组,但是函数的形参却是个有7个变量的数组。 你把“unsigned char IR_Encode(unsigned int (*p)[7])”改成 “unsigned char IR_Encode(unsigned int (*p)[2])”应该就可以了。
---------------------------------
(*p)[2]:p就是指向含有2个元素的一维数组的指针变量了,不对的。现在是7个元素.
回复 支持 反对

使用道具 举报

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-10-26 12:52:46 | 显示全部楼层
你这里的一个元素就是“一维”啊。 你改改试试,还报错吗?
喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

24

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2012-3-21
在线时间
17 小时
 楼主| 发表于 2012-10-26 13:05:37 | 显示全部楼层
回复【8楼】爱吃水煮鱼:
你这里的一个元素就是“一维”啊。 你改改试试,还报错吗?
---------------------------------
 实参写得有点问题,应该是( & ( cmd_ram . cmd_contant)+1 )。如果是取第二行的首地址。但问题不在此 。
我理解没错吧,也试了,出错
回复 支持 反对

使用道具 举报

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-10-26 14:02:24 | 显示全部楼层

我用MSP430+IAR写了个测试的程序,显示用串口打印。
struct cmd_pattern
{
  unsigned char sign_end_low;
  unsigned char cmd_contant[2][7];
};

int main(void)
{
……
struct cmd_pattern cmd_ram=  //cmd_ram初始化
    {
      0x00,
      {
        {0x10,0x11,0x12,0x13,0x14,0x15,0x16},
        {0x20,0x21,0x22,0x23,0x24,0x25,0x26}
      }

    };
……
test(&(cmd_ram.cmd_contant[0]));//测试函数
}
……
//SendByte()函数为打印一个十六进制的数。
void test(unsigned char (*tp)[7])
{
  SendByte((*tp)[0]);//0x10:第一维第一个
  SendByte((*tp)[1]);//0x11:第一维第二个
  SendByte(*tp[1]);//0x20:第二维第一个
  SendByte((*tp+1)[0]);//0x11:第一维第二个
  SendByte((*tp+1)[1]);//0x12:第一维第三个
}
之前我的理解有些问题,楼主的程序确实是实参有问题,不知问题解决了没有?怎么解决的?

喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

24

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2012-3-21
在线时间
17 小时
 楼主| 发表于 2012-10-26 14:07:17 | 显示全部楼层
回复【10楼】爱吃水煮鱼:
我用MSP430+IAR写了个测试的程序,显示用串口打印。struct cmd_pattern{  unsigned char sign_end_low;  unsigned char cmd_contant[2][7];};int main(void){……struct cmd_pattern cmd_ram=  //cmd_ram初始化    {      0x00,      {        {0x10,0x11,0x12,0x13,0x14,0x15,0x16},        {0x20,0x21,0x22,0x23,0x24,0x25,0x26}      }
    };……test(&(cmd_ram.cmd_contant[0]));//测试函数}……//SendByte()函数为打印一个十六进制的数。void test(unsigned char (*tp)[7]){  SendByte((*tp)[0]);//0x10:第一维第一个  SendByte((*tp)[1]);//0x11:第一维第二个  SendByte(*tp[1]);//0x20:第
......
---------------------------------
还没有呢,在调试
回复 支持 反对

使用道具 举报

24

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2012-3-21
在线时间
17 小时
 楼主| 发表于 2012-10-26 14:08:21 | 显示全部楼层
回复【10楼】爱吃水煮鱼:
我用MSP430+IAR写了个测试的程序,显示用串口打印。struct cmd_pattern{  unsigned char sign_end_low;  unsigned char cmd_contant[2][7];};int main(void){……struct cmd_pattern cmd_ram=  //cmd_ram初始化    {      0x00,      {        {0x10,0x11,0x12,0x13,0x14,0x15,0x16},        {0x20,0x21,0x22,0x23,0x24,0x25,0x26}      }
    };……test(&(cmd_ram.cmd_contant[0]));//测试函数}……//SendByte()函数为打印一个十六进制的数。void test(unsigned char (*tp)[7]){  SendByte((*tp)[0]);//0x10:第一维第一个  SendByte((*tp)[1]);//0x11:第一维第二个  SendByte(*tp[1]);//0x20:第
......
---------------------------------
这个实参问题改回来了,但不是现在讨论的问题的原因
回复 支持 反对

使用道具 举报

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-10-26 14:28:24 | 显示全部楼层
测试的程序已经可以运行出结果了。楼主要讨论的还有什么问题呢?
喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

24

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2012-3-21
在线时间
17 小时
 楼主| 发表于 2012-10-26 15:06:17 | 显示全部楼层
回复【13楼】爱吃水煮鱼:
---------------------------------
keil通过了,CVAVR未通过
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 20:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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