Как отправить свойства массива структуры в качестве параметра функции в C? - PullRequest
0 голосов
/ 27 ноября 2018

Итак, вот моя проблема.

У меня есть структура, которая имеет некоторые свойства:

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

Затем я создаю массив этой структуры, так как я должен представлять несколько экземпляровobject 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 ...}}

До сих пор все, кажется, работает.Однако я не понял, как отправить массив свойств одного типа в функцию.Например, я написал эту функцию в библиотеке extern, которая принимает массив свойств A:

void myFunc(const uint8_t *propertyAs, sizeArray){

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

}

И я хотел бы отправить свойства моей структуры напрямую, без необходимости использовать цикл for, который выполняет итерациюмассив struct и копирует элементы.

int main(){

  //*** STUFF ***//

  myFunc(foos.propertyA, foosQuantity); 

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

  return 0;
}

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Это невозможно.

Вы можете либо

  1. Использовать параллельный массив с просто свойством A, которым манипулируют вдоль массива foo.
  2. Илисоздайте массив propertyA, а затем скопируйте его обратно в массив foo.

Вариант 1 является наиболее эффективным с точки зрения памяти, поскольку он требует наименьшего количества памяти, но может потребовать от вас переписать большую часть кода.

Вариант 2 требует наименьшего количества переделки вашего кода, но требует больше памяти и времени.

0 голосов
/ 27 ноября 2018

Если весь массив struct уже существует в памяти вашей программы, вы не станете более эффективным, чем просто передать указатель на начало массива, длину массива (в элементах) и выполнить итерацию на propertyA члены массива:

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;Обойти это невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...