Frage



  • Hallo,

    Ich lherne programmiren seit phar Tage und von da her kann noch nix großes machen.
    Aber schon bei was kleines kommt bei mir zu Problem.

    Ich will das zB wenn ich in Console eine Name angebe der mir zurück kommentar gibt. (So weit könnte ich noch)aber jetzt will ich das wenn ich eine Vor Name eingebe der fragt genau welche vor geschwister oder so.
    mein cod siet so aus :

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    string podebnike(string pPodebnike)
    {
    	if (pPodebnike == "Damian")
    	{
    		return "POlle";
    	}
    	else (pPodebnike == "Daniel")
    	{
    		return "Rapper";
    	}
    }
    
    string werten(string pName)
    {
    	string podebnike;
    	if (pName == "Podebnik")
    	{	cout << "welchen Damian oder Daniel?";
    		cin >> podebnike;
    		cout<< podebnike(podebnike) << endl;
    	}
    	else 
    	{
    		cout << "Name nicht gefunden" << endl;
    	}
    }
    
    int main()
    {	
    	string name;
    	cout<< "Bitte ein Name: ";
    	cin>> name;
    	cout<< werten(name) << endl;
    	return 0;
    }
    

    auf mein einblick ist da alles richtig geschrieben. Leider es zeigt einige feller :
    neu.cpp: In function ‘std::string podebnike(std::string)’:
    neu.cpp:14:2: error: expected ‘;’ before ‘{’ token
    neu.cpp: In function ‘std::string werten(std::string)’:
    neu.cpp:25:29: error: no match for call to ‘(std::string) (std::string&)’

    wird mich freuen wenn einer könnte mir mein veller koregiren und versuchen es deutlich zu erkleren wo mein feller war damit bei nextem mall ich es seber weiß.

    Danke vor raus



  • Fehler 1: Du hast das if vergessen (oder das (pPodebnike == "Daniel") zu viel).
    Fehler 2: Die lokale Variable podebnike hat den selben Namen wie die Funktion, die du da aufrufen willst. Dadurch ist die Funktion überdeckt und kann nicht verwendet werden.

    PS: Wenn du nicht so gut deutsch kannst, die meisten hier verstehen auch Englisch 😉



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Leider hab ich immer noch mein Feler nicht verstanden ,

    tut mir leid wegen mein Deutsch aber Eng weiß ich gar nichts 😞
    hoffe es stört nicht so sher.



  • #include <iostream> 
    #include <string> 
    
    using namespace std; 
    
    string podebnike(string pPodebnike) 
    { 
        if (pPodebnike == "Damian") 
        { 
            return "POlle"; 
        } 
        else if(pPodebnike == "Daniel")  // hier!
        { 
            return "Rapper"; 
        } 
    } 
    
    string werten(string pName) 
    { 
        string temp; // hier!
        if (pName == "Podebnik") 
        {    cout << "welchen Damian oder Daniel?"; 
            cin >> temp; 
            cout<< podebnike(temp) << endl; 
        } 
        else 
        { 
            cout << "Name nicht gefunden" << endl; 
        } 
    } 
    
    int main() 
    {    
        string name; 
        cout<< "Bitte ein Name: "; 
        cin>> name; 
        cout<< werten(name) << endl; 
        return 0; 
    }
    


  • neu.cpp: In function ‘std::string podebnike(std::string)’:
    neu.cpp:14:2: error: expected ‘;’ before ‘{’ token

    Du kannst eine Bedingung wie "(pPodebnike == "Daniel")" nicht frei in den Raum stellen, da gehört eine Anweisung (if oder while) dazu. Also entweder du ergänzt das if dort oder du lässt diese Bedingung weg.

    neu.cpp: In function ‘std::string werten(std::string)’:
    neu.cpp:25:29: error: no match for call to ‘(std::string) (std::string&)

    Du hast eine Funktion und eine lokale Variable, die beide den selben Namen "podenike" haben. Die Variable ist an der markierten Stelle im nächstgelegenen Scope, deshalb überdeckt sie die gleichnamige Funktion - und du versuchst dort, die Variable als Funktion (oder Funktor) zu verwenden.



  • Hallo

    Also noch mal genauer
    1.

    if ...
        {
            ...
        }
        else if (pPodebnike == "Daniel") // Hier entweder noch ein if einfügen...
        {
            ...
        } 
    
        else  // ... oder die Bedingung ganz weglassen, je nachdem was du erreichen willst
        {
        }
    
    string podebnike;
    ...
    cin >> podebnike;
    cout<< podebnike(podebnike) << endl; // Hier kann der Compiler die Funktion
      podebnike nicht mehr aufrufen, weil es einen string mit gleichem Namen gibt.
    // Benenn den String anders
    

    bis bald
    akari

    /Edit : Hm, immerhin sollte jetzt keine Frage mehr offen sein 😉



  • Alles klar 🙂
    Danke sehr an alle .

    nur jetzt bei start der Programm macht der feller:
    �-Speicherzugriffsfehler
    leigt das an cod oder an converter?



  • Die Funktion werten() benötigt auch eine return-Anweisung. Aber was für einen Compiler verwendest du, der dich nicht auf sowas hingewiesen hat?



  • Ich habe standtart von Ubuntu schon ein draf , welches genau das ist weis nicht.


  • Mod

    Das ist der GNU Compiler, bei dem ist das auch normal, dass der nicht davor warnt, wenn du keine Warnoptionen eingestellt hast. Was uns zum nächsten Punkt bringt: Compiliere als Anfänger immer mit allen Warnungen und siehe Warnungen als Fehler an. Beim GNU Compiler sind das die Schalter -Wall und -Wextra und optional noch -pedantic.



  • gcc, und der lässt sowas eig. nicht zu ;O



  • Ein "missing return-statement" ist lediglich ein warning ? Echt?


  • Mod

    cvcv schrieb:

    Ein "missing return-statement" ist lediglich ein warning ? Echt?

    Ja! Und noch nicht einmal eine der Standardwarnungen die er auch ohne Warnoptionen bringt. Der Grund ist glaube ich, dass irgendwo in der Anleitung definiert ist, was genau da passiert. Und er geht davon aus, dass du diesen Abschnitt in der Anleitung kennst (ich kenne ihn nicht auswendig, daher kann ich ihn nicht zitieren) und das dort definierte Verhalten ausnutzt. It's not a bug, it's a feature! 🕶

    edit: Das obige muss ich korrigieren: Es ist undefiniert! Und die Begründung, warum das nicht als Fehler gilt ist, dass das vom Standard ausdrücklich nur als undefiniertes Verhalten "definiert" wird. Und undefiniertes Verhalten ist kein Compilerfehler. Ich denke mal der Grund, warum das im Standard so gehandhabt wird, wird sein, damit man den Compilern keine umfangreiche statische Codeanalyse aufzwängt, die letztendlich sowieso scheitern muss, wenn auch noch äußere Einflüsse hinzukommen.



  • wie kann ich das also verändern?
    tut mir leid das ich so viele fragen stelle , hoffe belestigt hir keinen 😉


  • Mod

    -ProGresS- schrieb:

    wie kann ich das also verändern?
    tut mir leid das ich so viele fragen stelle , hoffe belestigt hir keinen 😉

    Kommt drauf an, wie du compilierst. Auf der Kommandozeile schreibst du einfach g++ -Wall -Wextra .... , falls du eine IDE verwendest, wirst du dieser mit Sicherheit auch irgendwelche Optionen geben können und bei einem Makefile ist die dafür vorgesehene Variable traditionell CXXFLAGS.



  • Du kannst am Ende der Funktion ein return "echo"; hinschreiben, damit die main() auch etwas hat, was sie ausgeben kann.

    Und für die Zukunft: Alle Compiler-Warnungen einschalten und ein gutes Buch zum Umgang mit C++ besorgen.



  • ;O D.h er bastelt am Ende aber schon irgendein return-statment hin ( der compiler ) ?

    Weil was sollte sonst hier passieren

    int function_that_doesnt_return() {
        std::cout << "I wont return ;) " << std::endl;
    }
    int uninitialised;
    uninitialised = function_that_doesnt_return();
    

  • Mod

    cvcv schrieb:

    ;O D.h er bastelt am Ende aber schon irgendein return-statment hin ( der compiler ) ?

    Weil was sollte sonst hier passieren

    int function_that_doesnt_return() {
        std::cout << "I wont return ;) " << std::endl;
    }
    int uninitialised;
    uninitialised = function_that_doesnt_return();
    

    Ich weiß jetzt nicht wie die calling conventions intern genau funktionieren, aber da ist ja sicherlich irgendwo ein Speicherbereich für die Rückgabe einer Funktion. Und wenn die einfach so endet ohne etwas hinein zu schreiben, dann steht da das gleiche wie vorher, also irgendwelcher Müll, wie bei einer uninitialisierten Variablen.

    Soweit ich weiß ist das in C übrigens kein undefiniertes Verhalten, solange man die Rückgabe nicht benutzt.



  • jetzt aber was ich nicht ferstanden habe
    wenn ich compelire mit g++ neu.cpp -o neu Zeigt der am ende :
    Speicherzugriffsfehler
    wenn ich g++ neu.cpp -o neu -Wall -Wextra zeigt der noch mher Feller:
    neu.cpp: In function ‘std::string werten(std::string)’:
    neu.cpp:33:1: warning: no return statement in function returning non-void
    neu.cpp: In function ‘std::string podebnike(std::string)’:
    neu.cpp:18:1: warning: control reaches end of non-void function
    nick@nick-GA-790XTA-UD4:~/Arbeitsfläche/c++$

    was bringt also -Wextra und -Wall

    danke sher für denn Tip. ich hab in moment 2 c++ Bücher aber leider ferstehe ich nicht alles da drine und wenn ich nicht probire lehrne ich nix.
    IN moment das was in buch beschriben ist und die praktische aufgaben dazu kann ich amchen aber wenn ich wie jetzt versuche daraus was bischen großeres machen wird schon zu problem. Und glaube nur so kann man es lehrnen


Anmelden zum Antworten