Variabler Argumenttyp

ollek81

Erfahrenes Mitglied
Tach!!! :)

Wie bekomme ich das hin, dass ich ner Funktion nen String, char, struktur ODER ne Zahl (int, float usw.) an der SELBEN stelle in der Klammer übergeben kann?? (also die Funktion etwas variabler wird?)
Geht das überhaupt?? :(
wenn ich mit "va_list" ankomme (also die argumente als va_list initialisiere) und ne Struktur übergebe, meckert der irgendwas von "dereferencing ' void *' pointer" , wenn ich auf irgendwas (z.b.: struktur[ i].name) in der Struktur zugreifen will...

In meinem Büchlein steht, va_list würde einen typenlosen Zeiger definieren. Bei mir zeigt der dann auf einen Vector (array) von strukturen...

Weiß jemand Rat?? Fehlt noch was bei der Beschreibung??

Bitte helft mir!!


ollek81
 
Wie bekomme ich das hin, dass ich ner Funktion nen String, char, struktur ODER ne Zahl (int, float usw.) an der SELBEN stelle in der Klammer übergeben kann?? (also die Funktion etwas variabler wird?)
Also ich verstehe zwar net ganz was du meinst, aber ich denke du willst eine struct an eine Funktion übergeben und dann die Werte bearbeiten oder so. Das geht am besten (oder nur) mit Zeiger.

Einfach mal ein Beispiel dazu:

Code:
#include <iostream.h>

struct hallo
{
	int zahl1;
	int zahl2;
	
};
void setZahlen(hallo *myStruct, int z1, int z2);

void main()
{
	hallo meineStruct;

	meineStruct.zahl1 = 5;
	meineStruct.zahl2 = 10;

	cout << "vor der Funktion" << endl;
	cout << meineStruct.zahl1 << endl;
	cout << meineStruct.zahl2 << endl;
        // Der Funktion wird die Adresse der Sturktur übergeben
	setZahlen(&meineStruct, 55, 111);

	cout << "nach der Funktion" << endl;
	cout << meineStruct.zahl1 << endl;
	cout << meineStruct.zahl2 << endl;
}
void setZahlen(hallo *myStruct, int z1, int z2)
{// myStruct ist dann ein Zeiger auf die Struktur
	myStruct->zahl1 = z1;
	myStruct->zahl2 = z2;
}

Gruss Homer
 
N'Abend!

Also: Ich will einmal eine Struktur in die Funktion einlesen, wo ein bestimmtes Teil dieser Struktur dann analysiert wird.
Ein anderes Mal will ich in die selbe Funktion nur'n Integer einlesen, der dann analysiert wird.
Ich poste die struktur und das genauere Prob morgen nochmal..
Nu ist's Bett angesagt..

Gute Nacht!! :)

ollek81
 
Hmm..

Ich dachte da eher an nen Zeiger, der den Typ der eingegebenen Variablen übernimmt... Egal! Ich mach jetzt erstmal das Prog fertig und kümmer mich dann um diesen Schnickschnack!! Wird's halt erstmal 10 Zeilen länger...



ollek81
 
Dazu sind ja die Funktionenüberladungen da, dass du genau sowas machen kannst...
Es ist ja auch besser, wenn du für verschiedene Typen verschiedene Funktionen hast...
 
Hi!!

Meinst du mit funktionsüberlagerung, dass ich im prinzip ne zeigerfunktion definiere, die dann auf die entsprechende Funktion zeigt? (Sorry hab erst vor ner Woche mit C angefangen)
Naja, aber ich werd jetzt wohl einfach nur ne zweite Funktion machen und gut. Das mit der Stuktur ist glaub ich etwas zu speziell.

trotzdem Danke!!!

ollek81
 
Ich kenns nur von c#..
Da definierst du eine neue Funktion, deren Basis die ursprüngliche ist.
Indem du als Übergabewert einen anderen Variablentyp nimmst, wird entschieden, welche Funktion nun die richtige ist.
Funktioniert, da man eben für jeden auftretenden Datentyp eine Funktion erstellt.
 
Das funktioniert in C++ genauso. Das Funktionen-Überladen, macht dann in verbindung mit Klassen richtig Sinn, wenn man das Prinzip mal verstanden hat, dann erkennt man erst, was C/C++ von anderen Sprachen wirklich unterscheidet.

Beispiel:
Code:
#include <stdio.h>
void addiere(int zahl1, int zahl2);
void addiere(double zahl1, double zahl2);

void main()
{
   int z1 = 10;
   int z2 = 20;
   double z3 = 23.54;
   double z4 = 67.34;

   addiere(z1,z2);
   addiere(z3,z4);
}




void addiere(int zahl1, int zahl2)
{
   int erg;
   erg = zahl1 + zahl2;
   printf("%d\n", erg);
}

void addiere(double zahl1, double zahl2)
{
   double erg;
   erg = zahl1 + zahl2;
   printf("%f\n", erg);
}
Die Funktion addiere() wird einfach überladen.

Gruss Homer
 
Aha!!!
Jetzt peile ich das auch!!
Na, da werd ich mich dann mal demnächst dransetzen!

Besten Dank an euch beide!!!


ollek81
 
Zurück