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 :

initialisation array avec memset


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Points : 19
    Points
    19
    Par défaut initialisation array avec memset
    Bonjour,

    je recontre actuellement un probleme etrange:

    je cree un tableau je souhaite l'initialiser avec memset:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    unsigned int *countIntensity   = new unsigned int[numValues];
    memset(countIntensity  ,0,sizeof(countIntensity));
    cependant cette initialisation ne marche pas en effet, juste apres,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::cout << "countIntensity[0]: " <<countIntensity[0] << std::endl;
    std::cout << "countIntensity[1]: " <<countIntensity[1] << std::endl;
    std::cout << "countIntensity[2]: " <<countIntensity[2] << std::endl;
    std::cout << "countIntensity[3]: " <<countIntensity[3] << std::endl;
    retourne
    0
    0
    13113
    29


    Merci de votre aide !

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Pourquoi passer par un tableau alloué dynamiquement au lieu d'utiliser un std::vector ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Points : 19
    Points
    19
    Par défaut
    je suis actuellement en train de debugger un gros code donc j'essaye de corriger les bugs en utilisant ce qui est deja present dans le code. Tout rechanger prendrait enormement de temps.

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Tu gagnerai à changer mais bon.

    Si je regarde mon man memset, j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *memset (void *s, int c, size_t n);
    La fonction memset() remplit les n premiers octets de la zone de mémoire pointée par s avec l'octet c.
    Ce qui me ferai penser que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(countIntensity  ,0,sizeof(countIntensity));
    devrait plutôt être remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(countIntensity ,0,numValues);
    Car sizeof(countIntensity) ne renvoit pas la longeur du tableau.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ne serait-ce pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(countIntensity ,0,numValues * sizeof(*countIntensity));
    ?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Oui, c'est un oubli de ma part (j'utilise jamais memset, ca s'explique ^^)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    J'écrirai plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(countIntensity ,0,numValues * sizeof(unsigned int));
    Mais il y a des subtilités avec l'opérateur sizeof quand il prend des variables, que je connais très mal pour les éviter comme la peste, donc peut-être que ce que tu as écrit est juste aussi .

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    J'écrirai plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(countIntensity ,0,numValues * sizeof(unsigned int));
    Mais il y a des subtilités avec l'opérateur sizeof quand il prend des variables, que je connais très mal pour les éviter comme la peste, donc peut-être que ce que tu as écrit est juste aussi .
    L'opérateur sizeof n'évalue pas son expression donc il n'y a pas de risque à l'utiliser sur un pointeur, y compris NULL.
    Ce comportement est spécifié dans la norme ISO/CEI 14882:2003 5.3.3.1 :
    The operand is either an expression, which is not evaluated,...
    Cela permet donc de faire abstraction du type de l'objet pointé.
    Si plus tard ce sont des double qui sont utilisés à la place des unsigned int l'opération memset n'aura pas à être modifiée, le compilateur inférant le type de *countIntensity.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    L'opérateur sizeof n'évalue pas son expression donc il n'y a pas de risque à l'utiliser sur un pointeur, y compris NULL.
    Pas de risque côté compilateur, mais j'ai trop souvent vu des choses comme ça pour en recommander l'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char* buf = new char[50]
    for(int i = 0; i < sizeof(buf); ++i) // Mauvais code
       buf[i] = 0;
    La faute à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char buf[50]
    for(int i = 0; i < sizeof(buf); ++i)
       buf[i] = 0;
    qui lui marche...

  10. #10
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Oui en effet, les tableaux étant bien trop souvent identifiés à des pointeurs.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  11. #11
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    pourquoi ne pas utiliser std::fill() ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::fill(countIntensity ,countIntensity+numValues , 0);

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/01/2009, 12h32
  2. [MySQL] Remplir un array() avec des données issues d'une bdd
    Par fichtre! dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/12/2006, 17h03
  3. Problème de (de)serialisation d'Array avec Axis
    Par arieunier dans le forum Services Web
    Réponses: 3
    Dernier message: 21/11/2006, 20h22
  4. Réponses: 16
    Dernier message: 24/11/2005, 12h43
  5. initialisation Directinput avec delphi
    Par Madmaxx dans le forum DirectX
    Réponses: 1
    Dernier message: 21/02/2003, 17h37

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