Zum Inhalt springen

String optional übergeben


kuekenMcNugget

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

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