Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben

@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

Geschrieben
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.

Geschrieben

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

Geschrieben

!!! 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.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...