string zwischen Funktionen übergeben



  • Hallo,

    ich möchte durch eine Auswahl zwei jeweils verschiedene strings übergeben. Hier der Code, zur Auswahl und zu Übergabe der strings:

    #include <iostream.h>
    
    int  Menueanzeige_eingabe();
    void Eingabe();
    
    void Menue_fuer_eingabe()
    {
    	bool exit = false;
        for (;;)
        {
    		int Auswahl = Menueanzeige_eingabe();
            switch(Auswahl)
            {
    			case (1):
                   Eingabe("torhueter.txt", "Torhueter");
                   break;
    
    			case (2):
                   Eingabe("verteidiger.txt", "Verteidiger");
                   break;
    

    In Zweile 4 wird die Funktion void Eingabe() definiert. In Zeile 16 soll er im case 1, was durch den Benutzer geschieht, den string "torhueter.txt" und "Torhueter" übergeben. Im case 2 eben die ganze Sache mit Verteidiger (insgesamt gibt es 4 cases). Zum Aufruf der Funktion void Eingabe() in einer anderen Header Datei verwende ich folgenden Code:

    void Eingabe(string dateiname, string position)
    {
    	ofstream dat_aus;													/
    	dat_aus.open(dateiname.c_str(), ios_base::out);					
    
    	int i,n;
    
    	cout << "Wieviele " << position << " sollen eingegeben werden: ";
    	cin >> n;
    

    Allerdings mache ich scheinbar einen dummen Fehler, auf den ich nicht komme, denn bim Kompilieren gibt er mir folgenden Fehler aus:

    menue_fuer_eingabe.h(20) : error C2660: 'Eingabe' : Funktion akzeptiert keine 2 Parameter

    Kann mir jemand den Fehler nennen, der ich hier mache? Bzw ne Lösung, wie ich es besser mache...



  • wenn du void Eingabe(); (bei der Deklaration) schreibst erwartet C++ auch (im Gegensatz zu C, wenn ich mich richtig erinnere) keinen Parameter. (bei Cs hieß es glaub ich, dass beliebig viele Paramter übergeben werden können) Du übergibst 2, er erwartet 0, ergo funktionniert es nicht.

    funktionnieren sollte:

    #include <string>
    void Eingabe(std::string s1,std::string s2);
    

    Anfängerantwort, Vertrauen bitte erst nach Bestätigung.



  • Danke Shinja!

    Hat irgendwie nicht ganz damit funktioniert, aber du hast mich auf den richtigen weg gebracht! Ich hab nun folgenden Quellcode in meinem Menü:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int  Menueanzeige_eingabe();
    void Eingabe(string a, string b);
    
    void Menue_fuer_eingabe()
    {
    	bool exit = false;
        for (;;)
        {
    		int Auswahl = Menueanzeige_eingabe();
            switch(Auswahl)
            {
    			case (1):
                   Eingabe("torhueter.txt", "Torhueter");
                   break;
    
    			case (2):
                   Eingabe("verteidiger.txt", "Verteidiger");
                   break;
    

    Damit funktioniert es nun!



  • Eine Kleinigkeit noch:

    void Eingabe( std::string const& a, std::string const& b);
    

    Ist einen Hauch effizienter, da die Strings nicht kopiert werden.



  • Hmm, aber da bekomme ich folgenden Fehler:

    error LNK2001: Nichtaufgeloestes externes Symbol "void __cdecl Eingabe(class std::basic_string<char,struct std::char_traits<char>,(...)



  • Deine Definition muss dann natürlich auch mit Referenzen auf konstante Strings arbeiten.



  • finix schrieb:

    Eine Kleinigkeit noch:

    void Eingabe( std::string const& a, std::string const& b);
    

    Ist einen Hauch effizienter, da die Strings nicht kopiert werden.

    Naja, optimistisch gesehen, ist der std::string mit Copy-on-Write implementiert. Sollte zumindest eine gut implementierte Std-Lib leisten. Von daher wäre ein No-Ref-Parameter kein Beinbruch, wenn man Refs aus reinen Performance-Gründen wählt.



  • Artchi schrieb:

    Naja, optimistisch gesehen, ist der std::string mit Copy-on-Write implementiert. Sollte zumindest eine gut implementierte Std-Lib leisten. Von daher wäre ein No-Ref-Parameter kein Beinbruch, wenn man Refs aus reinen Performance-Gründen wählt.

    Naja, realistisch gesehen macht der Standard keinerlei Vorgaben zu COW. Von daher hast du keine Ahnung wie's in der nächsten Version deiner Implementation aussieht, oder bei der Implementation deines Nachbarn, oder was sonst noch eine Rolle spielen könnte.

    Außerdem: Google: Copy-on-Write multi-threaded


Anmelden zum Antworten