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 :

Exercice en C


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 12
    Par défaut Exercice en C
    bonsoir

    j'ai un exercice dans les pointeurs manipulé par le langage C
    et je suis debutante en programmation

    je veux me dire si cette solution est juste ou non

    1- Au démarrage du programme principal on a demandé à l'utilisateur combien de case il veut utiliser .

    2- Faite en suite l'allocation de la zone mémoire sachant que la taille désirée est : N*taille d'un entier . à vous de trouvez comment.

    3-L'espace est alloué , faire les fonction suivantes:

    * void trier( int Nb_case, int *ptr)
    qui permet d'ordonner en croissant les valeurs qui se trouvent dans le'éspace reservé par le programme principal

    *void afficher( int Nb_case, int *ptr)
    qui permet d'afficher les valeurs stockées dans l'éspace réservé.

    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<alloc.h>
     
    void Trier(int Nb_case, int *ptr)
    {
    int i=0,j,V;
    while(i<Nb_case)
      {
    	 for(j=i+1;j<=Nb_case;j++)
    		if(*(ptr+i) > *(ptr+j))
    			{
    			 V= *(ptr+j);
    			 *(ptr+j)= *(ptr+i);
    			 *(ptr+i)=V;
    			 }
     
    	  i=i+1;
      }
    }
     
    void Afficher(int Nb_case, int *ptr)
    {
      int i=0;
     
      for(i=0;i<Nb_case;i++)
     
    	 printf("%d\n",*(ptr+i));
     
     
    }
     
    void main()
    {
    int *p; int nb;
     
    //l'introdution le nbr de cases à allouer
     
      scanf("%d",&nb);
     
    while (nb<=0)
      scanf("%d",&nb);
     
    // L'allocation de la zone memoire
     
    p=(int *) malloc(nb);
    Trier(nb,p);
    Afficher(nb,p);
    free(p);
     
    }
    Merci d'avance

  2. #2
    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
    Pour le main() : C'est pas mal, mais:
    1. La fonction main() retourne un int. Toujours.
    2. Tu peux utiliser un do-while à la place du while, ce qui t'évitera de dupliquer le scanf().
    3. On ne caste pas le retour de malloc() en C.
    4. Tu oublies de tester le retour de malloc(). Il faut toujours vérifier que malloc() n'a pas retourné NULL.


    Pour ta fonction de tri, tu peux utiliser ptr[i] et ptr[j] au lieu de *(ptr+i) et *(ptr+j). Ce sera à la fois plus court et plus compréhensible.
    Même remarque pour ta fonction d'affchage.

    À part ces remarques sur la forme, le fond (hormis le test de malloc()) m'a l'air correct...
    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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Par défaut
    Bon alors tout d'abord une maladresse qu'il nous faut tout de suite corriger


    au lieu d'écrire *(ptr+j)
    ecrit plutot ptr[j]

    c'est équivalent mais c'est plus rapide , moins de risque d'erreur et quand on lit ton code on sait que l'on à affaire à un tableau et non juste à des pointeurs

    deuxièment la libraire alloc.h n'est pas nécessaire ici , les fonctions de stdlib et stdio suffisent

    pour le moment ton programme fait un depassement de memoire , bon vu quec'est un exercice , je te donne juste un indice

    l'erreur se trouve à l'endroit de l'allocation , le malloc (nbr ) alloue juste un espace de nbr byte or tu veux un espace de nbr * taille d'un int , une petite recherche sur l'allocation dynamique de tableau t'apportera la réponse

    sinon c'est étrange comme exercice car personnellement sous linux et gcc le tableau à du mal à être trié vu que tout les emplacement sont initialisé à 0 ^^

    par contre je n'ai pas encore regardé si ta fonction de tri etait correcte


    edit : desolé j'ai mis trop de temps à écrire ma réponse moi^^

    ps: vu qu'elle incremente le i à la fin du while , une boucle for est plus approprié

  4. #4
    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
    Ah, je n'avais pas vu le coup de l'oubli de multiplication dans le malloc().
    Par contre, alloc.h n'est pas une "librairie" (On dit "bibliothèque", cad "library" en Anglais), c'est un fichier d'en-tête. Et en effet, c'est un fichier d'en-tête non-standard qui n'a rien à faire ici.

    Et je n'avais pas pigé non plus que le tableau n'était pas rempli. C'est marrant, on repère vite ce qui est en trop, mais beaucoup plus difficilement ce qui manque...
    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.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    [*]La fonction main() retourne un int. Toujours.[*]On ne caste pas le retour de malloc() en C.
    fonction() en C ne signifie pas "ne prend pas d'argument"
    Donc c'est : int main(void)
    D'ailleur je crois que seul
    int main(void) et int main(int argc, char** argv) sont autorisés en c99

    Ensuite le cast du retour de malloc n'est pas inutil il permet de mieux voir ce qu'on manipule, et de generer des warnings dès la compilation en cas de mauvaise utilisation.Après chacun ses habitudes, mais il n'y a pas de mal à le faire ou alors quels sont les arguments contre?

    edit:

  6. #6
    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
    Citation Envoyé par totaliou Voir le message
    Ensuite le cast du retour de malloc n'est pas inutil il permet de mieux voir ce qu'on manipule, et de generer des warnings dès la compilation en cas de mauvaise utilisation.
    Perdu, il permet de CACHER des warnings si l'on oublie d'inclure <stdlib.h>. Des warnings qu'il vaut mieux ne pas cacher sur certaines plate-formes, notamment Win64 et toute plate-forme basée sur un 68k, où un int n'est pas retourné de la même manière qu'un pointeur.
    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.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Perdu, il permet de CACHER des warnings si l'on oublie d'inclure <stdlib.h>. Des warnings qu'il vaut mieux ne pas cacher sur certaines plate-formes, notamment Win64 et toute plate-forme basée sur un 68k, où un int n'est pas retourné de la même manière qu'un pointeur.
    Malloc n'est pas définie dans le header stdlib.h? son oublie devrait creer une erreur avant même de s'inquieter du type? Enfin je connais pas les plates-formes dont tu parles...

    Sinon je crois que ca va depasser l'allocation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(j=i+1;j<=Nb_case;j++)
           if(*(ptr+i) > *(ptr+j))

  8. #8
    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
    Justement non, en C, on aura juste un warning "implicit declaration" (si on a pensé à l'activer) et un warning "making pointer from integer without à cast".
    C'est ce second warning qui sautera si on a connement mis un cast qui ne sert à rien...
    Mais dans tous les cas, ça compilera quand même à moins qu'on n'ait mis un paramètre du genre -Werror...

    Ce cast est officiellement déclaré inutile par les auteurs du C depuis l'errata du K&R2.
    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.

  9. #9
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par totaliou
    Donc c'est : int main(void)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main()
    /* pareil que */
    int main(void)
    /* non ? sinon c'est quoi la difference mon compilateur ne me dit rien ! */
    Je pense que dans la fonction Trier il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     while(i<Nb_case-1) /* et non pas  while(i<Nb_case) */
    <...>
     for(j=i+1;j<Nb_case;j++) /*et non pas  for(j=i+1;j<=Nb_case;j++) */
    Aussi je ne vois pas l'interet de trier un tableaux non initialiser

  10. #10
    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
    Non, ce n'est pas pareil.
    Pour le main() ça ne change pas grand-chose, mais les parenthèses vides servent à dire "paramètres non-spécifiés" en C (c'est illégal en C++).

    Par exemple, ceci est légal en C:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void UneFonctionDansUnAutreFichierSource();
     
    void UneFonction(void)
    {
    	UneFonctionDansUnAutreFichierSource(42, 1);
    }
    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.

  11. #11
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Ahh .... c'est intéressant ,comment est-ce que l'on récupere les parametres à l'intérieur de "UneFonctionDansUnAutreFichierSource" dans votre exemple "42" et "1" .

    Merci !

  12. #12
    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
    Eh bien, la définition de la fonction peut avoir ENCORE un autre prototype. Si ça se trouve elle prend trois paramètres en fait...
    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.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    [CODE]int main()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     while(i<Nb_case-1) /* et non pas  while(i<Nb_case) */
    Pourquoi 'i < Nb_case -1'?

    Sinon aucune valeurs ne sont initialisées et c'est toujours mieux de le faire (notament les pointeurs). De même pour les valeurs du tableaux(tout mettre à 0 par exemple). Ca fait apparaitre plus rapidement des bugs, et donc des bugs plus rapidement reglés.

    ps:
    Après quelque recherches le cast du malloc en C est effectivement deprecated,
    au temps pour moi.

  14. #14
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par totaliou

    Citation:
    Envoyé par ssmario2 Voir le message
    [code]int main()
    Code :


    while(i<Nb_case-1) /* et non pas while(i<Nb_case) */


    Pourquoi 'i < Nb_case -1'?
    selon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    while(i<Nb_case)
      {
    	 for(j=i+1;j<=Nb_case;j++)
    		if(*(ptr+i) > *(ptr+j))
    			{
    			 V= *(ptr+j);
    			 *(ptr+j)= *(ptr+i);
    			 *(ptr+i)=V;
    			 }
     
    	  i=i+1;
      }
    }
    si i=Nb_case-1 et comme j=i+1 alors j sera égale à Nb_case hors ptr[Nb_case] ménera à un dépassement mémoire ......non

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Non.
    car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for (j = i + 1; j < nb_case; j++)  /* si j >= nb_case à son initialisation on ne rentre pas dans la boucle*/



    hors-sujet: Une exemple d'utilisation de fonctions sans parametres definie(on ne sait pas à l'avance si on va utiliser write (3 parametres) ou putc (2).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
    #include <unistd.h>
    typedef int             (*f_func)();
    int main(void)
    {
      f_func func;
      func = (f_func) &write;  
      func(STDOUT_FILENO, "Test\n", 5);
      func = (f_func) &putc;
      func('a', stdout);
      func('\n', stdout);
      return 0;
    }

  16. #16
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Tout à fait d'accord !

    ( cela dit avec le while(i<Nb_case-1) on aurais une itération de moins )

  17. #17
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 12
    Par défaut
    Bonjour,

    merci de vos réponses ....

    Pour le main() : C'est pas mal, mais:
    La fonction main() retourne un int. Toujours.
    vous voulez dire que possible si je fais la fonction main() comme suit :


    int main()
    { ......}


    Tu peux utiliser un do-while à la place du while, ce qui t'évitera de dupliquer le scanf().
    Ah , Ok

    On ne caste pas le retour de malloc() en C.
    je n'ai compris pas

    Tu oublies de tester le retour de malloc(). Il faut toujours vérifier que malloc() n'a pas retourné NULL.
    mais , comment je le fais ?

    Pour ta fonction de tri, tu peux utiliser ptr[i] et ptr[j] au lieu de *(ptr+i) et *(ptr+j). Ce sera à la fois plus court et plus compréhensible.
    Même remarque pour ta fonction d'affchage.
    Ah , comme un tableau
    À part ces remarques sur la forme, le fond (hormis le test de malloc()) m'a l'air correct...
    merci beaucoup pour votre aide et avis

    --------------------------------------

    pour le moment ton programme fait un depassement de memoire , bon vu quec'est un exercice , je te donne juste un indice
    mais pourquoi ? je fais la fonction free pour libérer l'éspace mémoire pointé par le pointeur

    l'erreur se trouve à l'endroit de l'allocation , le malloc (nbr ) alloue juste un espace de nbr byte or tu veux un espace de nbr * taille d'un int , une petite recherche sur l'allocation dynamique de tableau t'apportera la réponse
    Ah, je ferai comme suit : p=(int *) malloc(nb*sizeof(int));

    par contre je n'ai pas encore regardé si ta fonction de tri etait correcte


    edit : desolé j'ai mis trop de temps à écrire ma réponse moi^^
    Merci beaucoup pour votre aide

    Finalement , je crois que la solution devient :
    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
     
    #include<stdio.h>
    #include<stdlib.h>
     
     
    void Trier(int Nb_case, int *ptr)
    {
    int i=0,j,V;
    while(i<Nb_case)
      {
    	 for(j=i+1;j<=Nb_case;j++)
    		if(ptr[i] > ptr[j])
    			{
    			 V= ptr[j];
    			 ptr[j]= ptr[i];
    	                        ptr[i]=V;
    			 }
     
    	  i=i+1;
      }
    }
     
    void Afficher(int Nb_case, int *ptr)
    {
      int i=0;
     
      for(i=0;i<Nb_case;i++)
     
    	 printf("%d\n",ptr[i]);
     
     
    }
     
    void main()
    {
    int *p=NULL; int nb;
     
    //l'introdution le nbr de cases à allouer
     
      do
        scanf("%d",&nb);
      while (nb<=0);
     
     
    // L'allocation de la zone memoire
     
     p=(int *) malloc(nb*sizeof(int));
     
    Trier(nb,p);
     
    Afficher(nb,p);
     
    free(p);
     
    }

  18. #18
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Citation Envoyé par Myran Voir le message

    Citation:
    On ne caste pas le retour de malloc() en C.
    je n'ai compris pas
    .....
    Ah, je ferai comme suit : p=(int *) malloc(nb*sizeof(int));
    p = malloc(nb * sizeof *p);
    (le sizeof *p est une "coquetterie" classique)
    Le cast est un opérateur - ici (int *) - qui force à une conversion de type. malloc() retourne un void*. Qui sera converti ou promu automatiquement en int*. Il est d'usage en C de ne pas caster inutilement. Le cast exprime au compilateur que même si c'est une connerie le programmeur sait ce qu'il fait. En ne castant pas inutilement, on garde intactes ses chances d'être averti d'une étourderie. Un cast justifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        unsigned val = (unsigned) malloc(nb * sizeof (int));
    /* ou plutôt :*/
        int* p = malloc(nb * sizeof *p);
        unsigned val = (unsigned) p;
    Là, je veux (et je l'écris) mettre la valeur du pointeur retourné dans un unsigned, après avoir vérifié que ce dernier pouvait le contenir, ce qui dépend de la plateforme ciblée.
    Personnellement, pour moi, ce cast vaut commentaire, mais ce n'est pas nécessairement une bonne pratique.

    Notez que si votre compilateur vous jette si vous ne castez pas le retour du malloc(), c'est vraisemblement que vous compilez en C++.

  19. #19
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 12
    Par défaut
    Bonjour

    merci de votre reponse Pierre

    j'ai compris quelque peu

    je compile en C++

    et je crois que cette solution est juste parceque n'affiche pas messages erreurs et le programme est execute normal

  20. #20
    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 Myran Voir le message
    je compile en C++
    C'est une erreur. Si on écrit du C, on doit le compiler en C. C et C++ sont deux langages différents (la preuve) qui ont chacun leur document de définition et leur forum.

    Alors il faut faire un choix clair. En C++, on utilise le opérateurs new / delete, et c'est le forum d'à-coté

Discussions similaires

  1. [VB6] Exercice de Combinatoire
    Par fichtre! dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 19/01/2005, 14h27
  2. Un cours de C/C++ avec exercices corrigés
    Par merrheim dans le forum C++
    Réponses: 65
    Dernier message: 18/01/2005, 22h30
  3. Demande de corrections d'exercices Turbo Pascal
    Par Helpine dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 16/01/2005, 10h38
  4. Pages d'exercices à faire pour l'autoformation ?
    Par [thebadskull] dans le forum Evolutions du club
    Réponses: 13
    Dernier message: 15/06/2004, 20h26
  5. Pouvez vous m'aider a resoudres ces 3 exercices
    Par algorithmique dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 09/08/2002, 17h26

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