C语言中结构体数组名作为函数参数的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中结构体数组名作为函数参数的问题相关的知识,希望对你有一定的参考价值。
两个结构体如下:
struct rmc1207
int value;
int syntax;
int max_value;
int access;
int status;
char name[BUFFER_SIZE];
int var_oid[10];
;
struct rmc1207 ramp[BUFFER_SIZE]=//RMC1207 相位灯的控制部分
, , , , , ,,
, , , , , ,,
.
.
.
.
.
;
struct snmp_seq
int version;//版本号
int community[BUFFER_SIZE];//团体关键字
int command;//PUD类型
int reqid[BUFFER_SIZE];//请求标识
int errstat;//错误状态
int errindex;//错误索引
struct variable_list//绑定变量
int oid_name[BUFFER_SIZE];//OID值
int oid_len;//OID长度
int value_type;//变量值的类型
int value_len;//变量值的长度
int oid_value;//变量值的值
val;
sp;
下面是我编写的函数,我“如何调用上两个结构体的变量”完成如下函数?
int oid_check(?????????????????)
int flag=0;
int flag1=0;
int temp=0;
int i=0, j=0;
for(i=0;i<5;i++)
for(j=1+flag1;j<16;j++)
if(sp.val.oid_name[i+11]==ramp[j+0].var_oid[i+1])
flag=1;
temp=j;
if(sp.val.oid_name[i+10]!=ramp[temp+0].var_oid[i])
flag=0;
break;
else flag1=temp;
break;
flag=0;
if((flag==0)||(sp.val.oid_name[i+12]==0)) break;
return flag;
=============================================================
#define BUFFER_SIZE 1024
int oid_check(struct snmp_seq sp, struct rmc1207 ramp[], int BUFFER_SIZE);声明
flag=oid_check(sp, ramp, BUFFER_SIZE);调用
int oid_check(struct snmp_seq sp, struct rmc1207 ramp[], int BUFFER_SIZE)
;函数
错误提示:
1、error: array type has incomplete element type
2、error: expected ';', ',' or ')' before numeric constant
函数调用: flag=oid_check(sp, ramp, BUFFER_SIZE);
-------------------------------------------------------------------------------
在这里, ramp 是结构体数组的指针追问
error: expected ';', ',' or ')' before numeric constant
追答检查一下你的程序, 应该是有基本的语法格式问题, 改正就好啦. 因为你没有贴完整的程序, 也没能帮你看.
参考技术A两种方法:
函数声明:int oid(snmp_seq sp, rmc1207 ramp[], int size)
函数声明:int oid(snmp_swq sp, rmc1207 * ramp, int size)
两种方法实际上是一样的,数组在函数调用时会退化成指针,因此需要传入数组的大小,即int size。
调用: oid(sp, ramp, BUFFER_SIZE)即可。
函数声明中不能直接写BUFFER_SIZE,只能写size。
追问我补充了错误提示,请看下
追答函数声明中不能直接写BUFFER_SIZE,只能写size。
追问error: expected ';', ',' or ')' before numeric constant
参考技术B 函数声明:int oid(snmp_seq sp, rmc1207 ramp[], int size)函数声明:int oid(snmp_swq sp, rmc1207 * ramp, int size)
用 结构体地址 调用 结构体中元素 非常慢的问题,怎么解决?但就C语言,不说引用
用地址调用结构体元素中的很慢,怎么解决?
如:struct A
int num;
;
如果函数这样调用int fun(A* a)
那函数体里面就全都是 a->num,这样调用速度比int fun(A a)里面的a.num慢很多啊,在一个追求计算速度的程序里面应该怎么写?
你从哪里看出来传指针速度慢?是你自己代码写的有问题吧。
函数中参数为结构体数据时,有两种处理方式:
1.传递结构体指针。
2.传递结构体副本。
在sum函数中创建所传递的结构体的副本,即将结构体的数据成员完全赋值给node.
优缺点:
1.指针传递速度快,效率高,消耗存储空间小,但是无法保护数据不被修改,可以添加const 参数进行限制.
2.副本传递,效率较低,消耗存储空间大,可以保护数据不被修改,适合于数据成员少而简单的结构体。
真的慢,骗你对我有什么好处,附图,真心求教
这是示例代码,做一样的事,后面是计时
你不怎么早把代码贴出来。
慢的主要原因,是因为你进行了大量的计算,每一次计算都要对结构体里面的成员进行操作。
这样解释一下吧,我们通常说传变量指针比传变量要快,指着是【函数调用】这个过程,也就是说从上下文从 调用函数 切换到 被调用函数 的过程。如果你传指针,只是穿一个地址过去,一般为4字节(32位计算机),而传一个结构体的变量通常要大于4字节,而且是远大于。对于你这样的设计,也就是
int num;
;
是很少见的。因为这没必要。
上面说的快指的就是传值的快慢了。(这就相当于送信。一个是直接通过电子邮件把信的内容告诉别人了,而另一个还要快递员把信过去)
但在你的程序中,为什么传指针反倒比传值慢呢?
正如开头就说了,你进行了大量的计算,每一次计算都要对结构体里面的成员进行操作。
这样为什么慢呢,原因就在于传指针给 被调用函数 之后,被调用函数里的局部变量
也就是a实际上是一个指针,它指向了这个结构体。但是,如果你想操作这个结构体的变量,必须要进行解引用,也就是 (*a). 这样一个操作,这个操作在cpu看来,就是知道某个变量的地址存在哪里,cpu得到这个地址上去才能找这个变量实际所处的地址。
这里可能有点混乱,注意理解指针的概念。
这样就增加了一个寻址的过程。
而如果是
int fun(A a)这里的a就代表着这个结构体的实际地址,那么通过a. 就可以直接使用结构体的成员了。这样就没有更多的寻址的过程。
传指针每一步操作都比传值多一步寻址操作,你循环了这么多次,自然就多了很多步,浪费了很多时间。那在上面说的函数调用时节省的时间自然就被抵消了。
所以就有传指针比传结构体更慢的结果。
我最开始的回答也说了,指针传递速度快,效率高,这个快是“传递”快,而不是计算快。
如果我的回答解决了你的问题,请采纳!你的采纳是我答题的动力!
如果有问题,请追问!
有没有好的设计经验可以传授一下吗?要是用链表就只可能把下级指针往里面传,传值每次还要复制一遍内存,不知道有没有更好的方法
以上是关于C语言中结构体数组名作为函数参数的问题的主要内容,如果未能解决你的问题,请参考以下文章
C 语言结构体 ( 结构体 数组 作为函数参数 | 数组 在 栈内存创建 )