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 :

Est-ce que ma variable prend la taille d'une autre ?


Sujet :

C

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Est-ce que ma variable prend la taille d'une autre ?
    Bonjour tout le monde,

    J'ai un petit doute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void* Nouveau = realloc(Planete.Nom,(strlen(Nom)+1)*sizeof(char));
    	if (Nouveau == NULL) { free(Copie); return false; }
    	Planete.Nom = (char*)Nouveau;
    Si je comprends bien cette partie de code, je vais réallouer (c'est à dire agrandir ou rétrécir ma variable avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void* Nouveau = realloc(Planete.Nom,(strlen(Nom)+1)*sizeof(char));
    par contre, je ne comprends pas ce que fais cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Planete.Nom = (char*)Nouveau;
    la ligne suivante est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(Planete.Nom,Nom);
    Je me demande donc si Planete.Nom ne prend pas la taille de Nouveau ????

    Merci d'avance pour votre aide so precious.

    beegees

  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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Nouveau est ici une variable temporaire destinée à te protéger au cas où realloc ne serait pas en mesure d'allouer un espace mémoire de la taille demandée. En effet, realloc() retourne NULL en cas d'échec et ne libère pas l'espace mémoire qu'on désires agrandir ou rétrécir (c'est d'ailleurs heureux). Si on écrivait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* -tc- ATTENTION: ceci est déconseille! */
    Planete.nom = realloc(Planete.Nom,(strlen(Nom)+1)*sizeof(char));
    Planete.nom prendrait la valeur NULL en cas d'échec de realloc() et l'espace sur lequel il pointait est perdu (fuite de mémoire). C'est pourquoi on utilise un pointeur temporaire (Nouveau). Si realloc() échoue, Nouveau reçoit la valeur NULL et on peut alors réagir en conséquence (réallouer plus petit, libérer de la mémoire inutilisée avant d'essayer à nouveau, utiliser un pool de mémoire pré-allouée en début de prog pour les cas d'urgence, etc.). Si la valeur reçue par Nouveau est différente de NULL, on peut alors sans crainte affecter cette adresse à Planete.nom.

    Thierry

  3. #3
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Pourquoi créer un pointeur void* puis le caster seulement après?

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu écris du code que tu ne comprends pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void* Nouveau = realloc(Planete.Nom,(strlen(Nom)+1)*sizeof(char))
    pourquoi void * ? sizeof (char) vaut toujours 1. Cette ligne s'écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* Nouveau = realloc(Planete.Nom,strlen(Nom)+1)
    La réallocation peut déplacer la zone allouée. Elle peut également échouer, c'est pourquoi, on conserve précieusement l'adresse de l'ancienne zone Planete.Nom et on place la nouvelle adresse dans une autre variable Nouveau. Si la réallocation réussi, l'adresse de la (nouvelle) zone allouée est placée dans Planete.Nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Planete.Nom = (char*)Nouveau;
    le (char *) est inutile
    on recopie ensuite nom dans cette nouvelle zone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(Planete.Nom,Nom);

  5. #5
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* Nouveau = realloc(Planete.Nom,strlen(Nom)+1)
    Ou alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *Nouveau = realloc(Planete.Nom, (strlen(Nom) + 1) * sizeof *Nouveau);
    Ce qui facilitera la maintenance si un jour il décide de passer de char à wchar_t, par exemple.

    Thierry

  6. #6
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour Thierry,

    Merci pour ta réponse simple, précise et efficace !

    J'ai tout à fait compris maintenant et j'ai ajouté ta réponse à mon tuto.

    Merci encore !

    beegees

  7. #7
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par diogene Voir le message
    Tu écris du code que tu ne comprends pas ?
    Bonjour Diogene,

    Ce n'est pas moi qui ait écrit ce code, je n'en suis pas encore capable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void* Nouveau = realloc(Planete.Nom,(strlen(Nom)+1)*sizeof(char))
    pourquoi void * ? sizeof (char) vaut toujours 1. Cette ligne s'écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* Nouveau = realloc(Planete.Nom,strlen(Nom)+1)
    Voici l'explication du Professeur :

    Ça peut sembler un peut idiot au départ de faire fois sizeof(char) mais il faut savoir que si par après vous changer gestion de caractère, que vous travaillez avec des caractères unicode par exemple, eux ne font pas un byte, donc le type de données va changer, donc si vous utiliser un autre type de char (unicode par exemple sur 2 bytes) il ne faudra plus toucher à rien car ça sera dèjà fait avec le sizeof(char)

    La réallocation peut déplacer la zone allouée. Elle peut également échouer, c'est pourquoi, on conserve précieusement l'adresse de l'ancienne zone



    Planete.Nom
    et on place la nouvelle adresse dans une autre variable Nouveau. Si la réallocation réussi, l'adresse de la (nouvelle) zone allouée est placée dans Planete.Nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Planete.Nom = (char*)Nouveau;
    le (char *) est inutile
    on recopie ensuite nom dans cette nouvelle zone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(Planete.Nom,Nom);
    Merci, vaut mieux le dire deux fois qu'aucune fois

    Merci pour ta réponse et bonne soirée à toi.

    beegees

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation:
    Ça peut sembler un peut idiot au départ de faire fois sizeof(char) mais il faut savoir que si par après vous changer gestion de caractère, que vous travaillez avec des caractères unicode par exemple, eux ne font pas un byte, donc le type de données va changer, donc si vous utiliser un autre type de char (unicode par exemple sur 2 bytes) il ne faudra plus toucher à rien car ça sera dèjà fait avec le sizeof(char)
    Non, c'est une erreur, (qui n'en fait pas !) sizeof(char) vaut toujours 1. Mais par contre la remarque de Thierry répond bien au souci (légitime) de ton prof

  9. #9
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par beegees Voir le message
    Bonjour Thierry,

    Merci pour ta réponse simple, précise et efficace !

    J'ai tout à fait compris maintenant et j'ai ajouté ta réponse à mon tuto.

    Merci encore !

    beegees
    Tu rédiges un tuto sur le C? Tu as un lien?

    Thierry

  10. #10
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Salut Thierry,

    Je rédiges un tuto sur le C pour l'examen que je devrai présenter le 30 janvier 08.

    Ce n'est pas du tout un tuto pro que je peux présenter au public.

    beegees

  11. #11
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par beegees Voir le message
    Salut Thierry,

    Je rédiges un tuto sur le C pour l'examen que je devrai présenter le 30 janvier 08.

    Ce n'est pas du tout un tuto pro que je peux présenter au public.

    beegees
    OK, bonne chance pour l'examen!

    Thierry

  12. #12
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    OK, bonne chance pour l'examen!

    Thierry
    Merci Thierry, si je le réussi, ça sera entre autre grâce à toi.

    beegees

Discussions similaires

  1. Est-ce que Python, peux collecter des infos sur une machine
    Par pierrot10 dans le forum Général Python
    Réponses: 2
    Dernier message: 26/04/2012, 22h56
  2. qu'est ce que la variable report_count?
    Par jamesleouf dans le forum iReport
    Réponses: 3
    Dernier message: 04/05/2009, 17h30
  3. Qu'est ce que la variable sige?
    Par nonoprig dans le forum MATLAB
    Réponses: 1
    Dernier message: 26/05/2008, 17h40
  4. Réponses: 6
    Dernier message: 28/12/2007, 02h04

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