这是我当前项目中的头文件,其中定义了两个结构:
typedef struct{
unsigned char length;
unsigned char buffer[8];
unsigned char index;
} buffer;
typedef struct {
volatile unsigned char * SFR;
unsigned char risingEdges;
unsigned char fallingEdges;
unsigned char buffer[2];
buffer * b;
}port;
现在,当我调用此方法时,特殊功能寄存器的当前值(通过使用结构中的SFR指针)将插入缓冲区* b。
void portUpdate(port p){
bufferInsertItem(*p.SFR,*p.b);
**** More C code omitted
}
这是bufferInsertItem的实现
void bufferInsertItem(char i,buffer b){
b.buffer[b.index]=i;
b.index = b.index++%b.length;
}
我不确定,目前无法测试此嵌入式项目,但是在调用时是否应该真正取消引用缓冲区。我有点困惑,也是因为数组的名称已经是指向第一个元素的指针。那么*p.b
的真正值是多少?
bufferInsertItem(*p.SFR,*p.b);
我非常确定* p.SFR是特殊功能寄存器的实际值,但是* p.b是缓冲区或缓冲区中第一个元素的值吗?
使用问题中显示的代码,bufferInsertItem
的第二个参数是buffer b
,表示它是buffer
。
在呼叫bufferInsertItem(*p.SFR, *p.b)
中,p
是port
,并且其b
成员是buffer *
,即指向buffer
的指针。因此,*p.b
是buffer
,在给定其当前定义的情况下,这应该传递给bufferInsertItem
。
但是,这不太可能是所需的解决方案。根据其当前定义,bufferInsertItem
接收buffer
的value。即,它收到一份副本。顾名思义,它旨在更改缓冲区,但只能更改副本,而不会在原始副本中创建任何更改。要解决此问题,应将参数类型更改为buffer *b
,以便传递指针。为了将bufferInsertItem
用作指针而不是结构,需要在b
内部进行相应的更改,然后调用应传递p.b
,而不是*p.b
。
在评论中说,声明void portUpdate(port p)
应该更改为void portUpdate(port *p)
,但这对于使bufferInsertItem
起作用不是必需的。当传递portUpdate
的副本时,该副本包含成员p
,该成员是指向原始buffer *b
的指针,因此可以通过调用buffer
修改原始缓冲区。但是,出于效率的考虑,即使通过值传递也可以通过地址传递结构,这是出于效率的考虑(用于传递单个地址的空间要小于传递整个结构的空间)。因此可以将bufferInsertItem(*p.SFR, p.b)
修改为void portUpdate(port p)
,并在其他代码中进行相应的更改。
void portUpdate(port *p)
的使用不涉及数组,因此目前尚不清楚为什么这个问题询问数组。可能已经为buffer
的数组分配了内存,并且buffer
设置为指向该数组的第一个p.b
。但是,必须为参数buffer
提供一个参数buffer b
,而不是指向缓冲区的指针。