Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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?

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

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!

@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

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.

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

!!! 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 Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.