Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] CURLCode to string

    ciao a tutti!
    dovrei trasformare la risposta che ottengo con curl in string.
    ho creato queste due funzioni, ma quando richiamo la funzione il programma fallisce.
    nessun errore in compilazione:
    codice:
    void Read::readUltimeEntrateUscite(string file) {
        curl = curl_easy_init();
        curl_slist_append(headers, "Accept: application/json");
        curl_slist_append(headers, "Content-Type: application/json");
        curl_slist_append(headers, "charset: utf-8");
        if (curl) {
            curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
            curl_easy_setopt(curl, CURLOPT_URL, url.append(file).c_str());
            curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
            curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Read::curlToString);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
            res = curl_easy_perform(curl);
            if (res == CURLE_OK) {
                cout << response << endl;
            }
        }
        curl_easy_cleanup(curl);
    }
    
    int Read::curlToString(char *data, size_t size, size_t nmemb, string *buffer) {
        int result = 0;
        if (buffer != NULL) {
            buffer->append(data, size * nmemb);
            result = size * nmemb;
        }
        return result;
    }
    il programma si blocca quando questa riga non è commentata:
    codice:
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Read::curlToString);
    penso che ci sia un errore nella funzione di callback.
    avete qualche suggerimento??

  2. #2
    ok il problema è sicuro qua:
    codice:
    size_t Read::curlToString(char *data, size_t size, size_t nmemb, string *buffer) {
        int result = 0;
        if (buffer != NULL) {
            buffer->append(data, size * nmemb); // QUI SI BLOCCA
            result = size * nmemb;
        }
        return result;
    }
    ho trovato la riga dove si blocca.
    facendo un pò di debug ho visto che sembra che char *data non sia valorizzato.
    il problema sarà quello, ma sinceramente non so il perchè!!

  3. #3
    la funzione doveva essere statica.
    così funziona.
    ciao!!

  4. #4
    Stai facendo un erroraccio, facilitato dal fatto che curl_easy_setopt non è type-safe.
    Se guardi la documentazione a proposito di CURLOPT_WRITEFUNCTION, c'è scritto:
    Pass a pointer to a function that matches the following prototype: size_t function( char *ptr, size_t size, size_t nmemb, void *userdata);
    Il problema è che quello che si aspetta è un puntatore a funzione, mentre quello che stai passando lì è un puntatore a funzione membro d'istanza, oggetto completamente differente e non compatibile con un puntatore a funzione. Un puntatore a funzione può essere usato direttamente per richiamare una funzione, un puntatore a membro va richiamato su una specifica istanza (per ulteriori informazioni, leggi qui).

    Comunque, si può aggirare il problema "barando" in questa maniera: dichiara una funzione "libera" con la firma giusta e marcata con extern "C", che verrà usata come callback per cURL; questa funzione si occuperà di richiamare il tuo callback interno alla classe:
    codice:
    extern "C" int Read_curlToString_cbkhelper(char *data, size_t size, size_t nmemb, string *userdata)
    {
        Read * that=(Read *)userData;
        return that->curlToString(data, size, nmemb, NULL);
    }
    nell'inizializzazione:
    codice:
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &Read_curlToString_cbkhelper);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);
    nel callback:
    codice:
    int Read::curlToString(char *data, size_t size, size_t nmemb, void *userdata) {
        response.append(data, size * nmemb);
        return size * nmemb;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Originariamente inviato da MItaly
    Il problema è che quello che si aspetta è un puntatore a funzione, mentre quello che stai passando lì è un puntatore a funzione membro d'istanza, oggetto completamente differente e non compatibile con un puntatore a funzione. Un puntatore a funzione può essere usato direttamente per richiamare una funzione, un puntatore a membro va richiamato su una specifica istanza (per ulteriori informazioni, leggi qui).
    avevo intuito più o meno un problema del genere, e avevo provato a usare una funzione libera, solo che non l'avevo impostata come la tua, e quindi pensavo di aver fatto una scemenza.
    non arrivo a un livello di conoscenza del genere!!!

    ma giusto per capire meglio.
    la dichiarazione di quella funzione è più C-like che C++-like, giusto??
    non è propriamente OOP.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.