структура как неизвестный аргумент - PullRequest
0 голосов
/ 17 ноября 2011

Я знаю, как передать неизвестное количество аргументов от неизвестных типов в функцию. Я имею в виду что-то вроде этого:

char* plugins_entry(const char* data, ...);

Теперь я пытаюсь передать структуру помимо нескольких других аргументов этой функции. У меня одна и та же структура, объявленная (или определенная?) В обоих файлах (main.c и plugins.c). Но когда я пытаюсь «отфильтровать» структуру irc, переданную из main.c, и проанализировать данные в структуре irc из plugins.c, я не получаю ничего полезного. Когда я вызываю функцию, я получаю ошибку сегментации.

Это важная часть из main.c:

struct irc_data {
char nick[32];
char user[32];
char host[64];
char chan[32];
char message[512];
int is_ready;
};

....

int main(int argc, char** argv) {
    ....
    struct irc_data *irc = malloc(sizeof(struct irc_data));
    ....
    (*lib_plugin)("r",irc);  // call the function in plugins.c 
    ....
}

А вот и отверстие plugins.c:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>

struct irc_data{
    char nick[32];
    char user[32];
    char host[64];
    char chan[32];
    char message[512];
    int is_ready;
};

char* plugins_entry(const char* data, ...) {
    int i;
    struct irc_data *irc = malloc(sizeof(struct irc_data));

    va_list args;
    va_start(args, data);

    for(i=0; data[i] != '\0'; ++i){
        if(data[i] == 'r'){
            irc = data[i];
        }
    }

    va_end(args);

    printf("\n\n------------------------\n");
    printf("What we got here: %s\n",irc->nick);
    printf("\n------------------------\n\n");


    return "done";
}

Итак, я почти уверен, что делаю что-то не так с указателями.

Не могли бы вы помочь мне здесь?

Спасибо

~ Tectu

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Вы не извлекаете указатель на структуру, используя va_args().При этом вы сможете напрямую использовать свою структуру:

struct irc_data *irc = va_args(args, struct irc *);

Обратите внимание, что вам не нужно использовать malloc в этой функции, если вы не хотите явно копировать.Так как ваша структура уже находится в куче (она имеет malloc в main.c), вы можете просто использовать ее напрямую с помощью указателя.

2 голосов
/ 17 ноября 2011

Строка irc = data[i] не имеет никакого смысла. Вам нужно позвонить va_arg:

if(data[i] == 'r') {
    irc = va_arg(args, struct irc *);
}

Кроме того, malloc в plugins_entry бесполезен, он будет только пропускать память.

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