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.

Die Adresse-von-operator gibt einen Zeiger auf den Typ der Variablen angewendet. Wenn Sie & 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

Schreibe einen Kommentar