2011-11-17 81 views
0

我知道如何從未知類型傳遞的參數未知量的功能。 我的意思是這樣:結構作爲未知參數

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

現在我試圖通過一個結構除了一些其他參數該功能。我在這兩個文件(main.c和plugins.c)中聲明瞭相同的結構(或定義了?)。但是,當我嘗試「過濾器」的IRC結構從main.c中進行傳遞和解析從plugins.c的IRC結構中的數據,我沒有得到任何有用的。當我調用這個函數時,我得到一個segementation錯誤。

這是從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

+1

據透露,你不應該使用固定大小的緩衝區任何東西,但'message'(其中512是必需的,按照RFC)。其他一切都取決於所使用的ircd。而刻痕不太可能超過30個字符和用戶名更長/ idents不太可能超過10個字符,頻道名稱很可能超過32個字符。 – ThiefMaster

回答

2

irc = data[i]沒有任何意義。你需要調用va_arg

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

此外,在plugins_entrymalloc是沒用的,它只會導致內存泄漏。

+0

非常感謝,這工作!是的,這對我來說更有意義:D – Tectu

2

你不使用va_args()提取的指針結構。有了這一點,你應該能夠直接使用你的結構:

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

注意,你並不需要,只要你不想明確複製此功能使用malloc。由於你的結構已經位於堆中(它在main.c中是malloc),所以你可以直接使用指針來使用它。