IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Je ne comprends pas cette ligne


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 69
    Par défaut Je ne comprends pas cette ligne
    Bonjour à vous, j'utilise un bout de code retrouver sur le net pour la récupération d'une page web via libcurl mais ça c'est pas très important, il y a une ligne que je ne comprends pas dans ce bout de code et ça me frustre au plus haut point. Je ne sais pas les notions qui me manquent et c'est là que j'ai besoin de votre aide. J'ai lu plusieurs tuto c++ du début à la fin et je ne vois vraiment pas ou chercher pour comprendre cette ligne et toutes ces parenthèses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    Cette ligne vient de cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
    {
        ((std::string*)userp)->append((char*)contents, size * nmemb);
        return size * nmemb;
    }
    Vous pouvez m'expliquer ce que fait cette fonction mais je cherche surtout à savoir ce que je dois apprendre pour pouvoir reproduire une fonction similaire plus tard. Merci infiniment

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 757
    Par défaut
    En réalité c'est ultra trivial mais tu vas te faire démonter parce que c'est du code C (*) et du du code C++ (C++03) avant le C++ moderne (C++11, C++14, ...)
    * -> la bibliothèque curl est écrite en C, donc c'est normal.

    Donc en paramètre tu reçois contents et userp qui sont de type void*.
    void* c'est une technique en C pour avoir de la généricité, c'est à dire de passer des paramètres de n'importe quel type.

    Donc tu es obligé de caster pour récupérer le vrai type, sinon le compilateur t'envoie bouler parce qu'avec le type void, tu ne peux pas utiliser ta variable/ paramètre (void c'est rien, c'est pour cela que ce mot clef est utilisé pour faire des procédures, des fonctions qui ne retournent aucun résultat)
    Ici tu castes comme en C, (std::string*) userp et (char*) contents.
    Ai-je besoin de te dire, que caster un void* cela peut être dangereux et plantogène

    Et ensuite, comme tu as les vrais types, tu peux utiliser les objets normalement : tu appelles la méthode append de la classe string (<- lien cplusplus.com en anglais), cette signature buffer (4) string& append (const char* s, size_t n);.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 69
    Par défaut
    Merci beaucoup pour cette réponse, donc si j'ai bien compris (ce qui est loin d'être sûr), la fonction reçoit des variables de type void donc sans type, et l'attribution du type se fait à l'intérieur de cette fonction ? C'est ça que tu appelles "caster" un void ? Et c'est donc une pratique à éviter ? Je vais essayer de refaire cette fonction de manière plus propre même si c'est pas gagné pour l'instant. x)

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 69
    Par défaut
    Je reposte sur mon sujet car il y a quelque chose que je ne comprends pas, la relation entre c et c++, CURL est en c mais utilisable en c++ normalement, j'ai trouvé un code qui me parais clair et que je comprends:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <stdio.h>
    #include <curl/curl.h>
     
    int main(void)
    {
      CURL *curl;
      CURLcode res;
     
      /* In windows, this will init the winsock stuff */ 
      curl_global_init(CURL_GLOBAL_ALL);
     
      /* get a curl handle */ 
      curl = curl_easy_init();
      if(curl) {
        /* First set the URL that is about to receive our POST. This URL can
           just as well be a https:// URL if that is what should receive the
           data. */ 
        curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");
        /* Now specify the POST data */ 
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");
     
        /* Perform the request, res will get the return code */ 
        res = curl_easy_perform(curl);
        /* Check for errors */ 
        if(res != CURLE_OK)
          fprintf(stderr, "curl_easy_perform() failed: %s\n",
                  curl_easy_strerror(res));
     
        /* always cleanup */ 
        curl_easy_cleanup(curl);
      }
      curl_global_cleanup();
      return 0;
    }
    Dois-je faire quelque chose de particulier pour pouvoir l'utiliser dans un code c++ ? Encore merci de m'éclairer

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 757
    Par défaut
    Citation Envoyé par Talsaj Voir le message
    Dois-je faire quelque chose de particulier pour pouvoir l'utiliser dans un code c++ ? Encore merci de m'éclairer
    Le C++ étant une surcouche du C apportant la notion d'objet, le polymorphisme, la surcharge ... la généricité avec les templates, le compilateur C++ compile du code C. Mais pas le contraire.

    Par contre, il peut y avoir certaines gênes
    Par exemple, en C tu n'as pas besoin de caster le résultat d'un appel malloc (retour void*), au contraire du C++.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 69
    Par défaut
    Merci pour ta super réactivité, donc de manière générale c'est ok, je pense avoir à peu prêt compris ta dernière phrase (tu sens le doute ?). Je vais donc travailler ça de mon côté et je reviendrais embêter les personnes expérimentées comme toi au besoin. Bonne journée à toi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Je ne comprend pas cette instruction
    Par Nono Sto dans le forum Général Python
    Réponses: 2
    Dernier message: 13/04/2010, 00h56
  2. [PHPExcel] Comprend pas cette écriture ?
    Par a028762 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 05/07/2009, 15h07
  3. Je ne comprends pas cette ligne de code
    Par beegees dans le forum C++
    Réponses: 17
    Dernier message: 13/05/2008, 11h02
  4. Comprend pas cette commande SED
    Par DIE dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 05/10/2006, 13h58
  5. [Boolean]Je ne comprend pas cette instruction
    Par jcachico dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/01/2006, 16h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo