fehler beim auswerten eines Zeichens aus einem String in einem CASE
-
Hallo,
ich habe wie gesagt ein Problem beim auswerten eines char Zeichens in einem case konstrukt.
Dabei wird übers Netzwerk (TCP/IP) ein Packet gesendet und dann eine Antwort empangen die dann auszuwerten ist.
Zum Problem:
In Zeile 21 bei dem "case 0x84" kommt jetzt der fehler:
Warnung: Case-Marke überschreitet Maximalwert des Typs [Standartmäßig aktiviert]* * * /*******************SENDEN****************************/ cSock << obuf; // anfrage Senden /*******************EMPFANGEN*************************/ recvLenght = cSock >> ibuf; * *// hier werden noch diverse fehler abgefangen * // ab hier wird die antwort ausgewertet switch(ibuf[7]) // buffer[7] enthält den Funktion code der Antwort oder einen error code { case 0x04: //es wurde mit dem Richtigen Fkt Code geantwortet * *//weiteresauswerten der antwort *//Kein fehler aufgetreten * break; case 0x84: //Fehler code vom modbus/tcp Protokoll switch(ibuf[8]) // im nächsten byte steht der fehler { * * *Ich benutze eclipse 3.7.2.
Bei ibuf (das wird in dem case ausgewertet) handelt es sich um einen String.
Die netzwerk fkt's habe ich größten teils aus dem Buch C++ von a bis z übernommen. ^^ Es handelt sich daher um Vererbte Klassen mit überladenen operatoren etc.
Bei diesem ganzen Modul handelt es sich um eine Umsetzung von einem c programm in c++ code.(daher warscheinlich auch der Fehler)
zum Modbus TCP protokoll:
Im 8ten Bit [index 7] der Antwort wird entweder der fkt Kode zurückgesendet oder eben ein Fehler, siehe zeile 21, der dann weiter ausgewertet werden muss.Ich hoffe das ihr mir helfen könnt ich weiß nicht mehr weiter.
MFG BabCom
-
BabCom schrieb:
Zum Problem:
In Zeile 21 bei dem "case 0x84" kommt jetzt der fehler:
Warnung: Case-Marke überschreitet Maximalwert des Typs [Standartmäßig aktiviert]Der Compiler hat immer Recht.
Ich benutze eclipse 3.7.2.
Bei ibuf (das wird in dem case ausgewertet) handelt es sich um einen String.Und somit ist ibuf[7] ein char (der in der Regel nur bis 0x7F geht)
Die netzwerk fkt's habe ich größten teils aus dem Buch C++ von a bis z übernommen.
Das erklärt alles:
http://www.c-plusplus.net/forum/272350
Benutze das Buch als Grillanzünder und vergiss alles, was du daraus "gelernt" hast.
-
OK, kann sein das J. Wolf einige schlechte Beispeile in seinem Buch(büchern) hatt, aber es liegt nicht an dem Nentzwerk teil meines Programmes.
(höchstens an der auswertung der rückgaben (string zu char))Dazu das der char wert überschritten wird, kann ich nur sagen das es sich vorher wiegesagt um eine reins c programm gehandelt hatt und ich die auswertung d.h. das gesammte case konstrukt daraus übernommen habe, und es da so funktioniert hatt.
(dabei handelt es sich um eine 1 zu 1 Kopie, wie sie vom modbus Standart vorgegeben wird)MFG BabCom
-
Und was möchtest du uns damit sagen? Dass du lieber Herrn Wolf und deinem alten Programm vertraust, anstatt der klaren Meldung des Compilers und meiner Erklärung, was diese bedeutet? Das darfst du gerne, aber beschwer dich hinterher nicht, dass man dich nicht gewarnt hätte.
-
Erwartest du jetzt, dass es Puff macht und dein Programm funktioniert?
-
Einfach mal geraten: Dein buffer ist vom Typ
char, sollte aber vom typunsigned charsein.Nicht aufregen über die destruktiven Antworten, hier sind sogar die Mods Trolle

-
Danke für die antwort Captain Obvious das werd ich gleich mal ausprobieren.
Das könnte sehr gut zutreffen ich werd's wiegesagt gleich mal prüfen hab das alte Programm ja noch.@SeppJ
Nein wenn mein Compiler mir was sagt dann glaub ich das, sonst hätte ich hier nicht nach gefragt.
Und das was du mir im vorherigem Post geschrieben hast glaube ich auch nur hat's mich nicht wirklich weiter grebracht. denn das da nen fehler ist hat mir mein Compiler vertaten.
Ich habe mir blos erhofft das jemand weiß wiso der Compiler diesen Fehler meldet. und was ICH Falsch gemacht habe(n könnte).@manni66
No komment
-
Ich habe das mit dem unsigned char geprüft und im alten c Programm ist ibuf tatsächlich unsigned.
währe die lösung dann einfach
switch((unsigned char)ibuf[7]) // buffer[7] enthält den Funktion code der Antwort oder einen error code { case 0x04: //es wurde mit dem Richtigen Fkt Code geantwortetanstatt von:
switch(ibuf[7]) // buffer[7] enthält den Funktion code der Antwort oder einen error code { case 0x04: //es wurde mit dem Richtigen Fkt Code geantwortet??
-
Wenn, dann bitte
static_cast<unsigned char>(ibuf[7]). Kann richtig sein. Ist es wahrscheinlich auch. Kommt eben auf den Kontext an. Ist aber auf jeden Fall verdächtig, wenn man solche Umwandlungen braucht, denn das heißt, vorher lief irgendwo was falsch. Wieso ist der Typ denn nicht von vornherein unsigned char?
-
Jammere nicht soviel rum, dass die gegebenen Antworten nicht komplett deinen Erwartungen entsprechen.
Wenn ich Erstantworter gewesen wäre, wäre deine Mimmosenhaftigkeit noch stärker strapaziert worden.
Es liegt auch nicht am "c programm" oder "c++ programm", sondern am Compiler, und am C Standard, der 3 unterschiedliche Typen char,signed char und unsigned char vorschreibt, und dafür jeweils die Wertebereicheunsigned char: 0...UCHAR_MAX signed char: SCHAR_MIN...SCHAR_MAX char: CHAR_MIN...CHAR_MAXund genau das prüft dein Compiler und kann (muss nicht!) hier eine Warnung ausgeben.
char ist implementierungsabhängig, d.h. der Compilerbauer legt das fest, ob äquivalent zu signed char oder unsigned char.
Deinen Cast kannst du so machen, Casts überdecken aber immer etwas und verlangen den totalen Überblick des Programmierers über seinen Code; der Compiler hier will dir also sagen, dass dein Ursprungsprogramm nicht portabel ausgelegt ist, eben weil du den Code anpassen musst um ihn woanders zum Laufen zu bringen; und auch hier wieder zeigt sich, dass C und C++ eben keine gleichen Programmmiersprachen sind.
-
Also das leigt daran das ich mir eine Netzwerk Schnittschtelle gebaut habe in der das komplete Netzwerk management(dh Einstellungen wie AF_INET etc.) in eine Extra Klasse ausgelagert ist. Dies klasse habe ich intern mit c++ strings für die buffer aufgebaut.
Das hält meinen Code deutlich übersichtlicher als wenn ich zwischen der reinen Datenverarbeitung auch noch die ganzen socket sachen zwischen hätte. Daher kommt dann auch mein Problem. Die Daten werden als Strings(char arrays) gebuffert ich brauche aber unsinged.Dan bendake ich mich hier für die schnelle hilfe.
MFG BabCom
-
Kapseln kannst du auch in C. Sogar effizienter und benutzerfreundlicher als in C++.
Kapselung ist nur eine Eigenschaft von C++-Klassen.
-
strings für Netzwerkaktivität klingt komisch. Brauchst du wirklich Zeichenkettenverarbeitung oder bloß einen variablen Haufen (signed/unsigned) chars? Letzteres wäre nämlich
vector<gewünschter chartyp>. Falls der Haufen nicht einmal variabel groß sein braucht, sogar nurarray<chartyp>.
-
nun ja das hat seinen begründung darin, das ich diese Klasse wiederverwendbahr haben wollte, dh sie nicht nur speziell für diese Netzwerkanwendung sondern im zweifel auch für spätere Anwendungen benutzen will.
Ich werde das ganze nächste woche durch teste nund dann evtl mit weitere Fragen aufwarten.^^
-
Wutz schrieb:
Sogar effizienter und benutzerfreundlicher als in C++.
Also ich weiss ja nicht wie's dir geht, aber Konstruktoren und Destruktoren manuell aufzurufen ist nicht mein Ding.
-
Kellerautomat schrieb:
Wutz schrieb:
Sogar effizienter und benutzerfreundlicher als in C++.
Also ich weiss ja nicht wie's dir geht, aber Konstruktoren und Destruktoren manuell aufzurufen ist nicht mein Ding.
Was haben Konstruktoren mit Kapselung zu tun?
-
Wutz schrieb:
Sogar...benutzerfreundlicher als in C++.
Dem Benutzer dürfte es doch ziemlich schnuppe sein, ob der Code in C oder in C++ geschrieben wurde und das Programm sollte sich in beiden Fällen nach außen gleich verhalten. Wenn ein Benutzer z.B. etwas in der Konsole eingeben soll, kriegt er also nicht mit, ob nun ein fgets oder ein cin dahinter steckt.
Begründe mal deine Aussage, wenn sie nicht als Nonsens angesehen werden soll.
-
häh?! schrieb:
Wenn ein Benutzer z.B. etwas in der Konsole eingeben soll, [...]
Wie wäre es mit Benutzer = Benutzer von C bzw. C++ = Programmierer?
Etwas Textverständnis sollte schon vorausgesetzt werden können, zumal es hier alle Poster vor dir verstanden haben.
-
käpsele schrieb:
Kellerautomat schrieb:
Wutz schrieb:
Sogar effizienter und benutzerfreundlicher als in C++.
Also ich weiss ja nicht wie's dir geht, aber Konstruktoren und Destruktoren manuell aufzurufen ist nicht mein Ding.
Was haben Konstruktoren mit Kapselung zu tun?
Nichts. Hab ich auch nicht behauptet.
Ich habe damit gemeint, dass ich C besonders deshalb nicht leiden kann, weil es kein RAII kann.
-
lol?! schrieb:
häh?! schrieb:
Wenn ein Benutzer z.B. etwas in der Konsole eingeben soll, [...]
Wie wäre es mit Benutzer = Benutzer von C bzw. C++ = Programmierer?
Etwas Textverständnis sollte schon vorausgesetzt werden können, zumal es hier alle Poster vor dir verstanden haben.