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 :

Code C question !


Sujet :

C

  1. #1
    En attente de confirmation mail Avatar de wareq
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 257
    Points : 94
    Points
    94
    Par défaut Code C question !
    Bonjour

    est ce que quelqu'un comprend ce programme et pourrait me l'expliquer en me laissant des commentaires un peu partout dans le programme afin que je comprenne car je vais etre interrogé la dessus.. merci beaucoup je comtpe sur vous.. (NB : le prog est correct , corrigé )

    Le voici :



    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    /*La fonction affchar() affiche tout les caractères contenus dans un tableau.*/
     
    /*
      NOM : affchar() 										
      SYNOPSIS : #include<stdio.h>									
    	      void affchar(char *pt);								
      DESCRIPTION : La fonction affchar() affiche tout les caractères contenus dans un tableau.	
      RETOUR : Aucun 										
    */
     
    #include <stdio.h>
     
    void affchar(char *pt)
    {
    	int i = 0;
    	while (*(pt+i) != 0x00)
    	{
    		printf("%c",*(pt+i));
    		i++;
    	}
    	printf("\n");
    }
     
    main()
    {
    	char t[5] = "ABCD";
    	char *pt;
    	int i = 0;
    	pt = t;
     
     
    	while (t[i] != 0x00)
    	{
    		printf("%c",t[i]);
    		i++;
    	}
    	printf("\n");
     
    	i = 0;
    	while (*pt != 0x00)
    	{
    		printf("%c",*pt);
    		*(pt++);
    	}
    	printf("\n");	
    	pt = t;
     
    	i = 0;
    	while (*(pt+i) != 0x00)
    	{
    		printf("%c",*(pt+i));
    		i++;
    	}
    	printf("\n");
     
    	affchar(t);
    }

  2. #2
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 269
    Points
    130 269
    Billets dans le blog
    1
    Par défaut
    Correct, vraiment ? main() est déclaré sans type et ne renvoit pas de valeur de retour. Plutôt moyen comme code correct...

    Tu pousses un peu mémé dans les orties là. Nous ne sommes pas des professeurs (pour la plupart), nous répondons à des questions précises. Dis-nous plutôt ce que tu ne comprends pas, et on pourra peut-être t'expliquer.

    Mais en tout cas, tu aurais plutôt intérêt à renforcer tes bases sur le langage C dans un bon livre ou un bon tutoriel en ligne.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  3. #3
    En attente de confirmation mail Avatar de wareq
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 257
    Points : 94
    Points
    94
    Par défaut
    Non non le prof a confirmé que c'était juste et ca fait 5 mois qu'on voit le main() comme cela avec lui sans mettre le int devant , le principal c'est de comprendre ce qu'il ya dedans pour lui je pense... et gcc compile donc pas de prob !

    Sinon bah j'aimerais comprendre ce que fait chaque boucle car ligne par ligne je vois ce que ca fait mais bon , je ne saurais surement pas refaire ce prog..

  4. #4
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 269
    Points
    130 269
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wareq
    Non non le prof a confirmé que c'était juste et ca fait 5 mois qu'on voit le main() comme cela avec lui sans mettre le int devant , le principal c'est de comprendre ce qu'il ya dedans pour lui je pense... et gcc compile donc pas de prob !
    Ce n'est pas parce que gcc compile que le code est parfaitement correct et respectueux des normes ! Il y a une différence entre programme écrit comme un pied, mais compilable, et un programme compilable ET bien écrit. Si tu avais mis l'option -Wall pour gcc, il t'aurait donné au moins un avertissement : aucun return dans la fonction main() ! D'accord, sous Windows une telle erreur passerait plutôt inaperçue, mais ce n'est pas le cas sous Unix, où il est bien plus fréquent de consulter la valeur de retour d'un programme.

    L'usage de déclarer main() sans type de retour est particulièrement désuet. Je sais que malheureusement K & R indique cette syntaxe dans son livre (excellent par ailleurs), mais main() est une fonction comme une autre, elle n'a aucune raison d'être écrite à l'ancienne sans type de retour.

    Sinon bah j'aimerais comprendre ce que fait chaque boucle car ligne par ligne je vois ce que ca fait mais bon , je ne saurais surement pas refaire ce prog..
    Si tu comprends les lignes, je vois pas en quoi les boucles te posent problèmes Soit plus précis et dis-nous ce qui ne va pas.

    En tout cas ce programme visiblement tente de montrer l'utilisation des tableaux et pointeurs (il n'a aucun intérêt hormis ça) et différentes manières de faire la même chose. Reproduire ce code n'a pas vraiment d'intérêt. Il faut que tu sois capable de comprendre ce que fait le programme.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  5. #5
    En attente de confirmation mail Avatar de wareq
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 257
    Points : 94
    Points
    94
    Par défaut
    Voici mes commentaires ligne par ligne , est-ce correct ?

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <stdio.h>
     
    void affchar(char *pt)
    {
    	int i = 0;				// déclaration et initialisation de i à 0.
    	while (*(pt+i) != 0x00)		// tant que le contenu de la variable pt + i = 0
    	{
    		printf("%c",*(pt+i));	// affiche le caractere de la variable pt + i
    		i++;			// incrémentation de i
    	}
    	printf("\n");			// affiche le retour à la ligne
    }
     
    main()
    {
    	char t[5] = "ABCD";		// déclaration d'un tableau de caractères
    	char *pt;				// déclaration du pointeur pt
    	int i = 0;				// déclaration et initialisation de i à 0.
    	pt = t;				// la variable pt reçoit t
     
     
    	while (t[i] != 0x00)		// tant que le tableau de i  = 0
    	{
    		printf("%c",t[i]);		// affiche le caractere contenu dans t [i]
    		i++;			// incrémentation de i
    	}
    	printf("\n");			// affiche le retour à la ligne		
     
     
    	i = 0;				// déclaration et initialisation de i à 0.
    	while (*pt != 0x00)		// tant que le pointeur pt est différent de 0
    	{
    		printf("%c",*pt);		// affiche le contenu de la variable pt
    		*(pt++);			// incrémentation du pointeur pt
    	}
    	printf("\n");			// affiche le retour à la ligne	
    	pt = t;				// la variable pt reçoit t
     
    	i = 0;				// déclaration et initialisation de i à 0.
    	while (*(pt+i) != 0x00)		// tant que le contenu de la variable pt + i = 0 faire..
    	{
    		printf("%c",*(pt+i));	// affiche le caractere de la variable pt + i
    		i++;			// incrémentation de i
    	}
    	printf("\n");			// affiche le retour à la ligne
     
    	affchar(t);			// affichage du tableau de caractères
    }

  6. #6
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 335
    Points : 130 269
    Points
    130 269
    Billets dans le blog
    1
    Par défaut
    Euh, ça c'est plus du commentaire, mais de la paraphrase

    Je pense que personne ne doute que
    soit une incrémentation de i, par exemple.

    En plus, tu as fait du copier-coller, alors certains de tes commentaires sont faux !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = 0;            // déclaration et initialisation de i à 0.
    On ne déclare pas "i" (elle est déjà déclarée plus haut), on ne l'initialise pas non plus (ça a été fait lors de la déclaration) : on fait ici une assignation (le vocabulaire est important).

    Je pense de toute façon que tu es parfaitement capable d'expliquer ce que fais i++, ou ce que fais i = 0, non ? Ne t'évertue pas à commenter l'évidence.

    Et les commentaires sont beaucoup trop vagues pour les points réellement importants du code, c'est-à-dire ce qui touche aux pointeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%c",*pt);      // affiche le contenu de la variable pt
    C'est faux. Cela affiche le caractère pointé par la variable pt.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%c",*(pt+i));   // affiche le caractere de la variable pt + i
    Même remarque. De plus, le plus important n'est pas là de savoir que l'on regarde sur quoi pointe (pt+i), mais plutôt ce que signifie le signe "+" ici ? Une addition ? Pas exactement, c'est de l'arithmétique de pointeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (*(pt+i) != 0x00)      // tant que le contenu de la variable pt + i = 0
    Même remarque.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%c",*(pt+i));   // affiche le caractere de la variable pt + i
    Le "caractère" de la variable pt + i, ça ne veut rien dire. Tu fais ici une indirection du pointeur pt + i, tu récupères la valeur pointée par le pointeur pt + i.

    Une remarque sur le code, que je n'avais pas vu à la première lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *(pt++);         // incrémentation du pointeur pt
    Ici, l'indirection est inutile, vu qu'on ne récupère pas le résultat de cette indirection. Un code complètement équivalent serait :
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  7. #7
    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 519
    Points
    41 519
    Par défaut
    Quand au main(), il est resté lui-même...
    Si ton prof recommande ça, c'est qu'il vit dans le passé.

    Au minimum, il faut int main(void)
    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.

  8. #8
    En attente de confirmation mail Avatar de wareq
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 257
    Points : 94
    Points
    94
    Par défaut
    D'accord merci beaucoup je comprend mes erreurs maintenant c'est clair. lol oui il vit completement dans le passé ! Eh oui etrange !

  9. #9
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par wareq
    D'accord merci beaucoup je comprend mes erreurs maintenant c'est clair. lol oui il vit completement dans le passé ! Eh oui etrange !
    Le problème n'est pas tant qu'il vive dans le passé, mais le fait qu'il vous enseigne des choses fausses, ou tout du moins incorrectes.

    Ce n'est pas parce qu'un compilateur passe sans erreur dans un code que celui-ci est correct. Surtout si aucune option de compilation n'est indiquée.

    La norme du lanage C décrit que le code de retour de main est int. C'est comme ça, et c'est pas parce qu'un bouquin ou un prof dit le contraire que ça va changer.
    Il est donc plus que vivement conseillé d'écrire un code conforme à la norme, surtout si tu veux poursuivre dans cette voie.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

Discussions similaires

  1. [Débutant] Problème dans mon code ! (+ une question)
    Par thtghgh dans le forum MATLAB
    Réponses: 7
    Dernier message: 03/05/2009, 18h25
  2. Questions sur le code
    Par Pedro dans le forum Sepi
    Réponses: 5
    Dernier message: 23/12/2006, 13h10
  3. Petite question au sujet du code Hamming
    Par sylsau dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 28/02/2006, 12h30
  4. Question sur le code compactage de la FAQ
    Par Nicko29 dans le forum Access
    Réponses: 7
    Dernier message: 14/11/2005, 20h19

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