Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
19.04.2003, 13:33
King of Darkness



also hallo ;)

ich wollte mal wissen wie ich ne funtion schreibe wie printf() zb
mag vieleicht ne nubfrage sein aber ich weis es einfach nich :(

ich will also meiner funtionen optionale argumente mit geben
zb so printf("%d %c", zahl, char);
hab auch mal rumprobiert aber irgendwie ging es nicht ... klar sonst würd ich nich fragen
also ich hoffe ihr könnt mir vieleicht etwas auf dir sprünge helfen

danke schonmal im voraus

--

Coding Center --- Tutorials über Programmierung und andere Themen
Amazon Preisbeobachung mit Preisalarm

zum Seitenanfang zum Seitenende Profil || Suche
001
19.04.2003, 14:21
Exec



guck doch einfach mal ...
einfach rückwärts gehn ... definition suchen, fkt suchen,etc

--

"selbermachen rockt am meisten :D" - -LeJean-

zum Seitenanfang zum Seitenende Profil || Suche
002
19.04.2003, 14:45
Kriz



Das geht mit der variablen Argumentliste. Du meinst sicherlich eine Funktion wie z.B. myprintf(const char* str, ...);

Du brauchst dafür erstmal die Header <stdarg.h>. Dort sind drei Makros definiert mit den Namen va_start, va_arg und va_end. Das Makro va_start setzt einen Zeiger auf den Anfang der variablen Parameterliste, va_arg liest alle Parameter ein und va_end setzt den Zeiger wieder zurück. Das ganze sieht dann so aus:

Quellcode:void va_start(va_list pArg, prevParam)
DATENTYP va_arg(va_list pArg, DATENTYP)
void va_end(va_list pArg)
va_list ist der Listentyp der Parameterliste.

Mal ein Beispiel:

Quellcode:float durchschnittswert(int wert1, ...)
{
    int summe = 0;
    int i = wert1;
    float zaehler = 0.0f;
  
    va_list argliste;

    va_start(argliste, wert1);
    while(i != -1) // -1 ist der im voraus vereinbarte Abbruchsparameter der Liste
    {
        summe += i;
        ++zaehler;
        i = va_arg(argliste, int);
    }
    va_end(argliste);
  
    return ( (float)summe ? ((float)summe/zaehler) : 0.0f );
}
Wie im Code erwähnt muß man eine Abbruchsbedingung definieren, da C/C++ nicht automatisch das Ende der variablen Argumentliste erkennen kann. In unserem Fall als Durchschnittsberechnung von (positiven) Zahlen habe ich -1 als Abbruchsbedingung gewählt. Darüberhinaus ist dem Compiler weder die Anzahl der variablen Argumente bekannt noch der Datentyp der Argumente! Das bedeutet: Typprüfungen und -castings der varibalen Argumente sind nicht möglich!!!

Der Aufruf gestaltet sich so:

Quellcode:float ds = durchschnittswert(2,4,8,16,32,-1);ds hätte dann den Wert 12.4

Cu

PS: Hoffe, das alles richtig ist :D

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 19.04.2003 um 14:33 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
19.04.2003, 16:19
Tron



lass blos die finger davon!
das ist das haesslichtste konstrukt, das K&R je ausgebruetet haben.
wie kriz gesagt hat, ist mit typensicherheit fehlanzeige und zudem steht fuer stack-, heap- uns sonstiger korruption tuer und tor offen.
z.b.:
printf("%s", zu_dumm_dass_das_ein_int_zeige_ist); // das kann boese enden
printf("%i %i", ein_int_zeiger); // erstrecht das

normalerweise geht das ohne absturz aus, aber spaetestens, wenn man auf die variablen parameter schreibend zugreift isses vorbei:
scanf("%s", int_zeiger); // autsch!

das konstrukt sollte begraben und totgeschwiegen werden!
das durschnitts-beispiel von kriz waere zum beispiel als template und mit stl-kontainern viel eleganter geloest.

Zitat:
PS: Hoffe, das alles richtig ist :D
fast, das return sollte eher so aussehen:
return zaehler ? float(summe)/zaehler : 0.0f;
zudem zaehler sollte ein int sein.
und lass die extra-klammern um das return zurueck, das ist schlieslich keine funktion (;

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
004
19.04.2003, 19:01
Kriz



Hm, summe bezieht sich auf die int-Argumente, während Zähler ja aus Natur zur Funktion bereits dem Rückgabetyp entspricht, daher float. Erspart castings :D

Btw. habe ich mir die Funktion nicht selber ausgedacht, sondern ganz noobig abgepinselt aus meiner Referenz... Aber da Tron ja schon groß und weise ist, darf er das mal als Template in C++ umbauen und hier posten, hehe :P

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
005
19.04.2003, 22:25
King of Darkness



mhhh also deine meinung tron, scheint ja ziehmlich dagegen zu sein :/ aber hier mein eigendliches problem
ich habe mir mal aus langer weile ein modul geschreiben was zum führen einer log datei bestimmt ist... funtioniert auch ganz gut bis ich zb mal eine zahl oder einfach ne variable mit ausgeben will
vieleicht gibt es ja auch ne andere lösung
aber trotzdem erstmal danke für eure schnellen hilfen bzw beispiele

--

Coding Center --- Tutorials über Programmierung und andere Themen
Amazon Preisbeobachung mit Preisalarm

zum Seitenanfang zum Seitenende Profil || Suche
006
20.04.2003, 10:22
Prefect



Tja, das Problem ist alt und bekannt. Als pragmatischen Kompromiss verwende ich da printf()-Syntax und eine gcc-Extension, die für weitgehende Typensicherheit sorgt (ja ich weiß, das ist nicht die feine Art). In C hat man eigentlich keine andere Wahl.

In C++ gibt es wie schon erwähnt Templates und Streams. Eine Bibliothek von Boost erscheint mir hier die beste Wahl zu sein.

Noch besser wäre es natürlich, wenn man die Ellipsis in C++ automatisch in eine Sequenz von auf ein Proxy-Objekt angewandte Operatoren umwandeln könnte.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche