2016-11-19 6 views
0

Это предложение задано в нескольких разных вариантах. Но я все еще не могу заставить его работать. Вот мое определение функции.Переслать Variadic Список аргументов в ncurses printw function in c

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, как ncurses_add_line("Hello %d", var) Я получаю значение не хранить в var. Однако, если я вызываю printw("Hello %d", var), я вижу значение var, отображаемое рядом с «Hello», как в, если var == 1, тогда «Hello 1» печатается с printw, но это не относится к ncurses_add_line.

Что мне нужно изменить?

Моей причиной для этого является то, что я не хочу включать в свой заголовочный файл только в моем c-файле.

ответ

2

Попробуйте vwprintw вместо printw. vwprintw принимает аргумент va_list.

Идиома, которую вы пытаетесь использовать - передача va_list функции, которая принимает переменное количество аргументов, не будет работать. Одно из решений - найти вариант функции, которая будет работать (в данном случае vwprintw). Альтернативой является «сгладить» va_list: в этом случае вы можете использовать vsprintf для создания форматированной строки, а затем передать это в проклятия.

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);                
    }                    
} 

 Смежные вопросы

  • Нет связанных вопросов^_^