Anzeige:
Ergebnis 1 bis 5 von 5

Thema: [C] Dynamische Funktions-Parameter

  1. #1
    Registrierter Benutzer
    Registriert seit
    26.10.2004
    Beiträge
    26

    [C] Dynamische Funktions-Parameter

    Hallo,

    ich weiß, ich stelle seltsame Fragen. Trotzdem mache ich es nochmal

    Vielen kennen doch die Funktion printf(). Diese hat die Eigenschaft, beliebige Parameter anzunehmen, einer ist jedoch vorgegeben.

    Ich möchte auch so eine Funktion bauen, allerdings komm ich nicht dahinter, wie das gehen soll. Eine Idee kam mir mit getopt(). Aber ich glaube, die Programmierer, die printf() entworfen haben, müssen das anders gemacht haben. getopt() kam wohl erst viel später.

    Hat dafür jemand eine Idee?

    Gruß

    Mike
    Je mehr man vom Programmieren lernt, um so klarer wird einem, dass man so gut wie gar nichts darüber weiß.

    "Was bin ich? Willst Du meinen Ort wissen, kannst Du nicht wissen, wie ob und wie schnell ich mich bewege. Willst Du wissen wie schnell ich unterwegs bin, kannst du nicht sagen, wo ich bin." :D

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Dafür gibt es einen standardisierten Mechanismus.
    Was du dazu brauchst steht im Header stdarg.h
    Hier ist ein minimales Bsp
    http://www.fz-juelich.de/zam/docs/bh...section_6.html
    Vielen kennen doch die Funktion printf(). Diese hat die Eigenschaft, beliebige Parameter anzunehmen, einer ist jedoch vorgegeben.
    Ja, mind. ein Parameter muß benannt sein, der wird benötigt, um die Adresse des ersten unbenannten Parameters zu ermitteln.
    Aber ich glaube, die Programmierer, die printf() entworfen haben, müssen das anders gemacht haben. getopt() kam wohl erst viel später.
    Und noch vor stdarg.h sah das ganz anders aus (funktioniert mit heutigem C garnicht mehr).

  3. #3
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    getopt wird für Kommandozeilenparameter benötigt und hat überhaupt nichts mit variablen Parametern zu tun!

    Es geht wie folgt:

    definiere die Funktion wie folgt
    Code:
    #include <stdarg.h>
    
    void Foo(int bar, ...)
    {
        va_list varg;
        
        va_start(varg, bar); //"bar" ggf. durch den letzte benötigten Parameter 
     ersetzen
         // benutzen ....
        va_end(varg);
    }
    zwischen va_start und va_end kannst du die variablen Parameter benutzen. "va_arg(varg, TYPE)" gibt dir in diesem Fall immer den nächsten Parameter, den TYPE musst du mit angeben.

    Mehr unter "Variadic Functions" in "info libc".

    Das ganze wird aber nur noch selten verwendet. Wofür brauchst du das denn? Wenn du nur printf modifizieren willst, ist es einfacher, mit vprintf zu arbeiten.

  4. #4
    Registrierter Benutzer
    Registriert seit
    26.10.2004
    Beiträge
    26
    Wer hätte es gedacht, das man mit Synonymen der Überschrift genau das richtige findet?

    Trotzdem,
    vielen Dank!

    Gruß
    Mike
    Je mehr man vom Programmieren lernt, um so klarer wird einem, dass man so gut wie gar nichts darüber weiß.

    "Was bin ich? Willst Du meinen Ort wissen, kannst Du nicht wissen, wie ob und wie schnell ich mich bewege. Willst Du wissen wie schnell ich unterwegs bin, kannst du nicht sagen, wo ich bin." :D

  5. #5
    Registrierter Benutzer
    Registriert seit
    26.10.2004
    Beiträge
    26
    Zitat Zitat von Joghurt
    Wofür brauchst du das denn? Wenn du nur printf modifizieren willst, ist es einfacher, mit vprintf zu arbeiten.
    Genau genommen will ich eine Logging-Funktion programmieren und diese in eine private Library für mich packen.

    Außerdem will ich mich endlich mal genauer mit den Möglichkeiten von C befassen und lernen.
    Je mehr man vom Programmieren lernt, um so klarer wird einem, dass man so gut wie gar nichts darüber weiß.

    "Was bin ich? Willst Du meinen Ort wissen, kannst Du nicht wissen, wie ob und wie schnell ich mich bewege. Willst Du wissen wie schnell ich unterwegs bin, kannst du nicht sagen, wo ich bin." :D

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •