char * mit enum wert vergleichen



  • Keine Alternative? Müsste man aus dem eingelesenen String nur noch die Zahl extrahieren.

    enum BaudRateType {
        BAUD2400    =   2400,
        BAUD4800    =   4800,
        BAUD9600    =   9600,
        BAUD14400   =  14400,             
        BAUD19200   =  19200,
        BAUD38400   =  38400,
        BAUD56000   =  56000,    
        BAUD57600   =  57600,
        BAUD115200  = 115200,
    
    };
    


  • Fellhuhn schrieb:

    Keine Alternative? Müsste man aus dem eingelesenen String nur noch die Zahl extrahieren.

    enum BaudRateType {
        BAUD2400    =   2400,
        BAUD4800    =   4800,
        BAUD9600    =   9600,
        BAUD14400   =  14400,             
        BAUD19200   =  19200,
        BAUD38400   =  38400,
        BAUD56000   =  56000,    
        BAUD57600   =  57600,
        BAUD115200  = 115200,
    
    };
    

    Ich habe ja eine Funktion z.B. InitSerialBus(xxxx) und das xxxx (vom Typ BaudRateType) soll dynamisch ersetzt werden mit dem inhalt eines strings (dieser string kommt aus einem txt config file). Also bringen mir die festgelegten werte leider auch nichts 😕



  • traceman schrieb:

    ...
    Ich habe ja eine Funktion z.B. InitSerialBus(xxxx) und das xxxx (vom Typ BaudRateType) soll dynamisch ersetzt werden mit dem inhalt eines strings (dieser string kommt aus einem txt config file). Also bringen mir die festgelegten werte leider auch nichts 😕

    😮 🙄

    Also ehrlich gesagt, klingt das danach, als ob Du das alles viel zu kompliziert machst und mit einer normalen "string2Int"-Konvertierung fertig wärst.
    Kannst mal unter "Einmal String nach Zahl und zurück" hier im Forum nachsehen.
    Oder nimmst direkt:

    istringstream ist(configFileString);
       ist >> thread_prirec.baudRate;
       InitSerialBus(thread_prirec.baudRate);
    

    "configFileString" ist hier natürlich nur ein Beispiel; in Deinem Code wirst Du vermutlich jede ConfigFile-Zeile zerlegen in einen ParameterTyp- und einen -Wert-String ... und "ist" muss dann mit dem Wert-String initialisiert werden.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    InitSerialBus(thread_prirec.baudRate);
    

    Das Problem ist dass genau an der Stelle thread_prirec.baudRate ein Enumeratortyp stehen musss (in dem Fall also z.B. BAUD9600) und kein int oder string



  • traceman schrieb:

    Simon2 schrieb:

    InitSerialBus(thread_prirec.baudRate);
    

    Das Problem ist dass genau an der Stelle thread_prirec.baudRate ein Enumeratortyp stehen musss (in dem Fall also z.B. BAUD9600) und kein int oder string

    Also ist das eine vorgegebene Funktion, die damit auch ParameterBereich und vermutlich sogar den Typen (enum) vorgibt.
    Ergo: Es ist doch festgelegt und Du fährst mit der map gut.

    BTW: "map" ist hier sogar ziemlich wörtlich zu verstehen: Du "mappst" (im Sinne einer Abbildung) nämlich Deinen Parametertyp (string, Werte von Dir festgelegt) auf den der genutzten Schnittstelle (enums).

    Gruß,

    Simon2.



  • traceman schrieb:

    Simon2 schrieb:

    InitSerialBus(thread_prirec.baudRate);
    

    Das Problem ist dass genau an der Stelle thread_prirec.baudRate ein Enumeratortyp stehen musss (in dem Fall also z.B. BAUD9600) und kein int oder string

    Nicht desto Trotz ist ein enum ein Integerwert, und wenn du im Enum die Werte richtig verschlüsselt hast (Sprich z.b. BAUD9600 = 9600), läßt sich - vorausgesetzt es hat immer den gleichen Aufbau "BAUD<Zahl>" später über diesen Wert ein String generieren. Der Enum selbst ist freilich aber kein String.

    cu André



  • InitSerialBus((BaudRateType)meinErmittelterBaudInt);
    

    müsste einwandfrei funktionieren. Wenn natürlich der Enum vordefiniert ist, wovon ich jetzt einmal ausgehe, wenn die Funktion nicht von dir ist, dann kannst du natürlich auch deren Wertigkeit nicht ändern, oder?

    Wenn dem so ist, dann müsstest du die ja nur einlesen und den Zahlenwert auf den Enum-Mappen. Und zum "mappen" eignet sich eine "map" bestens. 😉



  • Fellhuhn schrieb:

    ... wenn die Funktion nicht von dir ist, dann kannst du natürlich auch deren Wertigkeit nicht ändern, oder?

    thats the problem! 😉



  • Dann reicht doch eine simple Map. Um es flexibel zu halten würde ich da auf std::map<unsigned int, BaudRateType> zurückgreifen. Dort fügst du dann die ganzen Vorgaben ein und bist damit durch. baudMap[2400] = BAUD2400 etc.



  • Ich hab jetzt noch genau nachgeschaut was für Baudraten der Receiver überhaupt kann. Die Auswahl beschränkt sich damit auf 6 Werte und die vergleiche ich dann mit einer Abfrage über map.



  • (...)
    	sscanf(line.toStdString().c_str(),"%s %s",param,arg);
    (...)
    
    if (QString(param)=="[BAUDRATE_PRIM_REC]") {		
    	std::map<std::string, BaudRateType> bdrpr;
    	bdrpr["BAUD9600"] = BAUD9600;
    	bdrpr["BAUD19200"] = BAUD19200;
    	bdrpr["BAUD38400"] = BAUD38400;
    	bdrpr["BAUD57600"] = BAUD57600;
    	bdrpr["BAUD115200"] = BAUD115200;
    	thread_prirec.baudRate = bdrpr[arg];
    }
    

    so gehts 👍 thanks@all



  • Glückwunsch ....

    aber: Warum DAS ?

    traceman schrieb:

    ...QString(param)...
    

    😕

    Gruß,

    Simon2.



  • Weil er dann nicht strcmp benutzen muss. 😉



  • Simon2 schrieb:

    Glückwunsch ....

    aber: Warum DAS ?

    traceman schrieb:

    ...QString(param)...
    

    😕

    Gruß,

    Simon2.

    (->Qt), habs aber jetzt schon auf c umgeschrieben



  • Fellhuhn schrieb:

    Weil er dann nicht strcmp benutzen muss. 😉

    genau 😃



  • traceman schrieb:

    Fellhuhn schrieb:

    Weil er dann nicht strcmp benutzen muss. 😉

    genau 😃

    Und warum deswegen QString, wenn Du std::string sowieso schon nutzt ?

    ... und wo gerade für so Zeug wie "Parameterverarbeitung" std::string so viele und ausschließliche Vorteile ggü. char* hat, verstehe ich noch weniger, warum Du es nicht nutzt (geschweige denn, warum Du einen weiteren Stringtypen einführst).

    Gruß,

    Simon2.



  • Simon2 schrieb:

    traceman schrieb:

    Fellhuhn schrieb:

    Weil er dann nicht strcmp benutzen muss. 😉

    genau 😃

    Und warum deswegen QString, wenn Du std::string sowieso schon nutzt ?

    ... und wo gerade für so Zeug wie "Parameterverarbeitung" std::string so viele und ausschließliche Vorteile ggü. char* hat, verstehe ich noch weniger, warum Du es nicht nutzt (geschweige denn, warum Du einen weiteren Stringtypen einführst).

    Gruß,

    Simon2.

    Ist doch wurscht, funktioniert trotzdem 😉



  • In den meisten Fällen hat QString gegenüber std::string den Vorteil, das man diese kinderleicht mit linguist internationalisieren kann. Macht natürlich nur bei konstanten Strings Sinn. 😉

    Warum C-Strings, kann ich aber auch nur raten.



  • Warum C-Strings, kann ich aber auch nur raten.

    Ja dann viel Spass beim raten.



  • Danke.


Anmelden zum Antworten