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 :

programme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 9
    Par défaut programme
    le programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void f(int **i)
    {
    (*(*++i)--)++;
    }
     
    void main(void)
    {
    int i[]={0,2,4,6}, *p[2]={i,i+2}
    int j;
    f(p);
    for(j=0; j<4 ; j++)
    printf("%d \n", *(i+j));
    printf("\n  %d %d \n", **p,**(p+1));
    }
    ce prog affiche 0 2 5 6
    0 2
    je ne vois pas les étapes qu'a effectué (*(*++i)--)++ pour que la valeur entre 5 puisse etre modifiée

  2. #2
    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 Re: programme
    Citation Envoyé par SalutMesProfs
    le programme suivant :
    ... ne compile pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Compiling: main.c
    main.c:2: warning: no previous prototype for 'f'
    main.c:7: error: conflicting types for 'main_'
    D:/clib/frmwrk/inc/main.h:35: error: previous declaration of 'main_' was here
    main.c:7: error: conflicting types for 'main_'
    D:/clib/frmwrk/inc/main.h:35: error: previous declaration of 'main_' was here
    main.c: In function `main_':
    main.c:9: error: syntax error before "int"
    main.c:11: error: `j' undeclared (first use in this function)
    main.c:11: error: (Each undeclared identifier is reported only once
    main.c:11: error: for each function it appears in.)
    Process terminated with status 1 (0 minutes, 0 seconds)
    8 errors, 1 warnings
    Ceci compile ...
    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
     
    #include <stdio.h>
     
    static void f(int **i)
    {
       (*(*++i)--)++;
    }
     
    int main(void)
    {
       int i[] = {
                    0, 2, 4, 6
                 };
     
       int*p[2] = {
                     i, i + 2
                  };
       int j;
     
       f(p);
     
       for (j = 0; j < 4 ; j++)
       {
          printf("%d \n", *(i + j));
       }
       printf("\n %d %d \n", **p, **(p + 1));
     
       return 0;
    }
    ... et produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    0
    2
    5
    6
     
     0 2
    ... mais l'expression dans f() n'est pas claire. Tu peux commenter, justifier ?

  3. #3
    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 : 38
    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
    Par défaut
    Salut!

    Faut faire gaffe aux priorités des opérateurs ++,--,*!

  4. #4
    Membre confirmé Avatar de Kenji
    Inscrit en
    Janvier 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Janvier 2005
    Messages : 129
    Par défaut
    La première chose qu'on m'a apprise en C c'est de commenter ses programmes

  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 : 38
    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
    Par défaut
    L'opérateur * semble avoir la priorité sur ++:
    inverser les deux ne change rien.

    donne le meme résultat que:
    a savoir 0 2 4 6 0 2
    sans rien modifier!

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par seriousme
    donne le meme résultat que:
    Attention, la 2ème solution ne compile pas:

    test.c: In function 'f':
    test.c:4: error: invalid lvalue in decrement
    Jc

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 9
    Par défaut
    justement ce n'est pas moi qui a programmé cela, mais dans un tuorial qui traite les pointeurs, la question était de bien voir ce que font les pointeurs quand ils sont en conflit avec les ++ et les --, je voulais visualiser exactement les # étapes que la fonction F traverse genre :
    1- *i
    2 ++*i
    ...
    quand je suis la logique des priorités des opérations j'ai 4, quand je le compile j'ai 5!!
    je ne vois pa pkoi?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 9
    Par défaut
    la Deuxieme question qu'on me pose est celle de determiner la difference entre : int *toto(char);
    et int *(toto)(char);
    en ce qui concerne les CAST

  9. #9
    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
    Je ne crois pas qu'il y ait une différence entre ces deux-là.
    Par contre, ceci est différent: Cette construction déclare toto en tant que pointeur vers une fonction prenant un char en paramètre et retournant un int.
    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. #10
    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 SalutMesProfs
    justement ce n'est pas moi qui a programmé cela, mais dans un tuorial qui traite les pointeurs, la question était de bien voir ce que font les pointeurs quand ils sont en conflit avec les ++ et les --, je voulais visualiser exactement les # étapes que la fonction F traverse genre :
    1- *i
    2 ++*i
    ...
    quand je suis la logique des priorités des opérations j'ai 4, quand je le compile j'ai 5!!
    je ne vois pa pkoi?
    Je vais te donner mon point de de vue de professionnel.

    Certes, ce code est peut être légal (encore que j'aimerais avoir l'avis d'un gourou, car ca sent le comportement indéfini pour manque de point de séquence), mais il est interdit dans l'industrie, justement parce qu'il est illisible pour la plupart des programmeurs lambdas qui, comme moi, et malgré mes 15 ans d'expérience, sont loin d'être des gourous du C.

    Alors soit le but de ce tutoriel est de former des gourous du C, OK, rien à dire.

    Soit c'est un tutoriel pour programmeur lambda, et dans ce cas, ce genre d'exercice est inutile, surtout si il n'est pas précédé du cours nécessaire pour le comprendre.

    En tout cas, en C industriel, la regle est simple. On ne met pas plus d'un opérateur unaire par expression.

    Dans l'industrie, on cherche avant tout la simplicité et la fiabilité. Certainement pas à se la péter avec des expression illisibles. Ça peut même être considéré comme une faute grave (motif de licenciement).

  11. #11
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je vais te donner mon point de de vue de professionnel.

    Certes, ce code est peut être légal (encore que j'aimerais avoir l'avis d'un gourou, car ca sent le comportement indéfini pour manque de point de séquence), mais il est interdit dans l'industrie, justement parce qu'il est illisible pour la plupart des programmeurs lambdas qui, comme moi, et malgré mes 15 ans d'expérience, sont loin d'être des gourous du C.

    Alors soit le but de ce tutoriel est de former des gourous du C, OK, rien à dire.

    Soit c'est un tutoriel pour programmeur lambda, et dans ce cas, ce genre d'exercice est inutile, surtout si il n'est pas précédé du cours nécessaire pour le comprendre.

    En tout cas, en C industriel, la regle est simple. On ne met pas plus d'un opérateur unaire par expression.

    Dans l'industrie, on cherche avant tout la simplicité et la fiabilité. Certainement pas à se la péter avec des expression illisibles. Ça peut même être considéré comme une faute grave (motif de licenciement).
    Amen.

  12. #12
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Ce codeest équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ++j;
    int* _tmp = *j;
    (*j)--;
    (*_tmp)++;
    C'est du comportement parfaitement défini pour autant que les pointeurs pointent sur des objets valides (il n'y a pas deux objets de même type modifié, donc on ne peut pas validement modifier deux fois le même objet) mais c'est pas pour autant que ce soit du bon style.

    n'est pas valide en C. En C++ c'est du comportement indéfini ou non suivant le type de i (et c'est indéfini pour i qui est de type int** parce que la même valeur est modifiée deux fois entre deux points de séquencement).

  13. #13
    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 Jean-Marc.Bourguet
    Ce codeest équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ++j;
    int* _tmp = *j;
    (*j)--;
    (*_tmp)++;
    <...>
    Bon ben voilà, on a eu l'avis d'un gourou ! Tu as vu tout mon art pour l'invoquer discrètement !

  14. #14
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut


    desolé j'ai pas pu m'empecher ^^

  15. #15
    Membre éclairé
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Par défaut
    c toi le gourou ne te dénigre pas.

  16. #16
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Tout celà ne dit pas pourquoi on obtient 5 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       int i[] = {
                    0, 2, 4, 6
                 };
     
       int*p[2] = {
                     i, i + 2
                  };
    Analysons (*(*++i)--)++; sachant que i est l'adresse du tableau p:

    *++i ==> on incrémente d'abord i, donc on obtient l'adresse de p[1] et renvoie sa valeur; *++i a pour valeur i + 2, donc l'adresse du troisième élément du tableau i. Pour plus de simplicité j'appelle k : *++i.

    *(*++i)-- ==> *k-- : renvoie la valeur pointée par k puis on décrémente k; la valeur pointée par k est i[2]


    (*(*++i)--)++ ==> on incrémente donc cette valeur pointée par k c'est-à-dire i[2] qui passe de 4 à 5.


    En espérant ne pas m' être trompé dans les explications.
    Et puis avec le résultat connu, c'est plus facile.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  17. #17
    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 ciol2.6.12
    c toi le gourou ne te dénigre pas.
    Certainement pas. Je connais très bien mes limites.

  18. #18
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par ciol2.6.12
    c toi le gourou ne te dénigre pas.
    Certainement pas. Je connais très bien mes limites.
    Et elle sont où ces limites ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  19. #19
    Membre Expert

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Jean-Marc.Bourguet
    Ce codeest équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ++j;
    int* _tmp = *j;
    (*j)--;
    (*_tmp)++;
    <...>
    Bon ben voilà, on a eu l'avis d'un gourou ! Tu as vu tout mon art pour l'invoquer discrètement !

    Dis Emmanuel tu sais on a un dico sur développez, tu voudrais pas nous faire la définition du terme "gourou"

  20. #20
    Membre Expert

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par ciol2.6.12
    c toi le gourou ne te dénigre pas.
    Certainement pas. Je connais très bien mes limites.
    Aaahhhh ?
    Parce que y'en a?
    Ou
    :
    PS: on peut toujours apprendre non? Et ce n'est pas parce que l'on ne fait pas partie du comité de normalisation que l'on est pas un gourou...Tu crois pas Emmanuel?

Discussions similaires

  1. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  2. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  3. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  4. Comment débuter en programmation ?
    Par Marc Lussac dans le forum Débuter
    Réponses: 0
    Dernier message: 08/04/2002, 11h29
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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