Compiler Error: Invalid Conversion from int* unsigned int* [-fpermissive]
Bin ich mit den seltsamsten Problem heute. Ich arbeitete mit einem Beispiel online, und mein Mangel an überraschung, es hat nicht funktioniert (Sie ziemlich viel nie tun). Ich ging über die Festsetzung es selbst, aber ich scheine zu stecken, dieser Fehler:
Error: Invalid Conversion from int* to unsigned int* [-fpermissive]
Verstehe ich das. Ich bin die Bereitstellung einer int*
will es ein unsigned int*
. Aber ich weiß wirklich nicht warum die int*
generiert wird.
Hier ist die snippet-code werfen das problem:
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_length;
EVP_DigestFinal_ex(md_ctx, md_value, &md_length);
Das Dritte argument der Funktion Anruf &md_length
, die das problem verursacht. Suchen Sie in der Dokumentation für die Funktion call (Von OpenSSL, wenn es
Angelegenheiten), erwartet es, das argument zu sein unsigned int*
Typ, der da will, weil es eine Adresse (oder zumindest, dass, wie das Beispiel, mit dem ich arbeite ist es zu benutzen).
Lustige an der Sache ist, dachte ich, dass die &
Betreiber zurückgegeben unsigned int*
, als Rückgabe ein int*
macht keinen Sinn, da Computer haben keine negativen Adressen in Ihrer Erinnerung.
Hier ist das Beispiel, das ich im folgenden, zusammen mit, wenn Sie möchten, werfen Sie einen Blick: https://www.openssl.org/docs/crypto/EVP_DigestInit.html
Unten ist der Quellcode, sollten Sie wollen, um es selbst auszuprobieren. Ich Zweifel, die Sie tatsächlich benötigen, es zu Lesen, dieses problem zu lösen, aber nachdem es hier ja nicht Schaden.
Source Code:
//* Description *//
//Title: Example
//Author: Boom Blockhead
//Example Program to Test OpenSSL
//* Libraries *//
#include <stdio.h>
#include <cstring>
#include <openssl/evp.h>
//* Namespaces *//
using namespace std;
//* Main Method *//
//Runs the Program and Interprets the Command Line
int main(int argc, char* argv[])
{
//Initialize the Messages
char msg1[] = "Test Message\n";
char msg2[] = "Hello World\n";
//Validate Argument Count
if(argc != 2)
{
printf("Usage: %s digestname\n", argv[0]);
exit(1);
}
//Determine Message Digest by Name
OpenSSL_add_all_digests();
const EVP_MD* md = EVP_get_digestbyname(argv[1]);
//Make sure a Message Digest Type was Found
if(md == 0)
{
printf("Unknown Message Digest %s\n", argv[1]);
exit(1);
}
//Create the Message Digest Context
EVP_MD_CTX* md_ctx = EVP_MD_CTX_create();
//Setup the Message Digest Type
EVP_DigestInit_ex(md_ctx, md, NULL);
//Add the Messages to be Digested
EVP_DigestUpdate(md_ctx, msg1, strlen(msg1));
EVP_DigestUpdate(md_ctx, msg2, strlen(msg2));
//Digest the Message
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_length;
EVP_DigestFinal_ex(md_ctx, md_value, &md_length); //<--- ERROR
//Destroy the Message Digest Context
EVP_MD_CTX_destroy(md_ctx);
//Print the Digested Text
printf("Digest is: ");
for(int i = 0; i < md_length; i++)
printf("%02x", md_value[i]);
printf("\n");
//Clean up the Message Digest
EVP_cleanup();
//Exit the Program
exit(0);
return 0;
}
Auch setzen die explizite Umwandlung von (unsigned int*)
scheint nur noch schlimmer machen, als ich bekomme dann folgende Fehler:
example.cpp:(.text+0x91): undefined reference to `OpenSSl_add_all_digests`
...
example.cpp:(.text+0x1ec): undefined reference to `EVP_cleanup`
Grundsätzlich, beschwert es sich über all die OpenSSL-Funktionen.
Schließlich (wieder, dies ist nur, um Ihnen Jungs alles, was Sie eventuell benötigen könnten) ich bin mir nicht zu schicken, in eine komische Argumente an den compiler. Ich bin einfach mit:
gcc example.cpp -o example.out
Da es ist ein Fehler, der example.out
eigentlich nie angelegt wird.
&
auf eine int
variable, erhalten Sie int*
, wenn Sie es auf einer float
variable, die Sie bekommen float*
, wenn Sie es auf einer std::string
Objekt, dann erhalten Sie std::string*
.
InformationsquelleAutor Boom | 2015-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist nicht "lustig"; das ist einfach falsch.
Den Adresse-von operator angewendet auf ein Objekt vom Typ
T
gibt Sie einen Zeiger vom TypT*
.Zeitraum.
Ob
T
ist ein signed oder unsigned-Typ kommt nicht hinein, und hat nichts zu tun mit philosophischen Debatten beteiligten darüber, ob Computer können negative Adressen. In der Tat, Zeiger sind generell unterzeichnet, weil, wenn Sie nicht wären, würden Sie bald stecken bleiben, wenn Sie versuchen, nehmen Sie die Differenz zwischen zwei Adressen, oder gehen rückwärts im Adressraum.Aber das hat nichts zu tun mit der Verwendung des Begriffs
unsigned
im code.InformationsquelleAutor Lightness Races in Orbit
Sie sind Missverständnis, was der name bedeutet.
unsigned int*
ist ein Zeiger auf einunsigned int
. unsigned bezieht sich nicht auf den Zeiger Wert.Also die Lösung ist die änderung der int zu unsigned int.
Das ist ein anderes problem. Wir behandeln es als solches.
Sehr gut. Ich werde versuchen, Sie zu Sortieren Sie es aus, und poste eine andere Frage, wenn ich kann es nicht reparieren.
InformationsquelleAutor typ1232
Es ist nicht unterzeichnet-ness der Speicheradresse (Zeiger zugrunde liegenden Wert), es ist die signierte-ness der Datentyp gespeichert in dem Speicher-Adressen, in diesem Fall Ganzzahlen.
Ändern Sie Ihre
md_length
zu einemunsigned int
gemäß der Spezifikation und sollte es OK sein.InformationsquelleAutor Andy Brown