2011-11-17 2 views
0

Je sais comment passer une quantité inconnue d'arguments de types inconnus à une fonction. Je veux dire quelque chose comme ceci:struct comme argument inconnu

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

Maintenant, je suis en train de passer un struct à part quelques autres arguments à cette fonction. J'ai la même structure déclarée (ou définie?) Dans les deux fichiers (main.c et plugins.c). Mais quand j'essaie de "filtrer" la structure irc transmise depuis le main.c out et d'analyser les données dans la structure irc à partir du plugins.c, je n'ai rien d'utile. Quand j'appelle la fonction j'obtiens un défaut de segmentation.

Ceci est la partie importante de la 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 
    .... 
} 

Et voici le trou 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"; 
} 

Alors, je suis sûr que je suis en train de faire quelque chose de mal avec les pointeurs.

Pourriez-vous s'il vous plaît aide-moi?

Merci

~ Tectu

+1

Fyi, vous ne devriez pas utiliser de tampons de taille fixe pour autre chose que 'message' (où 512 est requis selon la RFC). Tout le reste dépend de l'ircd utilisé. Bien qu'il soit peu probable que les pseudos aient une longueur supérieure à 30 caractères et que les noms d'utilisateur/identifiants ne dépassent pas 10 caractères, le nom d'un canal peut très bien être supérieur à 32 caractères. – ThiefMaster

Répondre

2

La ligne irc = data[i] ne fait pas de sens. Vous devez appeler va_arg:

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

En outre, le malloc dans plugins_entry est inutile, il ne fuite de mémoire.

+0

Merci beaucoup, ça marche! Et oui, ça a beaucoup plus de sens pour moi: D – Tectu

2

Vous n'extrait pas le pointeur vers la structure en utilisant va_args(). Avec cela, vous devriez être en mesure d'utiliser directement votre struct:

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

Notez que vous n'avez pas besoin d'utiliser malloc dans cette fonction aussi longtemps que vous ne voulez pas copier explicitement. Comme votre structure est déjà localisée sur le tas (elle est mallocée dans main.c), vous pouvez l'utiliser directement en utilisant le pointeur.