Problem mit Funktions Rückgabewert



  • Hallo wie kann ich den User Name in mein Hauptprogramm bekommen ?

    In der Funktion kann ich mir den Namen ja ausgeben lassen aber ich möchte den gerne im Hauptprogramm erst ausgeben.

    Hier mein Ansatz:

    Aber da bekomme ich nur irgendwelche Zahlen ausgeben.

    #include <iostream>
    #include <windows>
    #include <sstream>
    using namespace std;
    
    int user ();
    
    int main(int argc, char* argv[])
    {
    
    int var;
    string user_name;
    
    var = user();
    
    stringstream int_to_str;
    
            int_to_str << var;
            int_to_str >> user_name;
    
    cout<< user_name;
    
    system("PAUSE");
    
    return 0;
    }
    
    int user()
    {
    
    char name[100];
    int ret;
    
    stringstream str_to_int;
    string str_ret;
    
    DWORD length = sizeof(name);
    GetUserName( name,  &length );
    
            str_ret = name;
    
            str_to_int << str_ret;
            str_to_int >> ret;
    
    return ret;
    }
    


  • Wieso konvertierst du in der Funktion mit Stringstreams herum? Gib einfach nen std::string zurück.



  • Weil man einen string nicht einfach so zurück geben kann.

    int user()
    {
    
    char name[100];
    
    string str_name;
    
    DWORD length = sizeof(name);
    GetUserName( name,  &length );
    
    str_name = name;
    
    return str_name;
    }
    


  • ??
    Wie wäre es, wenn du den Rückgabetypen anpasst?

    string user()
    {
    
    char name[100];
    
    string str_name;
    
    DWORD length = sizeof(name);
    GetUserName( name,  &length );
    
    str_name = name;
    
    return str_name;
    }
    

    Ich würde sagen, dass es noch besser geht, aber ohne zu wissen, wie GetUserName arbeitet kann ich keinen Vorschlag machen.
    Aber das gezeigte sollte ohne Probleme funktionieren..



  • Ja so gehts ty.



  • > Ich würde sagen, dass es noch besser geht, aber ohne zu wissen, wie GetUserName arbeitet kann ich keinen Vorschlag machen.

    Musst du auch nicht wissen. Aber da es eh eine Value-Rückgabe ist, kann man sich die Bytes RAM für den string in der Funktion sparen.

    string user() {
       char name[100];
       DWORD length = sizeof(name);
       GetUserName(name,  &length);
       return name;
    }
    


  • Ad aCTa schrieb:

    Musst du auch nicht wissen. Aber da es eh eine Value-Rückgabe ist, kann man sich die Bytes RAM für den string in der Funktion sparen.

    Wenn man auf Performance aus ist, kann man auch gleich das Array ausserhalb der Funktion deklarieren und so eine std::string -Konstruktion sparen.

    Wie sehr sich das lohnt, ist wieder eine andere Frage.



  • Ad aCTa schrieb:

    > Ich würde sagen, dass es noch besser geht, aber ohne zu wissen, wie GetUserName arbeitet kann ich keinen Vorschlag machen.

    Jop, aber ich meinte eigentlich eher das hier:

    char name[100];
    

    Warum sollte man sich da auf 100 Zeichen beschränken? - Ich denke mal, dass man GetUserName entsprechend anpassen könnte, dass es da keine solche sinnlose Beschränkung gibt. (Mir ist klar, dass ein Name kaum über 100 Zeichen hat, aber man könnte das ja über einen Parameter steuern, wenn es denn sein muss).



  • "Warum sollte man sich da auf 100 Zeichen beschränken?"

    Jopp - imho gibts da auch ne WinAPI fkt., die die max. länge zurückgibt (imho aber wiederrum nur die theoretisch max. und nicht die praktische max.-länge). wenn man die nicht verwenden will, hat man allerdings eh immer nen ausdruck, der zur compilezeit bekannt ist - es sei denn, man will den nutzer davor fragen, wie lang sein nutzername wird... aber dann könnte man sich wohl auch den aufruf an sich sparen und gleich nach dem namen fragen ;o)



  • Ausschnitt aus der WinAPI-Hilfe:

    GetUserName
    ...
    If this buffer is not large enough to contain the entire user name, the function fails.

    d.h. um den kompletten Namen sicher zu erhalten müßte man dynamisch die Funktion mit einem immer größeren Buffer aufrufen (andererseits müßten 100 Zeichen schon reichen).



  • ok, die fkt gibts doch nicht, von der ich dachte, dass es sie geben würde ;o)
    hier kann aber ne konstante genommen werden:
    32767

    bb


Log in to reply