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 :

boucle while simple


Sujet :

C

  1. #41
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Quand l'objet pointé n'est plus valide, par exemple, suite à la libération du bloc pointé. On matérialise cet état en lui donnant la valeur NULL. C'est une opération volontaire du (bon) codeur.


    Tu te trompes de manuel. Celui de la bibliothèque C est le 3 (free(3))

    http://man.developpez.com/man3/free.3.php
    2)tu codes :

    Code :

    free (p), p = NULL;

    free() libère l'espace mémoire pointé par ptr, qui a été obtenu lors d'un appel antérieur à malloc(), calloc() ou realloc(). Si le pointeur ptr n'a pas été obtenu par l'un de ces appels, ou si il a déjà été libéré avec free(), le comportement est indéterminé. Si ptr est NULL, aucune tentative de libération n'a lieu.
    bonsoir Emmanuel, donc free libère l'espace mémoire pointé içi par p(pointeur p) et l'associe à rien; c'est à dire ne pointe sur rien donc NULL. t'es OK ? A +

  2. #42
    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 xeron33 Voir le message
    donc free libère l'espace mémoire pointé içi par p(pointeur p)
    OK.
    et l'associe à rien; c'est à dire ne pointe sur rien donc NULL. t'es OK ?
    Non.
    C'est mon action volontaire p = NULL qui fait qu'il pointe sur 'rien'.

    Si on fait simplement free (p); p se retrouve à pointer sur de la mémoire invalide. Toute réutilisation entrainerait un comportement indéterminé. Pour éviter ça, j'utilise un principe de Bonne Programmation qui veut que l'état d'un poiteur soit toujours clair et testable. NULL, c'est clair : invalide.

    Ca a l'air difficile à comprendre... Tu trouves ça compliqué ?

  3. #43
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    OK.Non.
    C'est mon action volontaire p = NULL qui fait qu'il pointe sur 'rien'.

    Si on fait simplement free (p); p se retrouve à pointer sur de la mémoire invalide. Toute réutilisation entrainerait un comportement indéterminé. Pour éviter ça, j'utilise un principe de Bonne Programmation qui veut que l'état d'un poiteur soit toujours clair et testable. NULL, c'est clair : invalide.

    Ca a l'air difficile à comprendre... Tu trouves ça compliqué ?
    bonjour Emmanuel, oui ça j'avais compris que c'était ton action volontaire, c'était simplement pour voir si ce que tu faisais je le comprenais bien merçi en tout cas.
    j'aurai d'autres questions à propos des pointeurs merçi encore A +

  4. #44
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     /* Definition de la variable 'a' valant 4 */
       int a = 4;
     
       /* Definition d'un pointeur 'p' initialise' avec l'adresse de la variable 'a' */
       int *p = &a;
     
       /* Definition de la variable 'b' non initialisee */
       int b;
     
       /* recuperation de la valeur de 'a' dans 'b' via le pointeur 'p' */
       b = *p;
     
       /* 'b' vaut maintenant 4 */
    bonsoir Emmanuel je voudrais faire le clair dans mon esprit par apport à une question que je me pose sur les pointeurs. En effet un pointeur contient l'adresse d'une variable ok quelle est la différence entre adresse et valeur ? Ici on donne :
    puis
    Tout ça pour moi me pose pas de problème sauf que si p reçoit l'adresse de a il prend donc automatiquement sa valeur puisque et /* 'b' vaut maintenant 4
    ma question est : comment niveau mémoire fait on la différence entre une adresse et une valeur?Pardonne moi si tu me trouves un peu compliqué par moment mais ça fais parti de ma nature compliqué et passionné. Allez merçi encore pour suivre cette discussion A+

  5. #45
    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 xeron33 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     /* Definition de la variable 'a' valant 4 */
       int a = 4;
     
       /* Definition d'un pointeur 'p' initialise' avec l'adresse de la variable 'a' */
       int *p = &a;
     
       /* Definition de la variable 'b' non initialisee */
       int b;
     
       /* recuperation de la valeur de 'a' dans 'b' via le pointeur 'p' */
       b = *p;
     
       /* 'b' vaut maintenant 4 */
    En effet un pointeur contient l'adresse d'une variable ok quelle est la différence entre adresse et valeur ?
    Une valeur est une combinaison de bits à laquelle on donne un sens. (une sémantique).

    Par exemple, la combinaison 0010 0000 (ou 0x20) représente soit la valeur numérique 32, soit le caractère ASCII ESPACE.

    D'une manière générale, le contenu d'une variable est appelé valeur. Lorsqu'il s'agit d'un variable de type int, on dit que cette valeur est un entier. Quand la variable est un pointeur, cette valeur s'appelle une adresse.

    Une adresse est donc un type particulier de valeur.

    Ici on donne :
    puis
    la variable 'p' contient l'adresse de la variable 'a'.
    La variable 'b' contient la valeur pointée par la variable 'p' (donc la valeur de la variable 'a').
    Tout ça pour moi me pose pas de problème sauf que si p reçoit l'adresse de a il prend donc automatiquement sa valeur
    Ben non. Tu confonds l'adresse de la variable 'a' et valeur de la variable 'a'. Ce sont 2 choses distinctes (pas le même type, pas la même valeur).
    puisque et /* 'b' vaut maintenant 4
    C'est l'opérateur '*' qui a permis de récupérer la valeur de la variable pointée par 'p'. C'est le déréférencement.
    ma question est : comment niveau mémoire fait on la différence entre une adresse et une valeur?
    Je crois que tout a été dit. Tu compares des choses de nature différentes, d'où l'échec de ton raisonnement...

  6. #46
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Une valeur est une combinaison de bits à laquelle on donne un sens. (une sémantique).

    Par exemple, la combinaison 0010 0000 (ou 0x20) représente soit la valeur numérique 32, soit le caractère ASCII ESPACE.

    D'une manière générale, le contenu d'une variable est appelé valeur. Lorsqu'il s'agit d'un variable de type int, on dit que cette valeur est un entier. Quand la variable est un pointeur, cette valeur s'appelle une adresse.

    Une adresse est donc un type particulier de valeur.


    la variable 'p' contient l'adresse de la variable 'a'.

    La variable 'b' contient la valeur pointée par la variable 'p' (donc la valeur de la variable 'a').
    Ben non. Tu confonds l'adresse de la variable 'a' et valeur de la variable 'a'. Ce sont 2 choses distinctes (pas le même type, pas la même valeur).

    C'est l'opérateur '*' qui a permis de récupérer la valeur de la variable pointée par 'p'. C'est le déréférencement.

    Je crois que tout a été dit. Tu compares des choses de nature différentes, d'où l'échec de ton raisonnement...
    Bonjour Emmanuel je tenais à te remercier car tu as su m'éclairer sur une question qui me turlupinais par apport aux pointeurs(adresses et valeurs) ainsi qu'aux autres sur ce forum(Thierry en particulier) pour vos aides précieuses je considère mon problème résolu Salut à +

  7. #47
    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 xeron33 Voir le message
    Bonjour Emmanuel je tenais à te remercier car tu as su m'éclairer sur une question qui me turlupinais par apport aux pointeurs(adresses et valeurs)
    "I'm just doing my job"
    -- Jack Bauer in 24.

  8. #48
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Une valeur est une combinaison de bits à laquelle on donne un sens. (une sémantique).

    Par exemple, la combinaison 0010 0000 (ou 0x20) représente soit la valeur numérique 32, soit le caractère ASCII ESPACE.

    D'une manière générale, le contenu d'une variable est appelé valeur. Lorsqu'il s'agit d'un variable de type int, on dit que cette valeur est un entier. Quand la variable est un pointeur, cette valeur s'appelle une adresse.

    Une adresse est donc un type particulier de valeur.


    la variable 'p' contient l'adresse de la variable 'a'.

    La variable 'b' contient la valeur pointée par la variable 'p' (donc la valeur de la variable 'a').
    Ben non. Tu confonds l'adresse de la variable 'a' et valeur de la variable 'a'. Ce sont 2 choses distinctes (pas le même type, pas la même valeur).

    C'est l'opérateur '*' qui a permis de récupérer la valeur de la variable pointée par 'p'. C'est le déréférencement.

    Je crois que tout a été dit. Tu compares des choses de nature différentes, d'où l'échec de ton raisonnement...
    bonjour Emmanuel puisque tu me dis que c'est ton travail de répondre sur ce forum, je me permets de revenir encore sur les pointeurs oui je sais j'insiste ! mais une question reste en suspens dans mon esprit: oui ok pour l'adresse d'une variable , oui ok pour sa valeur ça j'ai pigé maintenant mais son nom il est stocké comment lui en mémoire pour :
    son nom est "a" comment est stocké "a" ?
    Salut A+

  9. #49
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    En C, il n'est pas stocké (ou alors, dans les infos de débogage).
    Seul le compilateur sait que la variable s'appelle "a". Pour le programme lui-même, la variable n'a pas de nom: Elle a juste:
    • soit une adresse,
    • soit un offset par rapport à une adresse (typiquement sur un x86, les variables locales ont un offset par rapport au "frame pointer", un pointeur sur la partie de la pile qui correspond à la fonction),
    • soit un registre (pour les variables qui ne sont pas sauvegardées en mémoire).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #50
    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
    Citation Envoyé par xeron33 Voir le message
    mais son nom il est stocké comment lui en mémoire pour :
    son nom est "a" comment est stocké "a" ?
    Salut A+
    En gros, le compilateur stocke les identificateurs tels que "a" dans l'exemple ci-dessus dans une table des symboles. Cette table des symboles, implantée par exemple savec une table de hachage, permet de faire correspondre un identificateur avec une adresse et un type. Une fois que le code assembleur est généré, il ne reste aucune trace des identificateurs utilisés (à moins de demander explicitement au compilateur de conserver ces informations en vue du déboggage -> option -g avec gcc).

    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++

    +

  11. #51
    Membre émérite
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    "I'm just doing my job"
    -- Jack Bauer in 24.

  12. #52
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    bonjour à tous et merçi !!!
    encore une petite remarque par apport aux pointeurs :
    si je code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int a=1;
    int b=2;
    b=a;         /* içi b recoit la valeur de a d'ou b=1  */
    c'est la même chose que si je code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int a=1;
    int b=2;
    int *p;
    p=&a;
    b=*p;       /* içi b reçoit la valeur de *p d'ou b=1  */
    Mon interrogation par apport à ces deux codes pourquoi utiliser ou pas un pointeur?Est-ce plus rapide ?Quel en est l'avantage? Merçi A+

  13. #53
    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 xeron33 Voir le message
    <...> pourquoi utiliser ou pas un pointeur?Est-ce plus rapide ?Quel en est l'avantage?
    http://emmanuel-delahaye.developpez....util_pointeurs

  14. #54
    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
    L'action réalisée par les deux codes proposés est équivalente. Le 1er présente l'avantage d'être simple... et est probablement très légèrement plus rapide. Je ne vois pas d'intérêt autre que pédagogique à transiter par un pointeur pour affecter la valeur d'une variable a à une variable b (dans le contexte présenté ci-dessus).

    Un pointeur est par exemple utile lorsqu'il s'agit de passer l'adresse d'une variable à une fonction. Dans ce contexte, il est alors possible de modifier la valeur située à l'adresse pointée depuis la fonction. Par ailleurs, lorsqu'il s'agit de passer une structure de grande taille à une fonction, l'usage d'un pointeur permet d'éviter d'avoir à copier la structure en entier à chaque appel de la fonction considérée (gain en termes de performance et d'occupation de la mémoire).

    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++

    +

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Problème boucle while + boucle simple
    Par horit dans le forum Général Python
    Réponses: 2
    Dernier message: 26/11/2013, 09h45
  2. Boucle while & read
    Par gibet_b dans le forum Linux
    Réponses: 4
    Dernier message: 29/04/2005, 15h38
  3. boucle while et post incrémentation
    Par tut dans le forum C++
    Réponses: 7
    Dernier message: 10/12/2004, 17h24
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 22h51
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

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