2011-11-17 4 views
0

알 수없는 유형의 인수를 알 수없는 양만큼 함수에 전달하는 방법을 알고 있습니다. 나는 이런 식으로 뭔가 의미 : 알 수없는 인수로 struct

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

가 지금은 그 기능에 몇 가지 다른 인수 외에 구조체를 전달하려고합니다. 두 파일 (main.c 및 plugins.c)에서 선언 된 동일한 구조체 (또는 정의 된?)가 있습니다. 그러나 main.c에서 전달 된 irc struct를 "필터링"하려고 시도하고 plugins.c의 irc 구조체에있는 데이터를 구문 분석하면 아무 것도 유용하지 않습니다. 함수를 호출 할 때 segementation 오류가 발생합니다.

이것은 중요한 main.c의에서 일부입니다 : 구멍 plugins.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 
    .... 
} 

그리고 : 그래서

#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

Fyi의 경우,'message' 이외의 다른 것에는 고정 크기의 버퍼를 사용하지 말아야합니다 (여기서 RFC에 따라 512가 필요합니다). 그 밖의 모든 것은 사용 된 ircd에 달려 있습니다. 닉스가 30 문자보다 길지는 않지만 사용자 이름/아이디가 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()을 사용하여 구조체에 대한 포인터를 추출하지 않습니다. 당신만큼 당신이 명시 적으로 복사하지 않는 한이 기능에서의 malloc을 사용할 필요가 없습니다

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

참고 : 그, 당신은 직접 구조체를 사용할 수 있어야합니다. 구조체가 이미 heap에 위치하므로 (main.c에 malloc되어 있음) 포인터를 사용하여 구조체를 직접 사용할 수 있습니다.

관련 문제