2016-08-18 2 views
-1

я пытаюсь решить следующую проблему ...
У меня есть функция, которая должна принимать следующие аргументы:
переменное число аргументов (различных типов) в ANSI C

change(input_file_name, output_file_name, pid1, pid1_file_name, pid2, pid2_file_name, etc...); 

поэтому в случае бега этой функции будет:

change("input.file","output.file", 20, "file1.file", 21, "file2.file", 22, "file3.file", 23, "file4.file); 

определение этой функции:

#include <stdarg.h> 
int change(char input[], char output[], int n, ...) 
{ 
    va_list ap; 
    unsigned int a; 
    char *name; 

    va_start(ap, n); 

    ... 

    for (; n; n-=2) { 
    a = va_arg(ap, int); 
    name = va_arg(ap,char *); 

    ... 

    } 
    va_end(ap); 
    return i; 
} 

, но это работает неправильно. При попытке получить переменные «a» и «name» я получаю случайные данные.

+1

В определении у вас есть дополнительное 'n' для количества пар pid/name, которые следуют за тем, что вы не проходите –

ответ

1

Вам не хватает аргумента для n. В результате все остальное отключено.

"20" читается как n, затем "file1.file", как a, "21", как name "file2.file", как a и т.д.

Вызвать функцию как это:

       // v--- add this 
change("input.file","output.file", 8, 20, "file1.file", 
             21, "file2.file", 
             22, "file3.file", 
             23, "file4.file"); 
1

Неверный вызов функции изменения. Третий параметр должен быть числом возвращающих аргументов.

Два аргумента ожидания. Третий аргумент 2 соответствует третьему параметру в определении изменения функции, которая называется n:

change("input.file", "output.file", 2, 20, "file1.file"); 

Восемь завершающих аргументы:

change("input.file", "output.file", 8, 20, "file1.file", 21, "file2.file", 
             22, "file3.file", 23, "file4.file"); 

Оба подсчета и заднее количество аргументов должно быть кратно на два, поскольку они разбираются парами.

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