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 :

Compréhension d'un programme


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Compréhension d'un programme
    Bonjour ,

    Je suis étudiant en électronique et je ne suis pas (mais alors vraiment pas) doué en informatique ... BlaBlaBla

    J'ai un problème de compréhension d'un programme dans mon cours :

    //Programme qui consiste à rentrer un texte dans un tableau , ensuite copier le texte dans une autre variable t1[100]; t2[100] via les pointeurs//

    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
    #include"stdio.h"
    void main()
    {
        char t1[100],t2[100]; // déclaration des t2 chaines de caractères jusque là pas de soucis 
        char *p1,*p2; // déclaration des pointeurs de format char : ok aussi 
        p1=t1 // j'assigne à p1 la valeur de t1
        p2=t2 // j'assigne à p2 la valeur de t2
     
        scanf("%s",t1); // Je rentre le texte 1
     
        for(;*p1!=0x00;*p2=*p1,p1++,p2++); // Voilà c'est la que je bloque ma question que représente 0x00 c'est pas du binaire , hexadécimal , qu'est-ce c'est, à quoi ça sert? 
        *p2=0x00;                                                                                                        
        getch();
     
    }
    Voilà les sujets sur lesquels je bloque et que je veux bien que vous me balanciez des liens pour mieux comprendre ...

    Les fonctions (valeurs renvoyées , etc)
    Les pointeurs
    Les interruptions
    Les Fichiers


    Je vous remercie d'avance pour votre patience et votre aide !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    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 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p1=t1 // j'assigne à p1 la valeur de t1
    p2=t2 // j'assigne à p2 la valeur de t2
    Non pas vraiment p1 et p2 pointe respectivement sur t1 et t2

    C'est pour cela qu'on ne passe que p1 dans l'appel de la fonction scanf et non pas son adresse (&p1): p1 est un pointeur.

    Dans la documentation de scanf
    Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence.

    Parce que:
    • p1 est un pointeur
    • *p1 est le déférencement du pointeur pour "aller" chercher la valeur pointée


    Donc *p1!=0x00 signifie tant qu'on ne rencontre pas le caractère NULL avec une représentation hexadécimale ('\0' est mieux ).
    Voir la documentation au dessus.

    Et au passage p1++ c'est de l'arithmétique de pointeurs

  3. #3
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 851
    Points : 2 293
    Points
    2 293
    Par défaut
    Donc *p1!=0x00 signifie tant qu'on ne rencontre pas le caractère NULL avec une représentation hexadécimale ('\0' est mieux ).
    Le caractere NULL ? J'le connais pas celui-la ! La valeur NULL me semble plus indiquee et NULL != '\0'. NULL est utilise pour un pointeur tandis que '\0' est utilise pour un char. Les deux valent 0 mais ce n'est pas la meme chose.

    Et au passage p1++ c'est de l'arithmétique de pointeurs
    J'ai pas compris ce que tu voulais dire...

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p1=t1 // j'assigne à p1 la valeur de t1
    p2=t2 // j'assigne à p2 la valeur de t2
    Non pas vraiment p1 et p2 pointe respectivement sur t1 et t2
    Moi je pense que l'interprétation du JulienBlomme est la bonne. La valeur de t1 et de t2, c'est l'adresse du tableau / du premier élément du tableau, donc dans pi on met bien la valeur de ti. Celle de foetus n'est pas fausse non plus, même s'il serait plus juste de dire que pi pointe sur ti[0] vu le typage des pointeurs pi.

    for(;*p1!=0x00;*p2=*p1,p1++,p2++);
    Quand on rencontre ce genre de code peu lisible (ça fait très style K&R), il faut essayer de réécrire la boucle de manière plus simple. La grammaire du for() étant for(init; test pour continuer ou arrêter; opération de fin d'itération), on peut la réécrire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // pas d'init
    while(*p1 != 0x00)
    {
        *p1 = *p2;
          p1++;
          p2++;
    }
    Il faut savoir qu'un caractère en C n'est autre qu'un nombre. La correspondance entre ce nombre et le caractère "pour les humains" est donnée par la table ASCII. Il y a un caractère spécial, écrit pour les humains '\0', écrit en nombre 0 == 0x00 =0b0. C'est celui qui termine les chaines de caractères en C.

    Parti de ça, tu dois pouvoir comprendre ce que fait cette boucle.

    *p2 --> on déréférence le pointeur pour accéder à la valeur.
    = 0x00 --> on met le caractère spécial dont je viens de parler pour "terminer" la chaine de caractère.

    Maintenant que tu as toutes les clés pour comprendre ce code


    PS :
    NULL est utilise pour un pointeur tandis que '\0' est utilise pour un char. Les deux valent 0 mais ce n'est pas la meme chose.
    Je n'ai toujours pas réussi à avoir la certitude que NULL vaut zéro ou autre chose XD

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    Bonjour,
    Je crois que d'après les spécifications le pointeur NULL n'a pas obligation de pointer sur l'adresse 0. Néanmoins par convention il est quasiment toujours implémenté comme ça.

    Pour avoir un programme clair, je conseillerai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (pointeur == NULL)
    if (caractere == '\0')
    if (nombre == 0)
    if (!booleen)
    C'est la même chose, mais c'est pas pareil >_<

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Il me semble que d'après les specs, NULL doit toujours, du point de vue du compilo, valoir zéro.
    Par contre en mémoire, le fait d'être représenté par "tous les bits à zéro" n'est pas garanti.

    En gros, (intptr_t)p n'est pas garanti être égal à *(intptr_t*)&p.
    C'est un peu la même chose que la différence entre représentation de flottant et entier (sauf que le standard IEEE754 exige que "tous les bits à zéro" représente zéro)
    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.

Discussions similaires

  1. [Aide] Compréhension de ce programme
    Par omar6995 dans le forum Prolog
    Réponses: 0
    Dernier message: 19/01/2015, 23h39
  2. Compréhension d'un programme
    Par wahidred dans le forum MATLAB
    Réponses: 1
    Dernier message: 28/11/2010, 23h53
  3. Réponses: 3
    Dernier message: 24/02/2010, 15h17
  4. Problème de compréhension d'un programme C
    Par soso78 dans le forum Débuter
    Réponses: 8
    Dernier message: 28/01/2009, 20h13
  5. [Débutante] Compréhension programme - mode debug
    Par bolo dans le forum Assembleur
    Réponses: 14
    Dernier message: 07/01/2005, 19h33

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