Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Jak działa variadic function?

Ostatnio zmodyfikowano 2015-06-15 15:44
Autor Wiadomość
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.
P-131727
pekfos
» 2015-05-03 21:50:56
Tu masz przykład
http://www.cplusplus.com​/reference/cstdarg/va_start/
Jeśli allegro ma tylko funkcje w stylu printf(), ale już nie w stylu vprintf(), to, bez większego kombinowania, tego nie opakujesz.
P-131728
kubawal
» 2015-05-04 12:47:44
Poczytaj o variadic templates.
P-131744
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óż...
P-131771
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ł
P-131913
pekfos
» 2015-05-08 22:15:34
vprintf()..
P-131914
Gabes
» 2015-05-08 23:21:38
C/C++
#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 );
    /* Actual text. */
    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 );



P-131920
Fireho
» 2015-05-09 12:43:10
Używaj szablonów... przykład:
C/C++
template < typename...Argumenty >
void napisz( const char * text, Argumenty...args )
{
    printf( text, args...);
}
P-131929
« 1 » 2
  Strona 1 z 2 Następna strona