String



  • Normalerweise prüft man das vor der Schleife statt bei jedem Schleifendurchlauf.



  • Ja aber trotzdem scheint es ja komplett falsch zu sein.
    Ich weiss es ja nicht wie man es macht ,sonst würde ich ja nicht fragen.



  • Und jetzt kommen wir langsam an den Punkt Eigeninitiative...

    Es wurden dir doch genügend Hinweise gegeben, was du machen musst. Und abgesehen von einer if -Abfrage hast du nichts geliefert. Den Inhalt eines std::strings in ein char -Array zu kopieren ist trivial. Wenn du das nicht hinbekommst schau in deinem Skript/Buch nach, das muss schon behandelt worden sein.



  • Alles klar .Hat sich erledigt .

    Könnt ihr mir nur erklären wie ich diesen Fehler bei Xcode weg bekomme ?
    Der macht mich verrückt
    CProtocol.cpp:93:72: Member function 'calculateCrc' not viable: 'this' argument has type 'const CProtocol', but function is not marked const

    [code="cpp"ostream& operator << (ostream& out,const CProtocol& rop){
    out <<rop.getTypeAsString(rop.m_id) << " " <<":"<< rop.m_payload << ""<<rop.calculateCrc()<<endl;
    if(rop.m_id== ASCII){
    for(int i = 0; i<MAXPAYLOAD; i++){
    out<< rop.m_payload[i] ;

    }
    }else{

    for(int i = 0; i<MAXPAYLOAD; i++){
    out<< (int)rop.m_payload[i] ;

    } }
    return out;
    }[/code]

    Könnt ihr mir nur erklären wie ich den Fehler weg bekomme ?
    Dann bin ich auch schnell weg 😃



  • ostream& operator << (ostream& out,const CProtocol& rop){
        out <<rop.getTypeAsString(rop.m_id) << " " <<":"<< rop.m_payload << ""<<rop.calculateCrc()<<endl;
        if(rop.m_id== ASCII){
            for(int i = 0; i<MAXPAYLOAD; i++){
                out<< rop.m_payload[i] ;
    
            }
        }else{
    
            for(int i = 0; i<MAXPAYLOAD; i++){
                out<< (int)rop.m_payload[i] ;
    
            }    }
        return out;
    }
    


  • Wie kriege ich den Fehler weg?



  • _Den_ Fehler bekommst du weg indem du _die_ Änderung machst.
    Merkste was?

    Oder anders gesagt: doof?

    EDIT: Die Fehlermeldung steht ja eh da, nur 2 Beiträge weiter oben. Übersehen.



  • ostream& operator << (ostream& out,const CProtocol& rop){
    

    Mach das

    const
    

    weg.



  • Ja aber in der Aufgabenstellung war das const ja so gegeben im Header ?
    Eine andere Möglichkeit gibt es nicht ?



  • Ach sorry ... ich hab eh keine Ahnung ...


  • Mod

    Belli schrieb:

    Ach sorry ... ich hab eh keine Ahnung ...

    Das war nicht Byson, der den (gelöschten) Beitrag geschrieben hat, auf den du dich beziehst. Das ist eben das Problem, wenn jemand sich nicht registriert, dass jeder Störer einfach in seinem Namen Beleidigungen posten kann.


  • Mod

    Byson schrieb:

    Ja aber in der Aufgabenstellung war das const ja so gegeben im Header ?
    Eine andere Möglichkeit gibt es nicht ?

    const ist ansteckend. Entweder macht man es nirgends und verzichtet auf das Sicherheitsnetz, oder man muss es gleich überall richtig machen.

    unsigned int  const calculateCrc();
    

    soll sicherlich

    unsigned int calculateCrc() const;
    

    heißen.
    Im ersten Fall ist der Rückgabewert konstant, was überhaupt keinen Sinn macht. Sogar so wenig Sinn, dass es ignoriert wird, du solltest mindestens eine Warnung diesbezüglich bekommen, wenn du Warnungen einschaltest (was du unbedingt solltest!). Bei letzterem ist die Funktion calculateCrc selbst als const markiert und kann dann entsprechend auch auf konstanten Objekten, wie hier rop , aufgerufen werden.



  • SeppJ schrieb:

    Belli schrieb:

    Ach sorry ... ich hab eh keine Ahnung ...

    Das war nicht Byson, der den (gelöschten) Beitrag geschrieben hat, auf den du dich beziehst. Das ist eben das Problem, wenn jemand sich nicht registriert, dass jeder Störer einfach in seinem Namen Beleidigungen posten kann.

    Ja, wobei ich zugeben muss: ich hätte vielleicht 1-2 Beiträge mehr lesen sollen und nicht nur den letzten. Ist ja nicht so dass Fehlermeldung nicht da steht (nirgends steht).

    @Byson
    Sorry.
    Da du den Code nochmal gepostet hast, die Fehlermeldung aber nicht nochmal, hab ich das nicht gesehen. Und es kommt leider öfter mal vor dass jmd. Code postet und dann fragt wieso "der Fehler" kommt -- ohne irgendwo die Fehlermeldung zu zeigen. Daher hab ich angenommen...
    Also nochmal: sorry.



  • Byson schrieb:

    ostream& operator << (ostream& out,const CProtocol& rop){
        out <<rop.getTypeAsString(rop.m_id) << " " <<":"<< rop.m_payload << ""<<rop.calculateCrc()<<endl;
        if(rop.m_id== ASCII){
            for(int i = 0; i<MAXPAYLOAD; i++){
                out<< rop.m_payload[i] ;
                
            }
        }else{
            
            for(int i = 0; i<MAXPAYLOAD; i++){
                out<< (int)rop.m_payload[i] ;
                
            }    }
        return out;
    }
    

    Bist du sicher, dass du immer den kompletten Puffer ausgeben möchtest? Wenn zB nur 5 Zeichen drinstehen möchte ich vermutlich alles ab Index 5 nicht mehr sehen, weil es nicht relevant ist. Und auch die Ausgabe für nicht-ASCII solltest du noch ein Mal überarbeiten, einfach alle Bytes als int ohne Trennzeichen auszugeben ist... unleserlich. Vorsichtig ausgedrückt. Wenn dir langweilig ist kannst du das als Hex ausgeben, das ist mMn am sinnvollsten. Aber das ist Bonus.

    Und:
    Bitte formatier´ deinen Quelltext vernünftig:
    - entferne überflüssige Leerzeilen (zB Zeile 6 und 12)
    - rücke geschweifte Klammern so ein, dass man sieht, wo der Kontrollblock endet (Zeile 13)



  • Okay, dann auch von mir sorry ...
    dann darfst Du die Methode wohl nicht in der Stream-Operator - Überladung aufrufen.



  • Hack:
    Oder man schreibt die Vermutung auf fehlerhafte Aufgabestellung in die Methode und castet das const weg.

    Lösung:
    Oder man ergänzt eine getCrc() const Methode, die einfach m_crc zurückgibt. Diese ganze Protokollklasse sieht sowieso wenig durchdacht aus, warum gibt es eine öffentliche setCrc Methode und eine private calculateCrc Methode? Ergibt keinen Sinn. Soll man von außen die Checksumme setzen ohne sie berechnen zu können?



  • https://www.pic-upload.de/view-34323846/Bildschirmfoto2017-11-19um14.32.13.png.html

    Hier nochmal die komplette Aufgabe gepostet .
    Ich habe das const verändert ,aber das Eclipse meckert immer noch.

    Ich poste euch meinen gesamten Code .

    Vielleicht könnt ihr mir helfen.

    #ifndef CProtocol_h
    #define CProtocol_h
    
    #define MAXPAYLOAD 30
    
    #include<iostream>
    #include<string>
    using namespace std;
    
    enum protocolId_t {UNDEFINED,TEMPERATURE,HUMIDITY,PRESSURE,ASCII,ALL};
    class CProtocol {
    
    private:
        protocolId_t m_id = UNDEFINED;
        char  m_payload [MAXPAYLOAD]  ={0};
        unsigned int m_nextFreePos = 0;
        unsigned int m_crc = 0;
        unsigned int   calculateCrc() const;
    
    public:
        CProtocol();
        CProtocol( protocolId_t id, string payload,unsigned int crc);
        void setProtocolId(protocolId_t id);
        protocolId_t getProtocolId()const;
        bool addPayload(char data);
        void setCrc(unsigned int crc);
        string  getTypeAsString(protocolId_t id)const;
        friend ostream& operator << (ostream& out,const CProtocol& rop) ;
    
    };
    ostream& operator << (ostream& out,const CProtocol& rop);
    

    cpp

    [code#include "CProtocol.h"

    #include<iostream>
    #include<string>
    using namespace std;

    CProtocol::CProtocol(){
    for (int i = 0; i< MAXPAYLOAD; i++){

    m_payload[i]= 0;
    }

    };
    CProtocol::CProtocol(protocolId_t id,string payload, unsigned int crc){
    for (int i = 0; i<payload.size(); i++){
       m_payload[i] = payload [i];
    }

    m_crc = crc;

    m_id = id;
    if(m_nextFreePos>MAXPAYLOAD){

    m_nextFreePos = MAXPAYLOAD;
    }

    };

    void CProtocol::setCrc(unsigned int crc){

    crc = m_crc;
    };
    void CProtocol::setProtocolId(protocolId_t id){

    m_id = id;
    };
    protocolId_t CProtocol::getProtocolId()const{

    return m_id;
    };

    bool CProtocol::addPayload(char data){

    if(m_nextFreePos>MAXPAYLOAD){
    cout << " Fehlermeldung" << endl;
    return false;

    }
    else{
    m_payload[m_nextFreePos] = data;
    return true;

    }

    };

    string CProtocol::getTypeAsString( protocolId_t id)const{

    switch(id){
    case UNDEFINED: return "UNDEFINED";
    case TEMPERATURE: return "TEMPERATURE";
    case HUMIDITY: return "HUMIDITY";
    case PRESSURE: return "PRESSURE";
    case ASCII: return "ASCII";
    case ALL: return "ALL";

    default: return "Unbekannter Typ";

    }

    }
    unsigned int CProtocol::calculateCrc const(){

    m_crc = m_id + m_payload[m_nextFreePos];
    m_nextFreePos++;
    return m_crc;
    }

    ostream& operator << (ostream& out,const CProtocol& rop){
    out <<rop.getTypeAsString(rop.m_id) << " " <<":"<< rop.m_payload << ""<<rop.calculateCrc();
    if(rop.m_id== ASCII){
    for(int i = 0; i<MAXPAYLOAD; i++){
    out<< rop.m_payload[i] ;

    }
    }else{

    for(int i = 0; i<MAXPAYLOAD; i++){
    out<< (int)rop.m_payload[i] ;

    } }
    return out;
    }
    [/code]

    main

    [code]
    #include <iostream>
    #include "CProtocol.h"
    using namespace std;

    int main() {
    CProtocol protOk(TEMPERATURE,"23",24);
    CProtocol protNok(PRESSURE,"1077",14);
    CProtocol protAscii( ASCII,"Testprotokoll",1418);

    }[code]

    Erkennt ihr Fehler?

    Fehlermeldung:
    Description Resource Path Location Type
    Invalid arguments '
    Candidates are:
    const unsigned int calculateCrc()
    ' CProtocol.cpp /CProtokol line 85 Semantic Error
    Description Resource Path Location Type
    member function 'calculateCrc' not viable: 'this' argument has type 'const CProtocol', but function is not marked const CProtocol.cpp /CProtokol line 85 C/C++ Problem
    Description Resource Path Location Type
    Member declaration not found CProtocol.cpp /CProtokol line 77 Semantic Error



  • cpp nochmal .
    Dauernd diese Probleme beim posten ?

    #include "CProtocol.h"
    
    #include<iostream>
    #include<string>
    using namespace std;
    
    CProtocol::CProtocol(){
        for (int i = 0; i< MAXPAYLOAD; i++){
    
            m_payload[i]= 0;
        }
    
    };
    CProtocol::CProtocol(protocolId_t id,string payload, unsigned int crc){
        for (int i = 0; i<payload.size(); i++){
               m_payload[i] = payload [i];
        }
    
        m_crc = crc;
    
        m_id = id;
        if(m_nextFreePos>MAXPAYLOAD){
    
            m_nextFreePos = MAXPAYLOAD;
        }
    
    };
    
    void CProtocol::setCrc(unsigned int crc){
    
        crc = m_crc;
    };
    void CProtocol::setProtocolId(protocolId_t id){
    
        m_id = id;
    };
    protocolId_t CProtocol::getProtocolId()const{
    
        return m_id;
    };
    
    bool CProtocol::addPayload(char data){
    
        if(m_nextFreePos>MAXPAYLOAD){
            cout << " Fehlermeldung" << endl;
            return false;
    
        }
        else{
            m_payload[m_nextFreePos] = data;
            return true;
    
        }
    
    };
    
    string  CProtocol::getTypeAsString( protocolId_t id)const{
    
        switch(id){
            case UNDEFINED: return "UNDEFINED";
            case TEMPERATURE: return "TEMPERATURE";
            case HUMIDITY: return "HUMIDITY";
            case PRESSURE: return "PRESSURE";
            case ASCII: return "ASCII";
            case ALL: return "ALL";
    
            default: return "Unbekannter Typ";
    
        }
    
    }
    unsigned int  CProtocol::calculateCrc()const{
    
        m_crc = m_id + m_payload[m_nextFreePos];
        m_nextFreePos++;
        return m_crc;
    }
    
    ostream& operator << (ostream& out,const CProtocol& rop){
        out <<rop.getTypeAsString(rop.m_id) << " " <<":"<< rop.m_payload << ""<<rop.calculateCrc();
        if(rop.m_id== ASCII){
            for(int i = 0; i<MAXPAYLOAD; i++){
           out<< rop.m_payload[i] ;
    
            }
        }else{
    
            for(int i = 0; i<MAXPAYLOAD; i++){
                out<< (int)rop.m_payload[i] ;
    
            }    }
        return out;
    }
    


  • Also, ich spreche mal nur wirkliche Fehler an, nicht Dinge wie m_payload wird mehrmals auf 0 gesetzt.

    • crc = m_crc; ist garantiert ein Fehler.
    • Array indices starten bei 0 und gehen bis size-1, d.h. m_payload[MAXPAYLOAD] ist ein out-of-range Zugriff, denn das letzte Element ist m_payload[MAXPAYLOAD-1] . Die Bedingung lautet ja auch nextpos<MAXPAYLOAD , da hast du falsch umgedreht.
    • Dein calculateCrc() versucht sich als const Methode auszugeben, ist es aber garnicht. Es gibt mutable , aber musst du selbst wissen ob das in dein Design passt. Oder du lässt das const weg, ist in der Aufgabe ja nicht verlangt soweit ich sehen kann. Eher trifft zu, dass calculateCrc() const bleiben soll (so wäre es m. E. nach richtig vom Design her), jedoch nicht m_crc setzt.

    Ich hab nur schnell drüber geschaut also ohne Gewähr

    unsigned CProtocol::calculateCrc() const
    {
        unsigned crc = 0;
        // crc berechnen
        return crc;
    }
    

    Die Funktion heißt ja auch calculateCrc() und nicht calcualteAndSetCrc()



  • Wo habe ich das hier falsch gemacht ?
    Array indices starten bei 0 und gehen bis size-1, d.h. m_payload[MAXPAYLOAD] ist ein out-of-range Zugriff, denn das letzte Element ist m_payload[MAXPAYLOAD-1]. Die Bedingung lautet ja auch nextpos<MAXPAYLOAD, da hast du falsch umgedreht.

    Ich habe den code so umgedreht ,aber das zeigt dann Fehler an ?

    BEI m_crc wird kein Fehler angezeigt?

    unsigned int  CProtocol::calculateCrc()const{
    	unsigned crc = 0;
    
        crc = m_id + m_payload[m_nextFreePos];
        m_nextFreePos++;
        return crc;
    }
    

    Description Resource Path Location Type
    cannot assign to non-static data member within const member function 'calculateCrc' CProtocol.cpp /CProtokol line 79 C/C++ Problem
    Description Resource Path Location Type
    cannot assign to non-static data member within const member function 'calculateCrc' CProtocol.cpp /CProtokol line 80 C/C++ Problem


Anmelden zum Antworten