Forum: PC-Programmierung c++ string Funktion


von Christian (Gast)


Lesenswert?

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.

von Christian (Gast)


Lesenswert?

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?

von Dr. Sommer (Gast)


Lesenswert?

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> ?

von Christian (Gast)


Lesenswert?

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);

von IANAL (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.