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 :

fonction memset ?


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut fonction memset ?
    Bonjour.

    man memset :
    SYNOPSIS
    #include <string.h>
    void *memset (void *s, int c, size_t n);
    DESCRIPTION
    La fonction memset() remplit les n premiers octets de la
    zone de mémoire pointée par s avec l'octet c.
    Je comprends pas le "int c" alors qu'ils disent "avec l'octet c".
    Sachant que un int fait rarement un octet, comment ca marche?

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    memset() copie la valeur de c convertie en unsigned char.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    ha d'accord merci.

    C'est un peu bête alors, il aurait mieux valu écrire unsigned char directement, dans le man.

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Les raisons sont historiques. Quand on a des fonctions declarees sans prototype, les arguments de type char sont promus en int. Quand on a invente les prototypes (un temps certains apres avoir invente memset), on lui a simplement donne le prototype qui correspondait a ce qui se passait pour la version sans prototype.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    memset() copie la valeur de c convertie en unsigned char.

    Thierry
    Et pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main () {
     
      int test[2];
     
      memset(test, -1, sizeof(test));
      printf("%d %d\n", test[0], test[1]);
     
      return 0;
    }
    m'affiche :
    -1 -1
    merci

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Le -1 passe a memset est converti en 0xFF (en supposant des chars de 8 bits). Tu remplis totalement la memoire avec ca, et il se fait qu'un int dont tous les bytes sont 0xFF vaut -1 sur ton implementation (et toutes celles qui sont en complement a 2, les autres sont rarissimes).

    Essaie avec -2.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    ha oui effectivement.

    merci

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pasdeface Voir le message
    man memset :

    Je comprends pas le "int c" alors qu'ils disent "avec l'octet c".
    Sachant que un int fait rarement un octet, comment ca marche?
    Déjà, le terme octet est impropre, car un caractère tient dans un char qui est un byte (ou multiplet) de au moins 8-bit en C et non un octet qui fait exactement 8-bit.

    Ensuite, lors du passage d'un paramètre, les types char et short étant automatiquement convertis en int par le compilateur, inutile de mettre un type char (ou short) qui va ajouter du code de conversion dynamique totalement inutile.

    De plus, en C, une constante caractère ('A') est de type ... int.

    Tout cela est donc parfaitement cohérent, logique et performant.

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ensuite, lors du passage d'un paramètre, les types char et short étant automatiquement convertis en int par le compilateur
    Uniquement pour les fonctions variadiques et les fonctions sans prototypes (additionnellement pour celles-ci, un float est passe comme un double).

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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