1. Artikel
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forum
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Paules-PC-Forum.de
  2. Forum
  3. Programmierung
  4. C/C++, Visual C++, Visual C++.NET

Variable Anzahl von Parametern (ellipse) weitergeben

  • Flatty
  • 7. Dezember 2004 um 08:37
  • Flatty
    Gast
    • 7. Dezember 2004 um 08:37
    • #1

    Hallo,

    ich möchte eine Funktion mit einer Variablen Anzahl
    von Parametern ausstatten. Diese Parameter sollen
    aber auch noch an eine Unterfunktion weitergegeben werden.
    z.B.:

    Code
    void info(File *pFile, const char *strFormat, ...)
    {
        fprintf( pFile, strFormat, /* und hier die variablen parameter */ );
    }

    Wie kann ich das realisieren?

    Lieben Gruß
    Flatty

  • lastwebpage
    Dauergast
    Beiträge
    1.671
    • 7. Dezember 2004 um 13:30
    • #2

    Hallo,
    das ist genau dasselbe wie die eigentliche Deklaration von z.B. printf()
    die Deklaration würde dann so aussehen
    RückgabeWert Funktionsname(Liste "fester variabeln",...)
    also
    int myFunc(int a,int b,char *sz,...)
    (...) muss immer der letzte sein,und laut ms definition muss es mind. einen "festen" Parameter geben.
    Die Funktion selber sieht dann so aus:
    (...) ist hier ein variabel Anzahl von int,zurückgegeben wird in diesem Beispiel der durschnitt der übergebenen Werte
    int myFunc(int first,...)
    {
    int c=a+b;
    strcpy(sz,"Hallo");

    int count = 0, sum = 0, i = first;
    va_list marker;
    va_start( marker, first );
    while( i != -1 )
    {
    sum += i;
    count++;
    i = va_arg( marker, int);
    }
    va_end( marker );
    return( sum ? (sum / count) : 0 );
    }

    Also zusammengefasst:
    va_list ist eine Struktur mit folgendem Aufbau {Byte *a,int offset},also ein Zeiger auf die aktuelle Variabel,und wie lang diese ist.
    va_start setzt den ersten Struktureintrag auf die Speicherposition nach "first"
    va_arg liefert den aktuellen Wert zurück,und erhöht den Zeiger um die Größe eines int
    va_end setzt den Zeiger wieder zurück.

    Es gibt aber da noch weitere va_ Variabeln.Ich hoffe mal das der Aufbau jetzt etwas klarer ist.
    Aber ACHTUNG!
    -Wenn du unter Linux programmiert hat die Sache einen anderen Aufbau
    -Wenn du das Ganze mit dem Debugger untersuchen willst,das Ganze sind eigentlich keine Variabeln sondern Makros,sprich der Debugger wird evtl. Unsinn anzeigen.

    Peter

    (Wenn dir das nicht geholfen hat,nun ja die Sache ist nunmal etwas kompliziert,du weist jetzt aber schonmal nach was du suchen must ;) )

  • Flatty
    Gast
    • 8. Dezember 2004 um 08:27
    • #3

    Jow, danke erstmal für diese Beschreibung.
    Sie macht es klarer. Aber mein Problem ist noch etwas schwieriger,
    und ich finde dazu keine Lösung. Wie gesagt, möchte ich
    eine Funktion ... ach ich mach erstmal ein Beispiel :)

    Code
    int min( int a1, ... )
    {
        /* berechne hier das minimum der übergebenen parameter */
    }
    
    
    int max( int a1, ... )
    {
        /* berechne hier das maximum der übergebenen parameter */
    }
    
    
    void print_minmax( int a1, ... )
    {
        printf(" min(%d) max(%d)", min( a1, ... ), max( a1, ... ) );
    }
    
    
    void main(void)
    {
        print_minmax( 5 );
        print_minmax( 1, 2, 3, 4, 192683 );
    }
    Alles anzeigen


    Wie du siehst, möchte ich die Anzahl der variablen Parameter,
    die die Funktion print_minmax() bekommt, jeweils an die
    Unterfunktionen min() und max() weitergeben.

    Natürlich könnte ich bei min und max, ne va_list übergeben (wie
    es printf/fprintf auch bei der _output Funktion macht. Doch leider
    kann ich in meinem Fall ( im übertragenen Sinne ) die min() und max()
    Funktionen nicht aendern. Als vereinfachtes Beispiel bin ich sozusagen
    gezwungen folgendes zu tun:

    Code
    void my_printf( char *strFormat, ... )
    {
         printf( strFormat, ... );
    }


    Und das ist mein Problem! Und dazu habe ich noch
    keine Informationen gefunden.


    Liebe Grüsse
    Flatty

  • lastwebpage
    Dauergast
    Beiträge
    1.671
    • 8. Dezember 2004 um 10:25
    • #4

    Hallo,
    probier mal folgendes aus:
    void __cdecl print_minmax(int a1,va_list ap)
    {
    min(a1,ap);
    }

    Peter

    das mit diesem cdecl musst du mal testen ob es ohne Compilerfehler gibt.

    Peter

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Windows 11

  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™