2013-11-16 5 views
0

привет, я создаю функцию xx_printf и в функции, называемой find_correspondence, у меня слишком много аргументов, поэтому я думал, что могу создать структуру и просто вызвать конструкцию *, но когда я попытался вызвать функцию find_correspondence в xx_printf, я получить segfault! как решить эту проблему.Как добавить аргументы в структуру?

int  find_correspondance(char *format, char *tab_sign, ptr_fonc *tab_func, int i, va_list ap) 
{ 
    int   a; 

    a = 0; 
    while ((format[i] != tab_sign[a]) && tab_sign[a] != '\0') 
     a = a + 1; 
    if (tab_sign[a] == '\0') 
     { 
     my_putchar('%'); 
     my_putchar(format[i]); 
     } 
    else 
    tab_func[a](ap); 
    return (i); 
} 

int  my_printf(char *format, ...) 
{ 
    va_list  ap; 
    ptr_fonc  *func_tab; 
    char   *flag_tab; 
    int   i; 

    va_start(ap, format); 
    func_tab = tab_func(func_tab); 
    flag_tab = tab_sign(flag_tab); 
    i = 0; 
    while(format[i] != '\0') 
    { 
     if (format[i] == '%') 
     { 
      i += 1; 
      if (format[i] == '%') 
      my_putchar('%'); 
      else if (format[i] == '\0') 
      return ; 
      else 
      **find_correspondence(format, flag_tab, func_tab, i, ap);** 
     } 
     else 
     my_putchar(format[i]); 
     i++; 
    } 
    va_end(ap); 
} 

find_correspondence (формат, flag_tab, func_tab, я, ар); любая помощь?

+0

Пожалуйста, внесите отступ и используйте брекеты. Может помочь –

+0

Я не вижу, что вы на самом деле используете структуру в любом месте здесь (хотя это не '' va_list', о котором вы говорите). Также, пожалуйста, укажите фактическую строку, в которой он падает. – Dolda2000

+0

Я не понимаю, как функция printf, подобная функции, примет набор аргументов, которые соответствуют структуре. Не используйте va_list, передайте указатель на структуру. Непонятно, что вы пытаетесь сделать. – user1338

ответ

0

Я думаю, проблема в том, что вы пропустили «struct» прямо перед вашим именем структуры va_list в списке аргументов. Он должен выглядеть следующим образом:

find_correspondance(char *format, char *tab_sign, ptr_fonc *tab_func, 
          int i, ***struct*** va_list ap) 

А также здесь небольшая программа может использоваться как прецедент.

#include <stdio.h> 
#include <string.h> 

struct namect{ 
    char fname[20]; 
    char lanme[20]; 
    int letters; 
}; 

struct namect getinfo(void); 
struct namect makeinfo(struct namect); 
void showinfo(struct namect); 

int main(void){ 
    struct namect person; 
    person=getinfo(); 
    person=makeinfo(person); 
    showinfo(person); 

    getchar(); 
    return 0; 
} 

struct namect getinfo(void) 
{ 
    struct namect temp; 
    printf("Please enter your first name.\n"); 
    gets(temp.fname); 
    printf("Please enter your last name.\n"); 
    gets(temp.lanme); 
    return temp; 
} 

struct namect makeinfo(struct namect info) 
{ 
    info.letters=strlen(info.fname)+strlen(info.lanme); 
    return info; 
} 

void showinfo(struct namect info) 
{ 
    printf("%s %s,your name contains %d letters.\n",info.fname,info.lanme,info.letters); 
} 
0

Для некоторых реализаций va_arg ...

Что может происходить в том, что вы должны делать va_start каждый раз вокруг петли. Если вы используете va_arg в tab_funca; вызов, все аргументы будут прочитаны, а в следующий раз вокруг цикла не то, что они были в первый раз, т. е. мусором.

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