Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » [C] beiebig viele argumente einer funktion...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.08.2004, 17:53 Uhr
BoNeSpiRit



Moin!
ich hab grad nen kleines Problem... irgendwie bekomm ich das bei C nich hin, dass ich einer funktion beliebig viele eingaben geben kann, bzw wie ich auf sie zugreifen kann...
ich schreib grad an nen random generator, der als eingabe ein bis x argumente akzeptiert, wobei er eben sowohl ein argument oder mehrere argumente akzeptieren soll.
Ich weiss einfach nicht wie ich das gescheit machen kann...

nochmal nen mini-code-auszug mit dem problem:

Code:
int
gengen(int argc, char *argv[])
{

int argc4;
if(argc == 1)
{
sscanf(argv[4], "%d", &argc4);
printf("\nargc4: %d", argc4);
}
}



beim aufruf, zum beispiel:
gengen(1,2,3,4,5); // macht er nur mist...
kann mir jemand helfen?
THX schonmal im vorraus und sorry, falls es sowas schonma gab, hab gesucht aber nix gefundn...

Grüsse,
BoNeSpiRit

Dieser Post wurde am 10.08.2004 um 17:54 Uhr von BoNeSpiRit editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.08.2004, 18:25 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


guckst du hier
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.08.2004, 18:40 Uhr
virtual
Sexiest Bit alive
(Operator)


Das macht man mit den va_* Macros:

C++:
#include <stdio.h>
#include <stdarg.h>


int minimum(int anz, ...) // 1.
{
    va_list args;  // 2
    int i;
    int m = 0;

    va_start(args, anz); // 3

    if (anz>0)
    {
        m = va_arg(args, int); // 4
        for(i=1; i<anz; ++i)
        {
            int n = va_arg(args, int); // 4
            if (n<m) m = n;
        }
    }

    va_end(args); // 5

    return m;
}


int main()
{
    printf("Das minimum von 1, 2, -1, und 0 ist %d", minimum(4, 1, 2, -1, 0));
}
~



Zur erkläung:
1. Eine Funktion mit variabler Anzahl parameter nennt man auch ellipse. Der variable Anteil einer solchen Parameterliste wird mit "..." gekennzeichnet. Für den weiteren Zugriff muß vor dem ... ein weiterer fester parameter da sein (hier anz), manche Funktionen, wie zb printf benutzen hier einen String. Dieser Parameter sollte dafür verwendet werden, die tatsächliche Anzahl der Parameter zu bestimmen. In obigen beispiel geben wir in anz eben diese Anzahl an, printf etwa nimmt den Formatstring zur Bestimmung.

2. Innerhalb der Funktion benötigt man eine Variable vom Typ va_list, welche zur Verwaltung benutzt wird.

3. Diese Liste wird mittels va_start initialisiert. Der zweite Parameter, der dieser Funktion (eigentlich ists ein Macro) übergeben wird ist das letzte feste Argument in der Parameterliste (hier: anz). Danach ist die Liste zu abarbeitung bereit:

4. man kann nun durch die liste der parameter iterieren, von vorne bis hinten. Dies macht man mit va_arg, wobei der zweite parameter angibt, welchen Typ man als Parameter hier erwartet. Wo das Ende der Liste ist, kann man nicht bestimmen, dies ist per Implementierung festzulegen; in diesem Beispiel gibt eben anz die Anzahl an.

5. Nachdem man die Liste durchgeackert hat, muß man va_end Aufrufen. Auf manchen System hat dieser Call keinen Effekt, auf anderen ist es aber so, daß mit va_start dynamisch Speicher belegt wurde, der so nun freigegeben wird.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.08.2004, 18:56 Uhr
BoNeSpiRit



muchas gracias
ihr seid die Besten
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.08.2004, 20:16 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@virtual
wenn du deine beiden beiträge zusammenschmeist kommt nen super FAQ beitrag bei raus oder was meinst du?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.08.2004, 20:24 Uhr
0xdeadbeef
Gott
(Operator)


...möchte noch dazu erwähnen, dass solcher Code potentiell gefährlich ist. Du hast innerhalb der Funktion keine Möglichkeit, zu überprüfen, ob du auch wirklich das kriegst, was du erwartest, und außerhalb der Funktion keine Möglichkeit zu überprüfen, was die Funktion erwartet. Für meinen Geschmack sind Ellipsen ziemlich schlechter Stil.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.08.2004, 20:29 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@beefy
mmh kann man das innerhalb von c++ nicht mit RTTI verbinden?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.08.2004, 20:35 Uhr
Pablo
Supertux
(Operator)



Zitat von Windalf:
guckst du hier


oder hier, sehr nettes Rätsel
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.08.2004, 20:40 Uhr
0xdeadbeef
Gott
(Operator)


Selbst dann steht doch erst zur Laufzeit fest, was die Funktion kriegt. OK, du kannst dann drauf reagieren, aber RTTI macht den Code zumindest ziemlich dreckig. Sinnvoller wäre meines Erachtens hier:

C++:
int minimum(int *array, size_t len){ ...}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: