kuekenMcNugget Geschrieben 7. August 2002 Geschrieben 7. August 2002 Hi @ all, ich habe ein keines Problem. Ich will eine Funktion einen String übergeben, dieser soll aber nicht bei jedem Funktionsaufruf mit übergeben werden. Beispiel: Funktionskopf: void funktion(char *string1, char *string2, char *string3, char *string4) { ... } Es kommt aber auch vor, dass die Funktion nur mit drei Übergabeparametern aufgerufen wird, was ich auch nicht änder kann bzw. darf. funktion(string1, string2, string3); Also wie mache ich es, das "String 4" nicht mit übergeben werden muss? Zitieren
kingofbrain Geschrieben 7. August 2002 Geschrieben 7. August 2002 Du definierst zwei Methoden. Eine mit 3 Parametern, eine mit 4. Das heisst überladen. Wird die Methode mit 3 Parametern aufgerufen, wird Methode 1 abgearbeitet, ansonsten Methode 2. k.o.b Zitieren
Klotzkopp Geschrieben 7. August 2002 Geschrieben 7. August 2002 Alternativ kann man die Funktion auch so deklarieren: void funktion(char *string1, char *string2, char *string3, char *string4 = NULL ) Zitieren
kuekenMcNugget Geschrieben 7. August 2002 Autor Geschrieben 7. August 2002 Die Methode kenn ich, aber geht das nicht nur bei c++? Bei meinen Programm handelt sich um eine Unix-Anwendung und ist mit c geschrieben! Zitieren
kuekenMcNugget Geschrieben 7. August 2002 Autor Geschrieben 7. August 2002 @Klotzkopp Habe deine Version ausprobiert und bekomme folgende Fehlermeldung. Wie gesagt arbeite ich auf einen Unix System. "Error parsing parameter list. Found "=" when expecting one of: ",", ")". (notexpecting)" Trotzdem Danke Zitieren
Klotzkopp Geschrieben 7. August 2002 Geschrieben 7. August 2002 Original geschrieben von kueken_Mac_Nugget @Klotzkopp Habe deine Version ausprobiert und bekomme folgende Fehlermeldung. Dafür brauchst Du auch C++. Letzte Möglichkeit, die mir einfällt: void funktion(char *string1, char *string2, char *string3, ... ) Das setzt aber voraus, dass Du anhand der ersten drei Parameter erkennen kannst, ob ein vierter folgt, denn hier bist Du dafür verantwortlich, in der Funktion einen eventuellen vierten Parameter vom Stack zu holen. Zitieren
smokie Geschrieben 7. August 2002 Geschrieben 7. August 2002 Hallo! Eventuell hilft dir va_list weiter. ist in stdarg.h. Da gibt es auch noch einige andere Befehle die die "Argumenten Liste" unterstuetzen. Ein Beispiel: #include <stdarg.h> int find_the_sum(int count, ...) { va_list ap; int i; int total = 0; va_start(ap, count); for (i = 0; i < count; i++) total += va_arg(ap, int); va_end(ap); return total; } int other_function(void) { return find_the_sum(6, 1, 2, 3, 4, 5, 6); } smokie Zitieren
Crush Geschrieben 7. August 2002 Geschrieben 7. August 2002 !!! Warnung !!! Folgendes Beispiel ist alles mögliche, nur kein sauberer Programmierstil!!! Oh, ich war auch gerade dabei eine Lösung mit der Aurufliste zu machen, allerdings wollte ich gerne den unnötigen 1. Parameter abschütteln oder wenigstens hinten dran setzen. Bei der Parameterliste muß man die Anzahl der Parameter üblicherweise angeben, aber es gibt auch die Möglichkeit das Ganze durch eine Endkennung zu regeln und den etwas nervigen 1. Parameter zu eliminieren, wobei man allerdings etwas unfein am Code herumschrauben muß - es ist natürlich seeeehr fragwürdig, ob der Stack bei anderen Prozessoren so abgearbeitet wird (eher nein), bzw. hat auch die Codegenerierung vom Compiler dabei ein Wörtchen mitzureden. Hat man allerdings den richtigen Offset rausgefunden ist das Programm jedenfalls auf der eigenen Rechnerarchitektur korrekt lauffähig. Da ich sowas Extremes gerne mache tu ich das einfach... aber bitte nicht nachmachen!!! // So hätte ich gerne den Aufruf: funkliste("test1","test2","test3",0); funkliste("nocheintest1","nocheintest2",0); // Sieht doch viel ordentlicher aus! // und das ist die funkliste void funkliste(...) { // das ist mein überflüssiger Dummy-Counter, der halt vom Argumentlisten-Macro verlangt wird // und sinnigerweise auch nicht initialisiert werden muß! int dummycnt; va_list parameter; va_start(parameter,dummycnt); // jetzt wird einfach alles Unnötige auf dem Stack übersprungen, was mich eh nicht interessiert // andere Prozessoren und Small/Tiny-Code-Models müssen diesen Wert evtl. anpassen // das sind nur Rücksprungadressen vom Unterprogrammaufruf, der 1. blöde Parameter und nochwas // Unnötiges was niemanden interessiert parameter+=12; // Auch hier mal wieder ein Dummy, aber diesmal zwangsläufig mit irgendeiner Initialisierung // egal Welcher hauptsache nicht 0 char * t="noch ein dummy"; // da das Abbruchkriterium in der Liste ist können wir uns den überflüssigen Zähler sparen while(t=va_arg(parameter,char*)) TRACE("%s ",t); va_end(parameter); } Klappt! Es gibt noch eine Möglichkeit sogar den letzten Ende-Kennungs-Parameter wegzulassen (Paradox! Alle sagen sowas wäre unmöglich - nicht für mich) und nur die Parameter die auch verwendet werden abzuarbeiten, aber da ich nicht weiß, wie weit das überhaupt von Rechner zu Rechner funktioniert (muß ich mal testen) poste ich das erstmal nicht. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.