2016-11-19 9 views
0

이것은 여러 가지 다른 방식으로 부탁되었습니다. 그러나 나는 아직도 그것을 작동시키지 못합니다. 다음은 함수 정의입니다.ncurses 앞으로 전달되는 Variadic 인수 목록

void                   
ncurses_add_line(const char *fmt, ...)           
{                    
    if (ncurses_window) {               
    va_list args;                
    va_start(args, fmt);              
    printw(fmt, args);               
    printw("\n");           
    va_end(args);                
    }                    
} 

이 함수를 호출하면 함수의 가변 인쇄에서 횡설수설합니다. printw으로 직접 전화하면 모든 것이 작동합니다. 예를 들어 과 같은 ncurses_add_line을 호출하면 값이 var에 저장되지 않습니다. 그러나 printw("Hello %d", var)을 호출하면 "Hello"옆에 var 값이 표시되고 var == 1이면 "Hello 1"이 printw으로 인쇄되지만 ncurses_add_line의 경우는 그렇지 않습니다.

무엇을 변경해야합니까?

내 머리글 파일에 내 C 파일에만 포함하고 싶지 않기 때문에 필자가이 문제를 해결할 이유가 있습니다.

답변

2

printw 대신 vwprintw을 시도하십시오. vwprintw은 va_list를 인수로 취합니다.

가변 개수의 인수를 사용하는 함수에 va_list를 전달하면 사용하려는 관용구가 작동하지 않습니다. 한 가지 해결책은 작동 할 함수의 변형을 찾는 것입니다 (이 경우, vwprintw). 대안은 va_list를 "평평하게"하는 것입니다 :이 경우 vsprintf를 사용하여 형식화 된 문자열을 만든 다음이를 curses에 전달할 수 있습니다.

1

args이 아니고은 인수 배열과 같습니다. 그것은 내부 구조입니다. 유형을 전달하여 모든 단일 인수를 읽어야합니다. C에서는 런타임 리플렉션이 없으므로 코드에 유형을 추가해야한다는 점에 유의하십시오.

void ncurses_add_line(const char *fmt, ...)           
{                    
if (ncurses_window) 
{    
    va_list args; 
    va_start(args, fmt);  
    char *arg = va_arg(args, int); // take out one arg by giving the type (int) 
    printw(fmt, arg); 
    printw("\n");           
    va_end(args);                
    }                    
}