Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
25.02.2001, 22:08
CPlusPlus



Hi.

Weiss jemand von euch wie zB die Funktion sprintf funktioniert,
dass sie eine unbestimmte Menge von Parametern erwartet, je nach verwendung..

zB:
sprintf(szText,"A: %d, B: %d", iA, iB ); oder
sprintf(szText,"A: %d",iA);

In der stdio.h wird die Funktion so deklariert:
_CRTIMP int __cdecl sprintf(char *, const char *, ...);

Also mit ... irgendwie. Aber wie kann ich auf die Übergebenen Parameter zugreifen???

Also was ich wissen will ist wie ich selber funktionen schreiben kann die eine unbestimmte anzahl von parametern erwarten. war vorhin vielleicht ned ganz ersichtlich worauf ich hinaus will .. :)

--

zum Seitenanfang zum Seitenende Profil || Suche
001
26.02.2001, 12:36
Buy-Menu-Man



Hi!
Ja ganz einfach mit drei Punkten (also ...)!!!!!
Aber das ist glaub nicht so optimal, da der Compiler damit Probleme hat!
Z.B.:
sprintf(sz, "%d plus %d gibt %d", iZahl);

Soviel ich weiß meldet der Compier da keinen Fehler, obwohl es keinen Sinn macht!

Naja......wenn man aber aufpasst......

--

http://battletech-hl.teamfortress2.de

zum Seitenanfang zum Seitenende Profil || Suche
002
26.02.2001, 12:57
TheVoice



Ähm..... unbestimmte Zahl an Parametern?
Ist mir neu... was ich mir vorstellen kann wäre Default-Werte zu verteilen,
die dann an den Parameter übergeben werden, der keinen Wert bei der Benutzung der Funktion zugewiesen bekommen hat.

--

Against TCPA | Resourcecode.de | Blender 3D | [ Darkzone | Pandorra | Alpine ]

zum Seitenanfang zum Seitenende Profil || Suche
003
26.02.2001, 13:57
Buy-Menu-Man



Ooops.....das mit den Parametern hab ich ja noch gar nicht beantwortet!
Also auf die kannst du nicht zurückreifen, glaub ich!
Du kannst auch nicht sagen, was das für Parameter sein sollen......nur dass halt ne unbestimmte Menge von Argumenten folgt!

Vielleicht kann dir das hier auch einer besser erklären!

--

http://battletech-hl.teamfortress2.de

zum Seitenanfang zum Seitenende Profil || Suche
004
26.02.2001, 14:09
DarKnight



TheVoice das kann auch net sein. Denn du kannst an sprintf so viele Sachen übergeben wie du willst. Wenn du Standartwerte setzt ist das eine begrenzte Anzahl!

--

void CHudSayText :: EnsureTextFitsInOneLineAndWrapIfHaveTo( int line ) -- Aja?

zum Seitenanfang zum Seitenende Profil || Suche
005
26.02.2001, 15:08
Hessie J.



Die drei Punkte nennen sich Ellipsis (kA warum) und stellen eine unbestimmte Anzahl von Parametern dar, auf die man mit va_start, va_end und va_arg zugreift (steht haarklein in der Hilfe!)

--

zum Seitenanfang zum Seitenende Profil || Suche
006
26.02.2001, 15:14
Another1



jo .. mit va_start va_end und va_arg kiregt man die params und man kann ohne probleme eine function mit unbestimmter anzahl von parametern schreiben ... kommt eben nur drauf an ob es sinnvoll ist!

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
007
26.02.2001, 16:55
CPlusPlus



Hi. Danke für eure Antworten

Werd gleich mal Probieren ob ich das check :)

--

zum Seitenanfang zum Seitenende Profil || Suche
008
26.02.2001, 18:02
DarKnight



Interessant solche Funktionen. Aber ich würde sie nicht so oft benutzen, denn ich glaube dass das mit den Parametern (Ellipsis) ne Menge Speicher frisst!

--

void CHudSayText :: EnsureTextFitsInOneLineAndWrapIfHaveTo( int line ) -- Aja?

zum Seitenanfang zum Seitenende Profil || Suche
009
26.02.2001, 21:21
TheVoice



Wirklich interessantes Thema :)
Ich such jetzt mal im Internet nach Dokumentationen
über solche Funktionen. Davon wusst' ich vorher
echt noch nichts.

C ya!

--

Against TCPA | Resourcecode.de | Blender 3D | [ Darkzone | Pandorra | Alpine ]

zum Seitenanfang zum Seitenende Profil || Suche
010
27.02.2001, 15:07
blair



Ich weiß nicht, ob es euch hilft, aber hier ist der Source einer Funktion, die Ellipsis verwendet, die Funktion ist von NeHe und dient als Print funktion in Open GL von Outline Fonts, ist ansich ganz gut kommentiert.

GLvoid glPrint(const char *fmt, ...) // Custom GL "Print" Routine
{
float length=0; // Used To Find The Length Of The Text
char text[256]; // Holds Our String
va_list ap; // Pointer To List Of Arguments

if (fmt == NULL) // If There's No Text
return; // Do Nothing

va_start(ap, fmt); // Parses The String For Variables
vsprintf(text, fmt, ap); // And Converts Symbols To Actual Numbers
va_end(ap); // Results Are Stored In Text

for (unsigned int loop=0;loop<(strlen(text));loop++) // Loop To Find Text Length
{
length+=gmf[text[loop]].gmfCellIncX; // Increase Length By Each Characters Width
}

glTranslatef(-length/2,0.0f,0.0f); // Center Our Text On The Screen

glPushAttrib(GL_LIST_BIT); // Pushes The Display List Bits
glListBase(base); // Sets The Base Character to 0
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // Draws The Display List Text
glPopAttrib(); // Pops The Display List Bits
}

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs

zum Seitenanfang zum Seitenende Profil || Suche
011
27.02.2001, 22:32
Prefect



@DarKnight: So ein Käse.. das mit den Parametern verbraucht überhaupt keinen Speicherplatz (natürlich, 4Byte auf dem Stack pro Parameter, aber das ist bei anderen Funktionen auch nicht anders).

Ein Funktionsaufruf

foo("Blah", 15, 'c');

erzeugt immer den Assemblercode:

push 'c' ; was immer der ASCII-Code für 'c' ist
push 15
push Sxxxx ; das ist der Pointer auf den vom Compiler angelegten Speicherplatz für den String "Blah"
call _foo
add esp, 12

Es ist völlig egal, ob die Funktion als

void foo(char *str, int i, char c);

oder als

void foo(char *str, ...);

deklariert ist.
Das ist ja gerade das Gute an der Aufrufskonvention von C (rechts->links, caller cleans stack) im Gegensatz zu z.B. Pascal (links->rechts, function cleans stack).

Achja: auf die Parameter kann man natürlich mit va_XXX (siehe stdarg.h) zugreifen, aber auch direkt mit Pointern. Wer sich ein bißchen mit Assembler auskennt wird aus dem Beispiel oben raussehen, dass man z.B. auf den zweiten Parameter auch mit *((int *)str+1) zugreifen kann, wobei es wiederum bei beiden Funktionen (mit variabler Parameterzahl und ohne variable Parameterzahl) auf diese Weise möglich ist.

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
012
28.02.2001, 14:45
DarKnight



Okay, ich bin überzeugt, Meister! =)

Hatte net hundert pro nachgedacht! Thx für die Aufklärung.

--

void CHudSayText :: EnsureTextFitsInOneLineAndWrapIfHaveTo( int line ) -- Aja?

zum Seitenanfang zum Seitenende Profil || Suche