Unter g++ gehts.. unter Windows nicht



  • #include <iostream>
    #include <string>
    #include <sstream>
    #include <ctime>
    using namespace std;
    
    const char* foo()
    {
            ostringstream Str;
            long i=rand()%5, j=rand()%5, k=rand()%5, l=rand()%5;
    
            for(int a=1;a<4;++a)
                    if(i==172 && j==a)
                    {
                            return foo();
                            break;
                    }
    
            Str << i << '.' << j << '.' << k << '.' << l ;
    
            string temp(Str.str());
    
            return (temp.c_str());
    }
    
    int main()
    {
    
            srand((unsigned)time(NULL));
    
            while(1)
                cout << "zahl:\t" << foo() << endl;
    
            return 0;
    }
    

    Die Funktion generiert Zufallszahlen mit 4 stellen, die durch einen punkt getrennt sind. Das Programm laesst sich kompilieren.
    Unter Linux mit g++ funktioniert es soagr.
    Unter Windows mit Visual Studio nicht.
    Was mache ich denn falsch?

    Es kommt immer sowas unter win raus

    zahl:    ||||||||||||||||||||||@
    

    MfG



  • Die Variable temp lebt nur so lange, wie foo() ausgeführt wird. In main() versuchst Du demnach auf eine Zeichenkette zuzugreifen, die eignetlich gar nicht mehr exististiert.
    Daher kann Dein Programm eigentlich gar nicht richtig funktionieren. Mit dem gcc hast Du dann wohl bisher immer das Glück gehabt, dass der Speicher noch nciht wieder überschrieben wurde.



  • Problemhaber schrieb:

    if(i==172 && j==a)
                    {
                            return foo();
                            break;
                    }
    

    kanns sein dass die stelle recht unsinnig is? weil du machst ja oben

    i=rand()%5
    

    was dann bedeutet, dass i ne zahl zwischen 0 und 4 ist und somit NIE nich 172 werden kann doer seh ich das falsch?



  • Ist natuerlich unsinnig ... war nur ein Beispiel.
    Haette sinnvoller 2 nehmen sollen



  • Asgard schrieb:

    Die Variable temp lebt nur so lange, wie foo() ausgeführt wird. In main() versuchst Du demnach auf eine Zeichenkette zuzugreifen, die eignetlich gar nicht mehr exististiert.
    Daher kann Dein Programm eigentlich gar nicht richtig funktionieren. Mit dem gcc hast Du dann wohl bisher immer das Glück gehabt, dass der Speicher noch nciht wieder überschrieben wurde.

    Kannst du bitte Zeigen wie man es richtig macht einen char* zurückzugeben.



  • string foo()
    {
            ostringstream Str;
            long i=rand()%5, j=rand()%5, k=rand()%5, l=rand()%5;
    
            for(int a=1;a<4;++a)
                    if(i==172 && j==a)
                    {
                            return foo();
                            break;
                    }
    
            Str << i << '.' << j << '.' << k << '.' << l ;
    
            string temp(Str.str());
    
            return temp;
    }
    


  • Wenn es auf unbedingt ein char* sein soll, würde ich es wahrscheinlich so machen (ist zumindest eine Möglichkeit):

    const char* foo(string& temp)
    {
    //alles wie bei Dir
      return temp.c_str();
    }
    
    int main()
    {
      srand((unsigned)time(NULL));
      string temp;
      while(1)
      {
        cout << "zahl:\t" << foo(temp) << endl;
      }
      return 0;
    }
    


  • Asgard schrieb:

    Die Variable temp lebt nur so lange, wie foo() ausgeführt wird. In main() versuchst Du demnach auf eine Zeichenkette zuzugreifen, die eignetlich gar nicht mehr exististiert.
    Daher kann Dein Programm eigentlich gar nicht richtig funktionieren. Mit dem gcc hast Du dann wohl bisher immer das Glück gehabt, dass der Speicher noch nciht wieder überschrieben wurde.

    Asgard schrieb:

    Wenn es auf unbedingt ein char* sein soll, würde ich es wahrscheinlich so machen (ist zumindest eine Möglichkeit):

    const char* foo(string& temp)
    {
    //alles wie bei Dir
      return temp.c_str();
    }
    
    int main()
    {
      srand((unsigned)time(NULL));
      string temp;
      while(1)
      {
        cout << "zahl:\t" << foo(temp) << endl;
      }
      return 0;
    }
    

    Hä?? Kann doch wohl nicht oder?



  • Was kann nicht sein?



  • Sorry, habe die Referenz übersehen.



  • Hi,

    wieso lässt du dir nicht den string returnen und wandelst ihn dann in einen c_str um( in der Aufruffunktione, z.B. main()) ?

    Gruß, '][' !



  • Muss man hier immer eine Variable als Parameter übergeben wenn man etwas zurückgeben will.

    Geht nicht auch

    string funktion()
    {
    
    string test("hallo");
    
    return test;
    }
    


  • was mach ich dann bei sowas

    int main()
    {
    
    foo("hallo");
    
    }
    
    string foo(string test)
    {
    
    return test;
    }
    


  • nixwissen schrieb:

    Muss man hier immer eine Variable als Parameter übergeben wenn man etwas zurückgeben will.

    Ne, musst Du natürlich nicht. Eine Funktion wie

    string func() 
    { 
      string test = "bla"; 
      return test; 
    }
    

    funktioniert durchaus.
    Du musst allerdings beachten, dass hier nicht die Variable test zurückgegeben wird, sondern eine Kopie von ihr.
    Wenn eine Funktion jedoch einen const char* zurückgibt, so wird im Prinzip eine Adresse zurückgegeben - nämlich die, auf die der Pointer zeigt. Es wird keine Zeichenkette kopiert oder sowas. Das heißt, das in Deinem Fall eine Adresse von etwas zurückgegeben wird, das nach Beenden der Funktion nicht mehr existiert.


Anmelden zum Antworten