Присвоение состава в C - PullRequest
0 голосов
/ 12 июля 2020

Следующая функция свертки , args передается указатель соответствующей структуры, а затем мне нужно назначить его другой структуре того же типа. Правильно ли назначать, как указано ниже, или требуется инициализировать память для фактических аргументов .

typedef struct
{
    int batchSize;
    int filters;
    int chan;
    int inSize;
    int kSize;
    int stride;
    float *padded_inp;
    float *kernal;
    float *conv_out;
    int convPad;
    int b; // IMAGE NUMBER
} compute_convFWD;

void *convolution(void *args)
{
    compute_convFWD *actual_args = args; // is this a correct assignment ?
    ...
}

Ответы [ 3 ]

1 голос
/ 12 июля 2020

Чтобы скопировать структуру, вы должны сделать (либо)

compute_convFWD *convolute(const void *args) {
    compute_convFWD *conv = malloc(sizeof *conv);
    if (!conv) return NULL; // Check malloc
    memcpy(conv, args, sizeof *conv);
    return conv;
}

Или:

void convolute(compute_convFWD *conv, const void *args) {
    memcpy(conv, args, sizeof *conv);
}

И вишенка сверху, некоторые назвали бы это ... ну, скажем менее чем красиво.

compute_convFWD convolute(const void *args) {
    compute_convFWD conv = *(const compute_convFWD *)args;
    return conv;
}

РЕДАКТИРОВАТЬ: Конечно, существуют и другие возможности, но они самые простые.

0 голосов
/ 12 июля 2020

args указатель соответствующей структуры передается, и затем мне нужно назначить его другой структуре того же типа. Правильно ли назначать, как указано ниже, или требуется инициализировать память для фактических аргументов.

    compute_convFWD *actual_args = args; // is this a correct assignment ?
    ... }

Да, это правильно. но ваш вопрос как-то неясен.

если вы передаете void* и намереваетесь работать с этим указателем, то нет необходимости выделять через malloc() любой буфер, просто приведите или назначьте void*, как и вы, и ваша функция работает с указателем actual_args.

если вы не хотите изменять исходный указатель void*, подпись функции должна быть изменена на:

void *convolution(const void *args) 

И затем вам нужно выделить память для копии *args (это может быть в стеке функции convolution или heap. Это зависит от размера структуры и требований вашей функции. (вы можете скопировать часть *args снова, это зависит от вашего convolution logi c!).

для выделения в стеке функции convolution:

compute_convFWD actual_args = *((compute_convFWD*)args); // this initializing can be done with memset also

для выделения в куче:

compute_convFWD* p_actual_args = (compute_convFWD*)malloc(sizeof(*(compute_convFWD*)args));

*p_actual_args = *((compute_convFWD*)args); // this initializing can be done with memset also

Опять же, если вы работаете с несколькими элементами данных исходной структуры, вы можете выделить только для размера элементов данных, которыми вы управляете (нет необходимости копировать всю структуру члены в данном случае)

0 голосов
/ 12 июля 2020

void* указатели автоматически преобразуются во все остальные типы указателей (кроме указателей на функции), вам нужно только инициализировать память, если вызывающая сторона этого не сделала.

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