这是针对MPLABXC8编译器的我研究了很多相关的话题。但无法解决我的问题。我的阵列typedef
typedef volatile struct OneStageOpTag
{
unsigned DevID1: 4;
unsigned SetCmd1 : 4;
unsigned RdyResponse1 :4;
unsigned DevID2: 4;
unsigned SetCmd2 : 4;
unsigned RdyResponse2 :4;
unsigned DevID3: 4;
unsigned SetCmd3 : 4;
unsigned RdyResponse3 :4;
}OneStageOpType[3];
现在我的变量
OneStageOpType CurOperPlan={0};// I checked this one -
//-in Simulator 3 element array of structure created
现在我正在将指针传递给我的函数
GetOperationSeqForTransportReq(1,1,&CurOperPlan);
下面是的功能
void GetOperationSeqForTransportReq(StationIDType SourseStnID,StationIDType DestiStnID,
OneStageOpType *CurTransportPlan)
{
NOP();
CurTransportPlan[0]->DevID1=5; // This is Ok
CurTransportPlan[1]->DevID1=5; // This is Not working
}
只有第0个元素是可访问的。编译器还抱怨结构指针传递给了结构数组指针。我试着在函数中增加指针。它似乎增加了整个数组指针。在我看来,&CurOperPlan
只是指向第0个索引结构的地址指针。整个数组不包含它。请帮忙。
更改此
GetOperationSeqForTransportReq(1,1,&CurOperPlan);
成为
GetOperationSeqForTransportReq(1, 1, CurOperPlan);
和这个
void GetOperationSeqForTransportReq(StationIDType SourseStnID,StationIDType DestiStnID,
OneStageOpType *CurTransportPlan)
成为这个
void GetOperationSeqForTransportReq(
StationIDType SourseStnID,
StationIDType DestiStnID,
OneStageOpType CurTransportPlan)
为了完整性,也更改此
OneStageOpType CurOperPlan={0};
成为
OneStageOpType CurOperPlan = {{0}};
在函数内部,您需要:
(*CurTransportPlan)[0].DevID1=5; // This is Ok
(*CurTransportPlan)[1].DevID1=5;
这是因为CurTransportPlan
是指向数组的指针。所以你必须取消引用它才能得到数组。然后可以将数组索引应用于数组。
链接到工作示例
为了解释为什么第一个似乎有效,我们可以重写应用等价转换X->Y
=(*X).Y
和X[N]
=*(X+N)
的代码。
数组表示法中正确的索引应该是CurTransportPlan[0][0].DevID1
和CurTransportPlan[0][1].DevID1
;然而,您的代码在这两种情况下都交换了索引。这意味着第一个仍然有效,但第二个坏了。
关于您的代码设计:注意有两种方法可以将数组传递给函数:
您可以将指针传递到数组的第一个元素,正如alk所建议的那样(单独传递长度,或对其进行硬编码)
您可以像当前一样将指针传递到整个数组。
我将列出这两种设计之间的一些差异。使用您的设计,即指向整个阵列的指针:
- 如果传递具有不同行数的数组,则会出现编译错误
- 如果传递非易失性数组,则会出现编译错误
- 您必须编写
(*ptr)
而不是ptr
,后者稍微更详细一些
您要做的决定是,您是否希望编译器在前两点中给出错误。这些错误可以通过铸造来避免,但一般来说,需要铸造是另一种方法是更好设计的标志。
如果这个函数只用于大小为-3
volatile
的数组,那么IMHO您当前的方法是最好的方法,调用最大限度的编译器错误检测。
因为您有一个由三个元素组成的typedef数组:
typedef volatile struct OneStageOpTag {
// ...
} OneStageOpType[3];
问题看起来是:
void GetOperationSeqForTransportReq(
StationIDType SourseStnID,
StationIDType DestiStnID,
OneStageOpType *CurTransportPlan) // HERE
在上面的函数中,您将参数声明为指向三元素数组的指针,但应该将其作为指向数组第一个元素的指针传递。这意味着您应该执行以下操作:
typedef volatile struct _OneStageOpTag {
// ...
} Array[3], Element;
// ...
Array CurOperPlan={0};
GetOperationSeqForTransportReq(1,1,&CurOperPlan);
// ...
void GetOperationSeqForTransportReq(StationIDType SourseStnID,
StationIDType DestiStnID, Element *CurTransportPlan)
{
NOP();
CurTransportPlan[0]->DevID1=5; // This is Ok
CurTransportPlan[1]->DevID1=5; // This is Not working
}
这对您来说应该很好:)