funktion und typen?



  • Hallo an Alle

    ich uebe gerade die Anfaenge und bin bei "funktionen". Diese hier funktioneiert auch:
    main:

    #include"zaehle.h"
    #include<string>
    #include<iostream>
    using namespace std;
    
    int main()
    {
    	cout<<"Bitte Text eingeben: "<<endl;
    	char text;
    	cin>>text;
    	cout<<zaehle(text);
    }
    

    funktion:

    #include<iostream>
    using namespace std;
    
    char zaehle(char s)
    {
    	s++;
    	return s;
    }
    

    header:
    [/code]
    char zaehle(char);[code]

    Wenn ich nun "char" durch "string" ersetze dann bekomme ich diesen fehler:

    zaehle.h:1:error:'string' does not name a type
    main.cc:11:error:'zaehle' was not declared in this scope

    was mache ich falsch..habt ihr ne idee?



  • Das liegt daran, dass kein Postinkrement-Operator für die String-Klasse existiert.

    Einige weitere Tipps:

    1. C++-Dateien haben die Endung "cpp".
    2. iostream zweimal einzubinden ist Krampf.
    3. Ein Include von std in einer Header-Datei ist schlecht.

    ~ moagnus



    1. Ein Include von std in einer Header-Datei ist schlecht.

    ???

    was mache ich falsch..habt ihr ne idee?

    Ja.

    #include"zaehle.h"
    #include<string>
    #include<iostream>
    using namespace std;
    
    // Dieser Prototyp gibt der main bekannt, daß eine solche Funktion noch folgt
    char zaehle(char s);
    
    int main()
    {
        cout<<"Bitte Text eingeben: "<<endl;
        char text;
        cin>>text;
        cout<<zaehle(text);
    }	
    
    char zaehle(char s)
    {
        s++;
        return s;
    }
    

    Deine zaehle Funktion zählt allerdings nicht. Sie nimmt den ASCII-Wert eines Buchstabe, inkrementiert ihn und gibt dann somit das im ASCII nachfolgende Zeichen zurück. Mit char geht das weils es im Grunde eine Zahl ist, ein string ist dagegen keine.



  • moagnus schrieb:

    Das liegt daran, dass kein Postinkrement-Operator für die String-Klasse existiert.

    Einige weitere Tipps:

    1. C++-Dateien haben die Endung "cpp".

    Wäre mir neu das es auf cpp festgelegt wäre, da ich schon divese Formen von Source- und Headerbenennungen erlebt habe... Steht hier im Standard wirklich eine Festlegung? (ja, die Endung cpp ist auch für mich die Übliche, aber imho gibt es mehrere zulässige Endungen).

    moagnus schrieb:

    1. iostream zweimal einzubinden ist Krampf.

    Das doppelte includieren an sich ist mit sicherheit kein Krampf... Sofern man irgendwo iostreams einsetzt sollte man es auch in der entsprechenden Codeeinheit includieren (Wenn möglich in der Sourcedatei, wenn nötig statt dessen im Header).

    moagnus schrieb:

    1. Ein Include von std in einer Header-Datei ist schlecht.

    Man inkludiert kein "std", so das man hier nicht versteht was gemeint ist.

    Man sollte "using namespace" niemals im Header verwenden, dort lieber Typbezeichnungen ganz ausschreiben. "using namespace" gehört wenn überhaupt in die Sourcedatei (Die Nachteile beim öffentlich machen eines Namensraumes im Header überwiegen die Vorteile).

    latenite schrieb:

    Wenn ich nun "char" durch "string" ersetze dann bekomme ich diesen fehler:

    zaehle.h:1:error:'string' does not name a type
    main.cc:11:error:'zaehle' was not declared in this scope

    Das ist auch logisch. In dem Header zaehle.h ist der Typ string nicht bekannt. Hier fehlt das Include. Durch diesen Fehler gilt die Funktion als nicht vorhanden, daher der Folgefehler. Auch wenn es dennoch verkehrt ist, dazu aber gleich mehr würde der Header wie folgt richtig sein:

    #if !defined(ZAEHLE_HEADER)
    #define ZAEHLE_HEADER
    
    #include <string>
    
    std::string zaehle(const std::string& zahl);
    
    #endif
    

    So nun aber der logische Fehler, wie von Tyrdal schon angedeutet: Man rechnet nicht mit strings sondern mit Zahlen. Du solltest die Zahl als Integerwert einlesen und verwenden...

    // zaehle.h

    #if !defined(ZAEHLE_HEADER)
    #define ZAEHLE_HEADER
    
    long zaehle(long zahl);
    
    #endif
    

    // zaehle.cpp

    #include "zaehle.h"
    
    long zaehle(long zahl)
    {
        return ++zahl;
    }
    

    // main.cpp

    #include"zaehle.h"
    #include<iostream>
    using namespace std;
    
    int main()
    {
        cout << "Bitte eine Zahl eingeben: " << endl;
        long zahl;
        cin >> zahl;
        cout << zaehle(zahl);
    }
    

    Alternativ kannst du natürlich auch vorher strings in Zahlen umwandeln, aber dazu gibt es schon diverse andere Threads in diesem Forum...

    cu André



  • moagnus schrieb:

    Einige weitere Tipps:

    1. C++-Dateien haben die Endung "cpp".

    Das ist eine der Möglichkeiten. Wobei in alter UNIX Tradition die Endung ".cpp" eher unbeliebt ist, da "cpp" der Standalone C-Präprozessor ist, "cc" der C-Compiler, "CC" der C++ Compiler. ".cc" und ".C" sind ebenfalls übliche Namenserweiterungen für C++ Sourcen.



  • also danke erst mal
    es lang eecht daran das ich #include<string> nicht angegeben hatte.
    .cc machjt bei mir Anjuta automatisch...muss wohl so sein.

    noch eine frage: mit getline kann ich dann eine ganze Zeile einlesen.
    Wenn ich dann aber enter druecke ist schluss mit einlesen. ... wie erwartet.
    Aber wie kann ich den user mehrere Zeilen eingeben lassen, um sie dann z.B. in einer datei zu speichern?



  • Hmm while(std::getline(std::cin, string)) if (string == "ende") break; z.B.



  • Mehrmals getline aufrufen? 😉
    Die jeweiligen Zeilen kannst du dann in einem vector<string> etc. speichern oder direkt in eine Datei schreiben...



  • ja ok ich kann getline mehrmals aufrufen. Aber wie kann der user mitteilen dsa er fertig ist mit der eingabe? string==ende kann doch auch zum abbruch fuehren wenn der string ende enthaelt aber nicht ende gemeint ist? oder?!

    Welceh Schleife und welche Bedingung zum abbruch nimmt man da?



  • if (string == "ende")
    

    Hier wird true nur zurück gegeben wenn auch "ende" drin steht.
    Bei "nichtende" oder "enden" gibt es ein false.

    Sowas kann man aber auch ganz einfach selbst nachprüfen.
    Die if-Abfrage ist ja nun wirklich kein Codemonster.


Anmelden zum Antworten