【问题标题】:How to send the properties of a struct array as a parameter to a function in C?如何将结构数组的属性作为参数发送给 C 中的函数?
【发布时间】:2018-11-27 17:05:17
【问题描述】:

所以这是我的问题。

我有一个具有一些属性的结构:

struct foo {
  const uint8_t propertyA;
  int propertyB;
  const int propertyC;
  typeX propertyD;
  typeY propertyE;
};

然后我创建这个结构的数组,因为我必须表示对象 foo 的多个实例:

const int foosQuantity = 8;
struct foo foos[foosQuantity] = 
   {{ .propertyA=0b11001100, .propertyB=0, .propertyC=140, ...},
   { .propertyA=0b11001000, .propertyB=0, .propertyC=150 ...},  

          //*** foosQuantity-3 MORE TIMES ***//

   { .propertyA=0b11001000, .propertyB=0, .propertyC=150 ...}}

到目前为止,一切似乎都正常。但是,我还没有想出如何将一种类型的属性的数组发送到函数。例如,我在一个外部库中编写了这个函数,该库采用一组属性A:

void myFunc(const uint8_t *propertyAs, sizeArray){

    //*** DO STUFF ***//

}

我想直接发送我的结构的属性,而不必使用循环遍历结构数组并复制元素的 for 循环。

int main(){

  //*** STUFF ***//

  myFunc(foos.propertyA, foosQuantity); 

  //*** MORE STUFF ***//

  return 0;
}

这可能吗?

【问题讨论】:

  • 您可能希望避免复制循环;很遗憾,你的愿望不会实现。仅传递结构数组的 propertyN 元素没有明智的、可支持的方式。但是不要忘记,传递一个数组很便宜。只有一个指针被传递给函数。
  • 那些const 成员意味着您无法使用malloc() 有效地动态分配您的结构——您可以使用calloc(),但值将为零并且无法更改。这可能不是你想要的。

标签: c arrays struct


【解决方案1】:

如果整个 struct 数组已经存在于程序的内存中,那么您不会比只传递指向数组开头的指针、数组的长度(以元素为单位)以及在 @987654321 上迭代更有效@数组成员:

void bar(struct foo *p, size_t len)
{
    size_t i;
    for(i = 0; i < len; i++)
    {
        dosomething(p[i].propertyA);
    }
}

如果您受分配规范的限制,只能将propertyA 数组(即uint8_t)传递给您的函数,则必须将它们从struct foo 数组中复制出来;没有办法。

【讨论】:

  • 问题是我没有编写函数“myFunc()”,它来自外部库。但是我确实可以访问源代码,所以我想最好的办法是重新编写 myFunc() 以使其采用您编写的 struct foo 类型的指针。
  • @Alexis 您也可以采用我提到的后一个选项,并隔离 propertyA 值。
【解决方案2】:

这是不可能的。

你可以

  1. 使用只有 propertyA 的并行数组,该数组在 foo 数组旁边进行操作。
  2. 或者创建一个 propertyA 数组,然后将其复制回 foo 数组中。

选项 1 内存效率最高,因为它需要的内存最少,但可能需要您重写大量代码。

选项 2 需要的代码返工最少,但需要更多的内存和时间。

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2023-01-10
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    相关资源
    最近更新 更多