Funktion mit variabler Argumentenliste dynamisch aufrufen



  • Ändere mal

    char* ptr;
    ..
    while( ( ptr = va_arg( x, char* ) ) )
    

    in

    const char* ptr;
    ..
    while( ( ptr = va_arg( x, const char* ) ) )
    

    und dann

    testfkt( "Hallo", "Dies", "ist", "ein", "Test", NULL);
    


  • feigling schrieb:

    Ändere mal

    Du hast mein Problem nicht verstanden.



  • Das mag schon sein, aber dein Code oben ergibt genau 0 Sinn und funktioniert auch nicht. Mein Code tut das, von dem ich denke, dass es dein Code tuen soll. Vielleicht hast du Glück und musst die Funktion garnicht ändern, sondern nur den Aufruf. Ka, ob der unterscheidet zwischen char * und const char *. Und ganz ehrlich? Ich habe mir deinen 2. Post auch garnicht durchgelesen, sondern nur deinen Code.



  • feigling schrieb:

    Das mag schon sein, aber dein Code oben ergibt genau 0 Sinn und funktioniert auch nicht.

    Es geht darum, das ich die Funktion mit variabler Anzahl Aufrufen möchte. Die Anzahl der Argumente weis ich aber nicht wo ich den Code schreibe, sondern er muss zur Laufzeit durch Benutzer-/Datenbankeingaben generiert werden. Daher kann ich nicht pauschal eine feste Anzahl von Argumenten übergeben, ob 3, 6, 19 oder 500. Der Aufruf selber soll DYNAMISCH sein. Aber ich glaube ohne Assembler - was absolut nicht in Frage kommt, da wir portablen Code schreiben - würde man bei diesem Problem nicht herumkommen.

    Gruß
    ~code_pilot



  • Wie ich schon sagte - bei dem Ansatz ist var_arg-Funktionen nicht geeignet. Und wenn du die Zielfunktion nicht umschreiben kannst, könntest du sie eventuell in einer Schleife aufrufen:

    void testfktarr(char* data[])
    {
      int i;
      for(i=0;data[i]!=NULL;++i)
        testfkt(data[i],NULL);
    }
    

    (das klappt natürlich nicht für jede Funktion - printf() auf diese Weise aufzurufen dürfte mächtig in die Hose gehen)



  • CStoll schrieb:

    void testfktarr(char* data[])
    {
      int i;
      for(i=0;data[i]!=NULL;++i)
        testfkt(data[i],NULL);
    }
    

    (das klappt natürlich nicht für jede Funktion - printf() auf diese Weise aufzurufen dürfte mächtig in die Hose gehen)

    Hihi nein das wird nicht gehen, da die Funktion eine Struktur aufbaut, die dann an eine Struktur, die der Funktion übergeben wird, aneghängt wird. Ein erneuter Aufruf würde zu einem Core führen :D, da das alte Strukturelement nicht freigegeben wird (ich liebe meine Software!!! :)). Ergo: Umschreiben.

    Danke aber an Dich.

    ~cp (Currywurst-Pommes)



  • code_pilot schrieb:

    Ein erneuter Aufruf würde zu einem Core führen

    zu einem kern? wessen? des pudels?



  • irre levant schrieb:

    code_pilot schrieb:

    Ein erneuter Aufruf würde zu einem Core führen

    zu einem kern? wessen? des pudels?

    Man merkt, das auf diesem Board nur blöde kleine dumme Kinder anzutreffen sind, die absolut keine Ahnung haben, was das Wort "Compiler" auch nur im Ansatz bedeutet.

    Kennst du eigentlich den Spruch "Wenn man keine Ahnung hat, einfach mal Fresse halten."? Jetzt setzt dich erstmal vor deine X-Box und spiel'ne runde, bevor du noch was sinnvolles lernst.

    ~cp



  • code_pilot schrieb:

    Es geht darum, das ich die Funktion mit variabler Anzahl Aufrufen möchte. Die Anzahl der Argumente weis ich aber nicht wo ich den Code schreibe, sondern er muss zur Laufzeit durch Benutzer-/Datenbankeingaben generiert werden. Daher kann ich nicht pauschal eine feste Anzahl von Argumenten übergeben, ob 3, 6, 19 oder 500. Der Aufruf selber soll DYNAMISCH sein.

    dann ist dein Ansat mit va_list falsch. 1. man sollte nicht va_list an Elipsen übergeben [1] und 2. mit Ellipsen steht schon vor der Kompilierung der Datei die Anzahl der Parameter fest.

    Wenn die Anzahl der Parameter erst zur Lauzeit bekannt ist, dann musst du den Vorschlag von CStoll nehmen: Arrays oder linked lists verwenden.

    [1] Ellipse ist eine Funktion mit belibiger Anzahl von Parametern



  • irre levant spart sich in Zukunft solche Kommentare und code_pilot spart sich solche Reaktionen.


Anmelden zum Antworten