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 :

variables globales/locales et pointeurs.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Par défaut variables globales/locales et pointeurs.
    Bonjour,

    je me permets de venir vous embêter un peu parce que là, je comprend plus rien, j'ai la tête qui chauffe !

    J'ai écrit un programme qui demande un nombre entier et qui nous dit si oui ou non l'entier en question est un nombre de Kaprekar !

    Je l'ai écrit avec plusieurs variable globales, il fonctionnait mais j'aimerais maintenant supprimer toutes pour n'avoir que des variables locales.

    Et je GALERE !

    J'ai une fonction qui doit me retourner 2 valeurs rangées dans un tableau mais comme ce tableau n'est pas déclaré en variable globales, je dois retourner l'adresse du tableau pour ensuite utiliser les valeurs du tableau. (enfin c'est comme ça que je le vois)

    Et LA, je me mélange les pattes ! J'ai essayé toutes les combinaisons possible avec * & ..... etc

    Mais impossible de comprendre.

    Oh Grand Merci, Mr. le Debugger est là. Mouahahahahah mais NON.
    j'arrive même plus à rentrer dans ma fonction parce que ...... pourquoi d'ailleurs ...? ? ?

    Je vous laisse observer le massacre : (à force de le modifier il y surement des trucs complètement aberrant voir débile !)

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    // #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
     
    int longueur(int x);
    int decompose(int M, int a);
    int kaprekar(int n1, int nbch, int *adr);
     
    int main(int kap, int nbch)
    {
        int nb=0, tab[2]={0,0}, *p=NULL;
     
        printf("Nb de Kaprekar");
     
        printf("\nEntrez un nombre entier:");
        scanf("%d",&nb);
     
        p=&tab[0];
     
        kaprekar(nb, nbch, p);
     
    //    printf("\nVotre nombre au carre vaut : %d\n",kapcar);
    //    printf("\nVotre nombre au carre est compose de %d chiffre(s)\n",a);
    //    printf("\nLa partie de gauche M2=%d et la partie de droite M1=%d\n",M2, M1);
     
        if(kap==nb)
                   printf("\nVotre nombre est un nombre de Kaprekar\n");
        else
                   printf("\nVotre nombre n'est pas un nombre de Kaprekar\n");
     
     
    system("PAUSE");
    return 0;
    }
     
     
    int longueur(int x)
    {
     int nbch=0;
     
     while(x!=0)
     {
                x = x/10;
                nbch=nbch+1;
     }
     
     return nbch;
    }
     
     
    int decompose(int M, int place)
    { 
        int a=0, M2=0, M1=0, tab[2];
     
        a=pow(10,place);
        tab[0]=M2=M/a;
        tab[1]=M1=M%a;
     
        return *tab;
    }
     
     
    int kaprekar(int n1, int nbch, int *adr)
    {
       int kapcar=0, n=0, kap=0, *tab;
     
       kapcar=n1*n1;
     
       longueur(kapcar);
     
       if(nbch%2==0)
        n=nbch/2;
       else
        n=(nbch/2)+1;
     
       decompose(kapcar, n);
     
       tab=&tab[0];
       kap=tab[0];
       tab=&tab[1];
       kap=kap+tab[1];
     
       return kap;
    }

    MERCI ! Cordialement, Cédric

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fiofiotte Voir le message
    Bonjour,

    je me permets de venir vous embêter un peu parce que là, je comprend plus rien, j'ai la tête qui chauffe !

    J'ai écrit un programme qui demande un nombre entier et qui nous dit si oui ou non l'entier en question est un nombre de Kaprekar !

    Je l'ai écrit avec plusieurs variable globales, il fonctionnait mais j'aimerais maintenant supprimer toutes pour n'avoir que des variables locales.

    Et je GALERE !

    J'ai une fonction qui doit me retourner 2 valeurs rangées dans un tableau mais comme ce tableau n'est pas déclaré en variable globales, je dois retourner l'adresse du tableau pour ensuite utiliser les valeurs du tableau. (enfin c'est comme ça que je le vois)

    Et LA, je me mélange les pattes ! J'ai essayé toutes les combinaisons possible avec * & ..... etc

    Mais impossible de comprendre.
    Salut

    Bon, je vais pas regarder ton code car déjà sans balises CODE il est assez illisible et, d'après ce que tu dis, le problème ne vient pas du code en lui-même mais de ta propre compréhension des tableaux et pointeurs

    Tout d'abord, tu as tout à fait raison. Une fonction ne peut renvoyer qu'une seule valeur. Et si donc t'as besoin que ta fonction agisse sur plusieurs éléments, ben t'es obligé de passer à ta fonction les éléments où agir.
    Et c'est là que ça se corse. Car une fonction ne recevant qu'une copie des choses qu'on lui envoie, si on lui envoie la simple variable, elle ne pourra pas la modifier car elle n'aura que la copie de la variable.

    Donc on passe à la fonction l'adresse de la variable à modifier. Ayant cette adresse recopiée dans sa propre variable locale, la fonction peut utiliser l'adresse pour aller taper au bon emplacement mémoire et modifier la valeur qui s'y trouve.
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
        int i=5;
     
        printf("i avant modif=%d\n", i);
        modif(&i);
        printf("i après modif=%d\n", i);
    }

    Maintenant, on a passé "&i" à la fonction. Mais dans quoi la fonction va-t-elle pouvoir stocker cette valeur ?

    Pour répondre sans se tromper, il faut simplement observer ce que va devoir faire la fonction.
    La fonction devra utiliser cette valeur comme valeur d'adresse. Elle devra donc "aller au bout de". Et le "aller au bout de" se traduit par "*".
    Donc si la fonction stocke cette adresse dans "pt" et qu'elle doit aller taper dans "*pt", alors il faut que le compilo sache ce qu'il y a à "*pt". Et à "*pt" il y a un int.
    Donc "*pt" est de type int et on peut écrire "int *pt"

    La fonction modif s'écrira donc ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void modif(int *pt)
    {
         *pt=125;    // On modifie la valeur qu'il y a à la case mémoire ayant pt pour valeur
    }

    Par ailleurs, on aurait pu aussi utiliser l'analogie suivante
    i est de type "int"
    les opérateurs "&" et "*" s'annulent l'un-l'autre donc i peut aussi se voir comme étant *(&i)
    Donc *(&i) est de type "int"
    Donc &i est de type "int *" (car si on enlève l'étoile d'un coté de la phrase, alors faut la remettre de l'autre coté... comme pour une oxydo-réduction)

    Maintenant, voyons pour une fonction devant modifier le contenu d'un tableau de 2 int. On passera donc à la fonction le tableau
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
        int tab[2]={5, 10};
        printf("tab avant modif: %d et %d\n", tab[0], tab[1]);
        modif (tab);
        printf("tab après modif: %d et %d\n", tab[0], tab[1]);
    }

    La fonction a reçu "tab". Mais c'est quoi "tab" en lui-même ? Ben le nom d'un tableau c'est aussi l'adresse de son premier élément => tab = &tab[0]
    Donc la fonction "modif" reçoit là encore l'adresse d'un int donc un "int *" et sa signature ne changera pas

    Maintenant, ayant l'adresse du premier élément, et étant donné que dans un tableau les éléments se suivent, ben la fonction pourra modifier à son choix le premier élément ou le second (elle pourra même aller taper dans le troisième qui est hors tableau mais ça, ça devient le problème du programmeur et non du compilateur). Et donc on aura le code suivant
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void modif(int *pt)
    {
        *pt=20;
        *(pt + 1)=25;
    }

    Et puisque tab = &tab[0], on a alors *tab = *(&tab[0]) = tab[0] et donc on peut aussi écrire le code suivant
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void modif(int *pt)
    {
        pt[0]=20;
        pt[1]=25;
    }

    En espérant que ce mini tuto t'aide à te dém.... brouiller pour ton problème.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Par défaut
    Ok. Je comprends déjà un peu mieux. Merci !

    Par contre, qu'est-ce que tu retournes alors ? (return &tab, *tab, tab[0] ....)

    Cordialement,
    Cédric

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Par défaut
    Bon, niveau pointeur je pense être pas mal là mais j'ai encore un soucis et j'arrive pas à trouver où .. .. .. Ça compile sans soucis mais le programme fonctionne pas !

    J'ai modifié pas mal de trucs et ajouté des commentaires.

    Si quelqu'un a 5min et une petite idée ce serai cool Merci.

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    // #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
     
     
    int longueur(int x); //donne le nombre de chiffre.
    int decompose(int M, int a, int *adr); //décompose en 2.
    int kaprekar(int n1, int nbch);
     
     
    int main(int kap, int nbch)
    {
        int nb=0;
        printf("Nb de Kaprekar");
     
        printf("\nEntrez un nombre entier:");
        scanf("%d",&nb);
     
        kaprekar(nb, nbch);
     
        if(kap==nb)
                   printf("\nVotre nombre est un nombre de Kaprekar\n");
        else
                   printf("\nVotre nombre n'est pas un nombre de Kaprekar\n");
     
        system("PAUSE");
        return 0;
    }
     
     
    int longueur(int x) //effectue une division par 10 et ajoute 1 à une variable tant que la division ne retourne pas 0.
    {
        int nbch=0;
     
        while(x!=0) 
        {
                   x = x/10; 
                   nbch=nbch+1;
        }
     
        return nbch;
    }
     
     
    int decompose(int M, int place, int *adr)
    { 
        int a=0, M2=0, M1=0;
     
        a=pow(10,place); //élève 10 à la puissance n pour la découpe au bon endroit de M.
     
        adr[0]=M2=M/a; //range le nombre de gauche de M dans tab[0].
        adr[1]=M1=M%a; //range le nombre de droite de M dans tab[1].
     
        return *adr;
    }
     
     
    int kaprekar(int n1, int nbch)
    {
        int kapcar=0, n=0, kap=0, tab[2];
     
        kapcar=n1*n1; //élève nb au carré.
     
        longueur(kapcar); //donne le nombre de chiffre de nb.
     
        //donne la position n pour la découpe de nb^2.
        if(nbch%2==0) //si le nombre de chiffre de nb est impair.
                   n=nbch/2;
        else //si le nombre de chiffre de nb est pair.
                   n=(nbch/2)+1;
     
        decompose(kapcar, n, tab); //décompose nb^2 en deux entiers, à la position n.
     
        kap=tab[0]+tab[1];
     
        return kap;
    }
    Merci.

  5. #5
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Citation Envoyé par fiofiotte Voir le message
    Ok. Je comprends déjà un peu mieux. Merci !

    Par contre, qu'est-ce que tu retournes alors ? (return &tab, *tab, tab[0] ....)
    Si tu parles de retourner un tableau, il n'est pas autorisé en C de retourner un tableau automatique mais tu peus retourner un espace alloué dynamiquement.

    Pour ton dernier code, dans la fonction decompose, il risque d'y avoir un conflit entre la variable locale int * adr et la variable globale int adr (déclarée en dessous des prototypes). Donc il faut changer le nom de l'une ou de l'autre.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fiofiotte Voir le message
    Ok. Je comprends déjà un peu mieux. Merci !

    Par contre, qu'est-ce que tu retournes alors ? (return &tab, *tab, tab[0] ....)

    Cordialement,
    Cédric
    Etant donné que, dans mes exemples, je montrais le cas où ta fonction
    1) se charge elle-même de modifier les éléments qu'elle reçoit
    2) n'a rien à renvoyer
    Alors elle ne retourne rien => d'où le type "void".

    Maintenant, si ta fonction doit renvoyer quelque chose, alors c'est à toi de le définir. Ainsi:
    - si elle retourne tab, qui est de type "int *", alors la fonction est de type "int *"
    - si elle retourne *tab, qui est de type "int", alors la fonction est de type "int"
    - si elle retourne tab[0], qui est comme *tab de type "int", alors la fonction est de type "int"

    Bien entendu, retourner une valeur ne se justifie que si la valeur retournée est utilisée dans l'appelant...

    Citation Envoyé par fiofiotte Voir le message
    Bon, niveau pointeur je pense être pas mal là mais j'ai encore un soucis et j'arrive pas à trouver où .. .. .. Ça compile sans soucis mais le programme fonctionne pas !

    J'ai modifié pas mal de trucs et ajouté des commentaires.

    Si quelqu'un a 5min et une petite idée ce serai cool Merci.

    Code c : 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 <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
     
     
    int longueur(int x); //donne le nombre de chiffre.
    int decompose(int M, int a, int *adr); //décompose en 2.
    int kaprekar(int n1, int nbch);
     
     
    int main(int kap, int nbch)
    {
        int nb=0;
        printf("Nb de Kaprekar");
     
        printf("\nEntrez un nombre entier:");
        scanf("%d",&nb);
     
        kaprekar(nb, nbch);
     
        if(kap==nb)
                   printf("\nVotre nombre est un nombre de Kaprekar\n");
        else
                   printf("\nVotre nombre n'est pas un nombre de Kaprekar\n");
     
        system("PAUSE");
        return 0;
    }
    T'appelles kaprepar() mais tu ne stockes nulle part ce que la fonction renvoie...


    Citation Envoyé par fiofiotte Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int decompose(int M, int place, int *adr)
    { 
        int a=0, M2=0, M1=0;
     
        a=pow(10,place); //élève 10 à la puissance n pour la découpe au bon endroit de M.
     
        adr[0]=M2=M/a; //range le nombre de gauche de M dans tab[0].
        adr[1]=M1=M%a; //range le nombre de droite de M dans tab[1].
     
        return *adr;
    }
    Ok mais "return *adr" ne sert à rien puisque le tableau, envoyé depuis l'appelant, est rempli par la fonction...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Par défaut
    YOUHOU !!!!

    J'ai ENFIN réussi !
    Vous n'imaginez même pas à quel point je suis heureux. Je n'en dormais plus la nuit !

    Quoiqu'il en soit, un GRAND MERCI à ceux qui ont partagé cette discussion avec moi !

    Je vous met le code quand même pour ceux que ça pourrait intéresser !

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    // #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
     
     
    int kaprekar(int n1, char det);
    int longueur(int x, int nbch, char det); //donne le nombre de chiffre.
    int decompose(int M, int a, int *tab, char det); //décompose en 2.
     
     
    int main(int kap)
    {
        char rep='R', det;
        int nb;
     
        printf("Nombre de Kaprekar :\n");
        printf("\nUn nombre de Kaprekar est un nombre qui, lorsqu'il est eleve au carre,\npeut etre separe en une partie gauche(M2) et une partie droite(M1) (non nulles)\ntelles que le nombre de chiffre de M1 doit etre egal a celui de M2 ou +1,\nensuite leur somme donne le nombre initial.\n");
     
        while(rep!='Q')
        {
         printf("\nEntrez un nombre entier :");
         scanf("%d",&nb);
     
         printf("\nTapez D pour afficher le resultat avec les details\nou appuyez sur une touche pour continuer... :");
         fgetc(stdin)!=EOF; //efface la mémoire tampon
         scanf("%c",&det);
     
         kap=kaprekar(nb, det);
     
         if(kap==nb)
                   printf("\nVotre nombre est un nombre de Kaprekar.\n");
         else
                   printf("\nVotre nombre n'est pas un nombre de Kaprekar.\n");
     
         printf("\nTapez Q pour quitter ou appuyer sur une touche pour recommencer... :");
     
         if(det=='D') //permet d'eviter d'avoir a appuyer 2fois sur "entrer" lorsque vous n'avez pas voulu afficher les details du calcul.
         {
                   fgetc(stdin)!=EOF;
                   scanf("%c",&rep);    
         }     
         else
                   scanf("%c",&rep);
     
         system("cls"); //efface l'écran.
        }    
        return 0;
    }
     
     
    int kaprekar(int n1, char det)
    {
        int kapcar=0, n=0, kap=0, tab[2], nbch=0;
     
        kapcar=n1*n1; //élève nb au carré.
     
        if(det=='D')
                   printf("\nVotre nombre au carre vaut %d.\n", kapcar);
     
        nbch=longueur(kapcar, nbch, det); //donne le nombre de chiffre de nb.
     
        //donne la position n pour la découpe de nb^2.
        if(nbch%2==0) //si le nombre de chiffre de nb est impair.
                   n=nbch/2;
        else //si le nombre de chiffre de nb est pair.
                   n=(nbch/2)+1;
     
        *tab=decompose(kapcar, n, tab, det); //décompose nb^2 en deux entiers, à la position n. Pour *tab voir fonction decompose.
     
        kap=tab[0]+tab[1];
        if(det=='D')
                   printf("\nOn additionne les deux parties :\n%d + %d = %d.\n",tab[0], tab[1], kap);
     
        return kap;
    } 
     
     
    int longueur(int x, int nbch, char det) //effectue une division par 10 et ajoute 1 à une variable tant que la division ne retourne pas 0.
    {   
        while(x!=0) 
        {
                   x = x/10; 
                   nbch=nbch+1;
        }
        if(det=='D')
                   printf("\nCelui-ci est compose de %d chiffre.\n", nbch);
     
        return nbch;
    }
     
     
    int decompose(int M, int place, int *tab, char det)
    { 
        int a=0;
     
        a=pow(10,place); //élève 10 à la puissance n pour la découpe au bon endroit de M.
     
        tab[0]=M/a; //range le nombre de gauche de M dans tab[0].
        tab[1]=M%a; //range le nombre de droite de M dans tab[1].
        if(det=='D')
                   printf("\nUne fois decompose convenablement:\nsa partie de gauche vaut %d\nsa partie de droite vaut %d.\n", tab[0], tab[1]);
     
        return *tab; //je sais que ceci n'est pas nécessaire et que ça fonctionne sans mais je comprends pas bien pourquoi alors je le laisse, ça me parait plus logique.
    }

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fiofiotte Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         kap=kaprekar(nb, det);
         if(kap==nb)
                   printf("\nVotre nombre est un nombre de Kaprekar.\n");
         else
                   printf("\nVotre nombre n'est pas un nombre de Kaprekar.\n");
    Apparemment, la variable "kap" ne sert qu'une seule fois. on peut donc s'en passer
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (kaprekar(nb, det) == nb)
                   printf("\nVotre nombre est un nombre de Kaprekar.\n");
         else
                   printf("\nVotre nombre n'est pas un nombre de Kaprekar.\n");

    Citation Envoyé par fiofiotte Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        //donne la position n pour la découpe de nb^2.
        if(nbch%2==0) //si le nombre de chiffre de nb est impair.
                   n=nbch/2;
        else //si le nombre de chiffre de nb est pair.
                   n=(nbch/2)+1;
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    n=nbch/2
        if (nbch%2)
           n+=1

    ou bien

    Citation Envoyé par fiofiotte Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        *tab=decompose(kapcar, n, tab, det); //décompose nb^2 en deux entiers, à la position n. Pour *tab voir fonction decompose.
    Ouch, la fonction decompose modifie tab[0] et tab[1] puis tab[0] récupère ce qui est renvoyé. Déjà tu fais en fait tab[0]=tab[0] ce qui est totalement inutile et dangereux car tu perds donc tab[0] tel que la fonction l'a écrit !!!
    Appelle simplement decompose sans te poser de question.

    Accessoirement, écrire "*tab=valeur" est maladroit surtout que juste en dessous tu utilises tab[0]. Ce n'est pas parce que tab[0] équivaut à *tab qu'il faut écrire forcément "*tab" pour faire genre. Parce que là, ça fait genre "je suis totalement mal à l'aise et je le montre à tout le monde..."
    Si tu es dans les tableaux, tu peux sans soucis utiliser tab[]. Ensuite, si tu veux optimiser un balayage, une recherche ou autre, alors tu peux te permettre de définir un pointeur qui pointe sur tab et que tu incrémentes ensuite. Là ce sera efficace. Sinon, tu ne fais qu'alourdir la lecture sans gain réel.


    Citation Envoyé par fiofiotte Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return *tab; //je sais que ceci n'est pas nécessaire et que ça fonctionne sans mais je comprends pas bien pourquoi alors je le laisse, ça me parait plus logique.
    Ce n'est pas nécessaire de renvoyer tab[0] puisque tab[0] a déjà été rempli avec ce qu'il faut. Donc là, tu renvoies tab[0], qui a déjà été affecté, et tu le reéaffectes à tab[0] dans ton main. Bref 1) tu as dédoublé ton instruction 2) tu génères un mécanisme de recopie de résultat (le return) inutile et 3) tu augmentes les risques de te planter...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Variable globale locale erreur ?
    Par Fl0r3nt dans le forum C
    Réponses: 9
    Dernier message: 26/04/2012, 13h51
  2. Variables Global/Local Serveur/Navigateur
    Par rednight dans le forum WebDev
    Réponses: 1
    Dernier message: 20/11/2009, 16h02
  3. Problème de variables globales / locales
    Par onigami dans le forum Général Java
    Réponses: 9
    Dernier message: 06/03/2008, 14h01
  4. variables globales ou locales
    Par exhortae dans le forum C
    Réponses: 6
    Dernier message: 09/04/2007, 01h29
  5. variable globale ou locale pour CurrentDB
    Par jibouze dans le forum VBA Access
    Réponses: 7
    Dernier message: 30/05/2006, 17h15

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