va_arg



  • Hallo zusammen,

    bin relativ ein C++-Newbie und braeuchte eure Hilfe bei dieser Schulaufgabe.

    In dieser Methode gibt es eine Exception, und ich weiss nicht wieso:

    void checkTier(Tiergruppe* familie, string tier, ...)
    {
    	HaustierBasis* endTier = 0;
    	string object = tier;
    	va_list Parameter;			// Zeiger auf Argumentliste 
    	va_start(Parameter, tier);	// gehe zur ersten Position der Liste
    	while(object != "0")		// Schleife, solange Uebergabeparameter nicht 0
    	{
    		endTier = familie->getTier(object);
    		object = va_arg(Parameter, string); // nächstes Argument an object zuweisen, Typ string
    	}
    	if(endTier == 0)
    	{
    		cout << "n.a." << endl;
    	}
    	else
    	{
    		cout << endTier->getBesitzer() << endl;
    	}
    }
    

    Kann mir da jemand weiterhelfen? Danke schon im Voraus.



  • Dein größtes Problem ist, dass variable Argumentlisten kein eingebautes Ende-Kennzeichen oder Zähler haben. Schon garnicht den String "0". Du musst die Anzahl der Parameter übergeben, um sie durchzuzählen.

    Dazu kommt dann, dass Du via "..." keine Objekte übergeben darfst, nur PODs. Du versuchst hier aber Strings aus der variablen Argumentliste zu lesen.

    Noch besser wäre es natürlich, auf die Ellipse gleich zu verzichten. Ellipsen in C++ stinken gewaltig 😉



  • Die Ellipsen hat C++ von C geerbt - die kommen leider nicht besonders gut mit C++ Datentypen (wie std::string) zurecht. Das ist wohl eine der wenigen Situationen, wo du mit char* besser beraten bist.



  • OK, danke vielmals, haette gedacht ich muesste viel laenger auf eine Antwort warten, ging ja recht zackig hier 🙂 . Es hat uebrigens geklappt mit char*, werde die Ellipse in Zukunft versuchen zu vermeiden.



  • Kernighan schrieb:

    ...werde die Ellipse in Zukunft versuchen zu vermeiden.

    Ist eine gute Entscheidung !!

    Sooo stark limitiert einen das übrigens nicht, da man sowieso in den allermeisten Fällen "ähnliche" Objekte (derselbe Typ oder zumindestens gemeinsame Basisklasse) übergibt ... und dafür gibt's ja die Container wie vector&Co, die eine beliebige Anzahl von Objekten aufnehmen können.

    Gruß,

    Simon2.



  • Oder man guckt sich mal an, wie es in boost::format gemacht ist 😛


Anmelden zum Antworten