c-传递指向结构数组的指针



这是针对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).YX[N]=*(X+N)的代码。

数组表示法中正确的索引应该是CurTransportPlan[0][0].DevID1CurTransportPlan[0][1].DevID1;然而,您的代码在这两种情况下都交换了索引。这意味着第一个仍然有效,但第二个坏了。


关于您的代码设计:注意有两种方法可以将数组传递给函数:

  1. 您可以将指针传递到数组的第一个元素,正如alk所建议的那样(单独传递长度,或对其进行硬编码)

  2. 您可以像当前一样将指针传递到整个数组。

我将列出这两种设计之间的一些差异。使用您的设计,即指向整个阵列的指针:

  • 如果传递具有不同行数的数组,则会出现编译错误
  • 如果传递非易失性数组,则会出现编译错误
  • 您必须编写(*ptr)而不是ptr,后者稍微更详细一些

您要做的决定是,您是否希望编译器在前两点中给出错误。这些错误可以通过铸造来避免,但一般来说,需要铸造是另一种方法是更好设计的标志。

如果这个函数只用于大小为-3volatile的数组,那么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      
}

这对您来说应该很好:)

相关内容

  • 没有找到相关文章

最新更新