Hallo. Ich habe die Funktion GetData(), die mir einen Zeiger auf unsigned Daten bereitstellt. Da ich innerhalb dieser Daten viel ersetzen und vergleichen muss, möchte ich die std::string Funktionen nutzen.Daher erzeuge ich mir einen string der die Daten aufnimmt. Meine Frage nun: Wenn ich strData.find aufrufe mit 0xff wird die warning:c4309 ausgegeben(visual studio), was besagt, das ein unsigned char nicht in char passt. Denn Wert findet er trotzdem.Warum wird nun wenn ich caste(siehe unten) die Warnung weggebügelt? Was geht da intern vor? #define VALUE 0xff GetData(unsigned char * Data, int length) { std::string strData(Data, Data+length); strData.find(VALUE,0); //generiert c4309 str.Data.find((unsigned char)VALUE,0);//kein c4309 } Danke.
Zusatz: Ich weiß, das std::string nichts weiter als ein template für char ist. Wenn ich also caste mit (unsigned char), muss doch erst recht die Warnung ausgegeben werden, oder?
Du kannst dein Problem grundlegend lösen, indem du einen string aus "unsigned char" verwendest:
1 | std::basic_string<unsigned char> strData (Data, Data+length); |
2 | strData.find(VALUE, 0); |
Außerdem gibt es keinen Grund, eine Preprozessor-Textersetzung für "VALUE" zu verwenden. Nimm eine Konstante, wie sich das gehört:
1 | static const unsigned char VALUE = 0xFF; |
So vermeidest du gleich die Typ-Verwirrung... Christian schrieb: > strData.find(VALUE,0); //generiert c4309 Hier initialisierst du den Parameter vom Typ "char" mit 0xFF, was nicht hineinpasst. > str.Data.find((unsigned char)VALUE,0);//kein c4309 Hier initialisierst du einen "unsigned char" mit 0xFF (was passt) und konvertierst das Ergebnis nach "char" (was undefiniert ist, aber deinen Compiler nicht zu einer Warnung veranlässt). Warum übergibst du nicht eigentlich gleich einen std::string bzw std::basic_string<unsigned char> ?
Das hatte ich auch schon versucht : std::basic_string<unsigned char> strData (Data, Data+length); strData.find(VALUE, 0); Habe aber an vielen Stellen so was hier: strData.find(";",0); Wenn ich nun strData als unsigned char mache(wie oben),bekomme ich Fehlermeldungen und ich müsste alles casten, was mir nicht gefällt: strData.find((unsigned char)";",0);
Versuch vielleicht: static const char VALUE = '\377'; // '\xff' Dann kann alles "char" und std::string bleiben...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.