jankustosz Temat założony przez niniejszego użytkownika |
Jak działa variadic function? » 2015-05-03 21:19:39 Witam opakowywuję allegro 5 w klasy i napotkałem jeden większy problem. Jest tam funkcja która działa podobnie do printf z biblioteki stdio. Muszę zrobić funkcję, która też zależnie od tekstu w pierwszym argumencie ma odpowiednią ilość kolejnych argumentów. Dowiedziałem się że nazywa się to variadic function. Znalazłem taką stronę http://en.cppreference.com/w/cpp/utility/variadic Mógłby mi ktoś jaśniej objaśnić co i po co się robi? Kombinowałem na różne sposoby ale nigdy nie działa. Najlepiej żeby było to było to w c++ 11. Liczę na waszą pomoc. |
|
pekfos |
» 2015-05-03 21:50:56 |
|
kubawal |
» 2015-05-04 12:47:44 Poczytaj o variadic templates. |
|
Fireho |
» 2015-05-04 19:12:56 Jak? Poprzez dopisanie na końcu listy argumentów ... . Potem pobiera się argumenty kilkoma makrami VA_START , VA_ARG i VA_END (to metoda tradycyjna). Po co? Aby zapewnić możliwość podawania dowolnej ilość argumentów, np. do funkcji drukujących takich jak printf . Obecnie powinieneś użyć czegoś co się zwie variadic templates(z C++11), wygoogluj. Nie jest to co prawda najprostsza rzecz, ale cóż... |
|
jankustosz Temat założony przez niniejszego użytkownika |
Nie rozumiem jednej rzeczy. » 2015-05-08 22:12:36 Ok. Wiem już jak to działa variadic function ale nic mi z tego, gdyż do funkcji printf muszę przekazać tekst + jeszcze tą nieznaną liczbę argumentów, a przecież nie da się przekazać do funkcji nieznanej liczby argumentów. Przecież nie zrobię tak:
int ileproc(char* tekst) { int ile = 0; while (*tekst != NULL) { if (*tekst == '%') ile++; tekst++; } return ile; }
void napisz(const char *text, ...) { int a = ileproc(text); va_list vl; va_start(vl, a); printf(text, Nie da się przekazać nieznanej liczby argumentów jak to zrobić tak va_arg , czy może tak ...) va_end(vl); }
może ktoś ma jakiś pomysł |
|
pekfos |
» 2015-05-08 22:15:34 vprintf().. |
|
Gabes |
» 2015-05-08 23:21:38 #include <stdio.h> #include <stdarg.h>
static void tekst( ALLEGRO_FONT * font, ALLEGRO_COLOR color, int x, int y, int flags, char const * format,...) { va_list list; char message[ 1024 ]; va_start( list, format ); vsnprintf( message, sizeof message, format, list ); va_end( list ); al_draw_text( font, color, x, y, 0, message ); } ...
tekst( font, al_map_rgb( 0, 0, 0 ), 0, 0, 0, "%i %1.2f", a, b ); |
|
Fireho |
» 2015-05-09 12:43:10 Używaj szablonów... przykład: template < typename...Argumenty > void napisz( const char * text, Argumenty...args ) { printf( text, args...); } |
|
« 1 » 2 |