1

这是针对 MPLABXC8 编译器的,我已经研究并发现了许多相关主题。但无法解决我的问题。我的数组类型定义

     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 个元素是可访问的。编译器还抱怨结构指针传递给结构数组指针。我尝试在函数中添加指针。它似乎增加了整个 Array 指针。在我看来,这&CurOperPlan只是指向第 0 个索引结构的地址指针。整个数组不包含它。请帮忙。

4

3 回答 3

3

改变这个

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}};
于 2016-03-26T08:20:42.280 回答
1

在函数内部,您需要:

(*CurTransportPlan)[0].DevID1=5;  // This is Ok
(*CurTransportPlan)[1].DevID1=5;

这是因为CurTransportPlan指向您的数组的指针。所以你必须取消引用它才能得到数组。然后您可以将数组索引应用于数组。

链接到工作示例


为了解释为什么第一个似乎有效,我们可以重写应用等价变换X->Y=(*X).YX[N]=的代码*(X+N)

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


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

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

  2. 您可以像当前所做的那样将指针传递给整个数组。

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

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

您要做出的决定是您是否希望编译器在前两点给出错误。这些错误可以通过强制转换来避免,但一般来说,需要强制转换表明另一种方法会是更好的设计。

如果此函数仅与 size- 3 volatilearray 一起使用,那么恕我直言,您当前的方法是最好的方法,调用最大的编译器检测错误。

于 2016-03-26T08:31:46.213 回答
-1

因为你有一个三元素数组的 typedef:

typedef volatile struct OneStageOpTag {
  // ...
} OneStageOpType[3];

问题看起来是:

void GetOperationSeqForTransportReq(
  StationIDType SourseStnID,
  StationIDType DestiStnID,
  OneStageOpType *CurTransportPlan)       // HERE

在上面的函数中,您将参数声明为指向 3 元素数组的指针,但您应该将其作为指向数组第一个元素的指针传递。这意味着您应该改为执行以下操作:

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      
}

这应该适合你:)

于 2016-03-26T07:34:54.747 回答