Fehler bei Funktionsaufruf mit cout



  • Hi Leute,

    Ich schreibe garde an einem Programm,dass überprüft ob der eingegebene Satz ein korrekter deutscher Satz ist. Das Vokabular ist zwar noch sehr klein aber das spielt jetzt keine Rolle.

    Das eigentliche Problem liegt darin dass der Compiler aufgrund eines Fehlers mich das Programm nicht debuggen lässt.

    Die Fehlermeldung lautet:
    Fehler 1 error C3861: "sub_verb": Bezeichner wurde nicht gefunden.Zeile 26

    Warum kann main() denn sub_verb() nicht ausgeben? was läuft da falsch?

    #include "../../../std_lib_facilities.h"
    #include "conio.h"
    
    	vector<string>words;
    	string word;
    	int i;
    	string verb1 = "rechnen";
    	string verb2 = "schwimmen";
    	string verb3 = "fliegen";
    
    	string sub1 = "Computer";
    	string sub2 = "Fische";
    	string sub3 = "Vögel";
    
    int main()
    {
    
    	while(cin>>word){
    		words.push_back(word);
    	}
    
    	cout<< sub_verb() <<"\n";
    
    }		
    
     //.....................................Substantiv Verb..........................
    
    int sub_verb()
    {
    	for(int i = 0; i<words.size(); ++i)
    	   if (words [i] == sub1||words [i+1] == sub2||words [i+1] ==sub3){
               if (words[i+1]== verb1||words[i]==verb2||words[i]==verb3){
    
    			   return '1';
    		   }
    	   }
    }
    


  • Hast du schonmal von Forward-Deklarationen gehört?

    Ansonsten: Wenn du jedes Wort in einer eigenen Variablen speicherst, bist du nicht besonders flexibel - stell dir mal deine if()-Bedingungen vor, wenn du bei 2000 Wörtern angekommen bist.

    PPS: Ein ehrgeiziges Projekt 👍



  • Hi, setz mal
    ein

    int sub_verb()
    

    vor die main()

    PS: Wie willst du checken ob ein Satz ein korrekter Satz ist, wenn es Mehrdeutigkeiten gibt?



  • Ich vermute mal er wird eher an eine Rechtschreibkorrektur denken.



  • Nein, ich möchte ein Programm schreiben, dass einen Satz nach seiner richtigkeit überprüft.



  • Golfi1812 schrieb:

    Nein, ich möchte ein Programm schreiben, dass einen Satz nach seiner richtigkeit überprüft.

    Wie gesagt, ein ehrgeiziges Projekt - noch nicht einmal MS Word kriegt das immer richtig hin.
    (PS: Ist der Satz "Fische fliegen" für dirch eigentlich richtig?)



  • Topic schrieb:

    Hi, setz mal
    ein

    int sub_verb()
    

    vor die main()

    Eher ein

    int sub_verb();
    

    , sonst kommt er gleich und beschwert sich über neue Fehlermeldungen vom Compiler 😉

    Wenn du mehrere Funktionen hast, eignen sich auch Header und die dazu passenden Implementationsdateien anstatt alles in eine Datei zu hauen.
    Und wenn dein Projekt größer wird, würde ich mir auch mal was anderes wegen den globalen Variablen überlegen, denn wenn du da Tausende von hast, ist das gar kein guter Stil.

    Lg freeG



  • Habs hinbekommen:

    #include "../../../std_lib_facilities.h"
    #include "conio.h"
    
    	vector<string>substantive;
    	vector<string>konjunktion;
    	vector<string>verben;
    
    	void init()
    	{
    		substantive.push_back("Vögel");
    		substantive.push_back("Computer");
    		substantive.push_back("Fische");
    
    		konjunktion.push_back("und");
    		konjunktion.push_back("aber");
    		konjunktion.push_back("oder");
    
    		verben.push_back("fliegen");
    		verben.push_back("rechnen");
    		verben.push_back("schwimmen");
    	}
    
    	bool substantiv(string w)
    	{
    		for(int i = 0; i<substantive.size(); ++i)
    			if (w==substantive[i]) return true;
    		return false;	
    	}
    
    	bool verb(string w)
    	{
    		for(int i = 0; i<verben.size(); ++i)
    			if (w==verben[i]) return true;
    		return false;
    	}
    
    	bool konjunktionen(string w)
    	{
    		for(int i = 0; i<konjunktion.size(); ++i)
    			if (w==konjunktion[i]) return true;
    		return false;
    	}
    
    	bool satz()
    	{
    		string w;
    		cin>>w;
    		if(!substantiv(w)) return false;
    
    		string w2;
    		cin>>w2;
    		if(!verb(w2)) return false;
    
    		string w3;
    		cin>>w3;
    		if(w3 == ".") return true;
    		if(!konjunktionen(w3)) return false;
    		return satz();
        }
    
    	int main()
    	{
    		try
    {
    	cout << "Gebven sie einen Satz ein (terminated by a dot):\n";
    
    	init();	
    
    	while (cin) {
    			bool b = satz();
    			if (b)
    				cout << "OK\n";
    			else
    				cout << "not OK\n";
    			cout << "Try again: ";
    	}
    
    	keep_window_open("~");	
    }
    catch (runtime_error e) {	
    	cout << e.what() << '\n';
    	keep_window_open("~");	
    }
    
    	}
    

    Die Eingabe: "Fische schwimmen und Vögel fliegen . " Wir als Okay angezeigt.

    Hingegen: "schwimmen Fische und Vögel fliegen." als falsch.

    Das war mein Ziel.

    mfg Golfi1812



  • Mir ist nur grade aufgefallen,dass er Probleme mit Umlauten hat. In diesem fall Vögel. Das wir als falsch angezeigt wenn es im Satz vorkommt auch wenn alles richtig ist.

    Naja muss eben zu Voegel im vector geändert werden.



  • Was soll das denn sein?

    #include "../../../std_lib_facilities.h"
    


  • Das ist die initialisierung der Standartbibilothek std_lib_facilities.h .

    Sie muss in manchen Fällen mit diesen Vorzeichen ../../../ initialisiert werden,damit sie greift.



  • CStoll schrieb:

    Golfi1812 schrieb:

    Nein, ich möchte ein Programm schreiben, dass einen Satz nach seiner richtigkeit überprüft.

    Wie gesagt, ein ehrgeiziges Projekt - noch nicht einmal MS Word kriegt das immer richtig hin.

    Ist das nicht ein Forschungsgebiet der Linguistik... seit Jahrzehnten?

    Aber ich denke mal, das "Projekt" dient nur zur Übung, und das ist doch 'ne gute Sache. Das Beispiel im Code oben ist jedenfalls aus dem Stroustrup-Buch (dem Lehrbuch, nicht der Bibel).



  • manni66 schrieb:

    Was soll das denn sein?

    #include "../../../std_lib_facilities.h"
    

    Eine Hilfsdatei als "Universalheader" aus genanntem Lehrbuch, in dem für den Anfang kompliziertere Dinge "versteckt" werden.



  • Richtig erkannt.

    Das ganze dient Übungszwecken!

    PS: Zumindestens schaue ich zur Zeit öfters in Bjarne's Buch als in die Bibel.
    Gott vergib mir meine Sünden.

    Nein Spaß bei seite 😋



  • dennis.cpp schrieb:

    CStoll schrieb:

    Golfi1812 schrieb:

    Nein, ich möchte ein Programm schreiben, dass einen Satz nach seiner richtigkeit überprüft.

    Wie gesagt, ein ehrgeiziges Projekt - noch nicht einmal MS Word kriegt das immer richtig hin.

    Ist das nicht ein Forschungsgebiet der Linguistik... seit Jahrzehnten?

    Keine Ahnung, da bin ich nicht auf dem aktuellen Stand 😃

    @Golfi: Hast du schon das Kapitel über die STL-Algorithmen durchgenommen? Wenn ja, ich würde die substantiv() etc Funktionen mit std::find() umsetzen.

    Was die Umlaute angeht, solltest du dich ein wenig mit den verschiedenen Codepages und ANSI-Codierung beschäftigen.


Anmelden zum Antworten