для вызова функции нужна структура с подструктурой - PullRequest
0 голосов
/ 24 мая 2018

Я не знаю, действительно ли мой заголовок понятен (я не знаю, как его назвать), но не берите в голову.У меня есть функция с подструктурой в параметре.Я использовал структуру в основном, но не в функции из-за бесполезных данных внутри этой функции.Моя программа выглядит так:

typedef struct vidinfo_s {
      vidframe_s sVid;
      int id;
      [...]
};

typedef struct vidframe_s {
      int phyAddr[3];
      char *virAddr[3];
      [...]
};

int function (vidframe_s *pVid)

Мой вопрос таков: мне нужно вызвать функцию типа int callVidInfo(vidinfo_s *pVid), но я не знаю, как это сделать с помощью подструктуры (как я назвал vidframe_s), поэтомуЕсть ли способ сделать это или я должен вызвать мою основную структуру в function?

1 Ответ

0 голосов
/ 24 мая 2018

Да, есть способ.Вы опубликовали очень мало кода, но, вероятно, вы ищете что-то под названием offsetof или containerof :

#include <stdlib.h>
#include <stddef.h>
#include <stdint.h>
#include <assert.h>

struct vidframe_s {
     int unused; 
};

struct vidinfo_s {
     struct vidframe_s sVid;
     int id; 
};

int callVidInfo(struct vidinfo_s * vidinfo) {
    assert(vidinfo->id == 5);
    return 0; 
}

int function(struct vidframe_s *pVid) {
     const size_t offsetofsVid = offsetof(struct vidinfo_s, sVid);
     struct vidinfo_s * const vidinfo = (struct vidinfo_s*)((char *)pVid - offsetofsVid);
     return callVidInfo(vidinfo); 
}

int main() {
    struct vidinfo_s var = { .id = 5 };
    return function(&var.sVid); 
}

Видите, что я там делал?Я взял смещение между struct vidinfo_s и его членом называется sVid.Затем я вычел смещение из pVid указателя (который должен указывать внутри struct vidinfo_s структуры), таким образом, я остался с указателем на struct vidinfo_s.

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