C-code in C++ - compiler
Ich habe folgenden code, es ist code aus tomcrypto der Bedienungsanleitung und es funktioniert nicht bei MS VC++ 2008 EE. Keine Hilfe? Auch kann ich Fragen ersetzen char*
durch std::string
Objekt?
int main(void)
{
hash_state md;
unsigned char *in = "hello world", out[16];
/* setup the hash */
md5_init(&md);
/* add the message */
md5_process(&md, in, strlen(in));
/* get the hash in out[0..15] */
md5_done(&md, out);
return 0;
}
Fehler:
\main.cpp(7) : error C2440: 'initializing' : cannot convert from 'const char [12]' to 'unsigned char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
.\main.cpp(11) : error C2664: 'strlen' : cannot convert parameter 1 from 'unsigned char *' to 'const char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
EDIT: Jetzt code sieht wie folgt aus:
int main(void)
{
register_hash(&md5_desc);
hash_state md;
char* p = "hello wordl";
unsigned char *in = reinterpret_cast<unsigned char*>(p);
char* out[16];
/* setup the hash */
md5_init(&md);
/* add the message */
md5_process(&md, const_cast<char*>(in), strlen(in));
/* get the hash in out[0..15] */
md5_done(&md, out);
return 0;
}
Fehler:
\main.cpp(21) : error C2440: 'const_cast' : cannot convert from 'unsigned char *' to 'char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
.\main.cpp(21) : error C2664: 'strlen' : cannot convert parameter 1 from 'unsigned char *' to 'const char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
.\main.cpp(23) : error C2664: 'md5_done' : cannot convert parameter 2 from 'char *[16]' to 'unsigned char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Siehe meine aktualisierte Antwort.
ja, aber strlen nicht übergeben wird und es so ich habe das gleiche casting, strlen Programm kompiliert, aber wenn ich ausdrucken array, es ist shwoing memory Adresse nicht-hash. Ich werde wohl einige c++ - Bibliothek.
ja, aber strlen nicht übergeben wird und es so ich habe das gleiche casting, strlen Programm kompiliert, aber wenn ich ausdrucken array, es ist shwoing memory Adresse nicht-hash. Ich werde wohl einige c++ - Bibliothek.
InformationsquelleAutor damnit | 2011-04-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist falsch in C++:
"hello world"
ist ein string-literal und hat den Typconst char[12]
. In C ist es der Typchar[12]
, aber dieconst
hier egal, denn in C++ gibt es eine implizite (aber veraltet) Konvertierung, die es ermöglicht einen string-literal konvertiert werden, um einechar*
.Das problem ist, dass
char
undunsigned char
sind verschiedene Arten. Es ist egal, obchar
ist unsigniert, die dreichar
Arten (char
,unsigned char
, undsigned char
) sind alle Verschieden und in C++ können Sie die Konvertierung zwischen Zeigern auf die drei Typen ohne cast.Dies funktioniert in C, weil in C Sie können konvertieren beliebiger pointer-to-object Typ, alle anderen Zeiger-auf-Objekt-Typ ohne einen cast. Das ist nicht der Fall in C++.
In C++ du brauchst:
Entfernung von constness ist in der Regel eine schlechte Idee, da string-Literale sind nicht änderbar, aber manchmal ist es notwendig, beim Umgang mit legacy-Bibliotheken, die nicht const-korrekten.
Die Umwandlung von
char*
zuunsigned char*
ist sicher, da alle Objekte können behandelt werden wie ein array vonchar
,unsigned char
odersigned char
in C++.char[12]
konvertiertchar*
, und es gibt keine implizite Konvertierungchar*
zuunsigned char*
.Kanze: Mein Verständnis ist, dass in C die meisten Zeiger Konvertierungen implizit, z.B.
int* x = "hello";
gilt in C auch wenn es lächerlich ist.InformationsquelleAutor James McNellis
char
ist eine andere Art zusigned char
oderunsigned char
; string-Literale sind immer vom Typ(const) char *
; so kann man nicht zuordnen, um eine(const) signed char *
oder eine(const) unsigned char *
. Um dies zu beheben, entfernen Sie dieunsigned
von Zeile 4.Wenn Ihr
md5_process()
Funktion explizit nimmt eineunsigned char *
als argument, dann sollten Sie einen Darsteller an diesem Punkt:[Wie schon andere gesagt haben, Sie sollten wirklich definieren
in
alsconst char *in
wie es verweist auf ein string-literal, aber das ist nicht das Problem hier.]InformationsquelleAutor Oliver Charlesworth
Versuchen wir es noch einmal:
Funktioniert das?
const unsigned char*
Warum sollte dies nicht funktionieren?
in
ist einconst unsigned char*
.Sorry ich meinte einen unsigned char*
md5_process
nimmtconst unsigned char*
finden Sie unter github.com/libtom/libtomcrypt/blob/master/src/headers/...InformationsquelleAutor Philipp
Dies ist, weil litteral strings sind const in C++ und initialisieren Sie es mit einem non-const-Zeiger:
Allerdings könnte es ein problem verursachen, wenn md5_process nimmt eine nicht-const
char*
, in diesem Fall müssen Sie zu werfen, um eine nicht-const:Casting funktioniert nicht.
was ist der Fehler??? Würde es helfen, haben der Erklärung von
md5_process
Ihre Fragemd5_process Erklärung: md5_prcoess(hash_state *md, const unsigned char *in, unsigned long inlen); immer Noch Fehler, es kann nicht kommentiert werden
Sie brauchen nicht zu werfen, die const, aber Sie haben zu werfen
char
zuunsigned char
mitreinterpret_cast
. Hier sind die Prototypen: github.com/libtom/libtomcrypt/blob/master/src/headers/...InformationsquelleAutor CharlesB