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 :

Décomposer un entier dans tableau


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut Décomposer un entier dans tableau
    Bonsoir,

    Je souhaite décomposer un entier dans un tableau. Par exemple j'envoie 3896 à une fonction et elle me retourne le tableau avec
    tableau[0]=6
    tableau[1]=9
    tableau[2]=8
    tableau[3]=3

    Le code ne compile pas. Il me dit qu'il y a une erreur à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau[i]=int(Valeur/(Puissance(10, Nombre_De_Decimale));
    Il me semble qu'on ne peut pas faire d'allocation dans une fonction ? Ce pourquoi j'ai une erreur.

    Donc ma question est, comment passer un paramètre un tableau dont on ne connait pas encore la taille si jamais l'erreur provient bien de là ?

    Merci d'avance.

    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
    #include<stdio.h>
    #include<stdlib.h>
    //#include "./../../bibliotheque.h"
     
    void Entier_Dans_Tableau( int Valeur, int *Tableau );
    int Puissance( int Digit, int Exposant );
     
    int main()
    {
     
         int Valeur=2386;
         int *tableau;
         Entier_Dans_Tableau( Valeur, tableau );
     
         int i;
         for ( i=0 ; i<4 ; i++ )
         {
             printf( "Tableau[%d] : %d", i, tableau[i] );
         }
     
    }
     
    int Puissance( int Digit, int Exposant )
    {
        int i=0;
        int Resultat=1;      
     
        if ( Exposant != 0 )
           {
                      while ( i != Exposant )
                            {
                              Resultat=Resultat*Digit;
                              i++;
                            }
           }
     
        if ( Exposant==0 )
           {
                         Resultat=1;
           }  
     
        return Resultat;
    }  
     
    void Entier_Dans_Tableau( int Valeur, int *Tableau )
    {
        int N=1;
        int A=0;
        int Nombre_De_Decimale=-1;
        while ( A>9 )
              {
                          A=Valeur/N;
                          N=10*N;
                          Nombre_De_Decimale++;
              }
     
     
        Tableau=malloc(Nombre_De_Decimale*sizeof(int));
        int i;
        for ( i=(Nombre_De_Decimale-1) ; i>=0 ; i-- )
            {
                  Tableau[i]=int(Valeur/(Puissance(10, Nombre_De_Decimale));    
                  Valeur=Valeur-Tableau[i]*Puissance(10, Nombre_De_Decimale); 
            }
    }
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  2. #2
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Ups non j'ai rien dit

    Tu peux faire plus simple sans utiliser de fonctions non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for ( i=(Nombre_De_Decimale-1) ; i>=0 ; i-- )
    {
    	Tableau[i] = Valeur % 10;    
    	Valeur /= 10;
    }
    Plus tu pédales moins fort, moins t'avances plus vite.

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Sinon il y a toujours la formule générale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbdigits = number!=0 ? floor(log10(abs(number)))+1 : 1;
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  4. #4
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 101
    Points
    101
    Par défaut
    La solution avec modulo est meilleure.

    Mais voici ta ligne corrigée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Tableau[i]=(int)(Valeur/(Puissance(10, Nombre_De_Decimale)));
    Il manquait une parenthèse en fin.

    Et le int est un cast, il doit lui aussi être entre ()

    Fred

    PS: le résultat est incohérent.

  5. #5
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    En effet ça compile, mais à l'execution ça plante. Plus qu'une erreur de calcul ou de syntaxe, quelque chose ne se fait pas ou ne peut être fait en mémoire.

    Peut-on réellement faire l'allocation mémoire d'un tableau passé en paramètre dans une fonction ?

    Merci.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 334
    Points
    2 334
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    En effet ça compile, mais à l'execution ça plante. Plus qu'une erreur de calcul ou de syntaxe, quelque chose ne se fait pas ou ne peut être fait en mémoire.

    Peut-on réellement faire l'allocation mémoire d'un tableau passé en paramètre dans une fonction ?

    Merci.
    J'ai du mal a comprendre ce que tu veux dire exactement.

    Si tu passe un poiteur vers un int, tu peux tout a fait allouer un tableau sur celui-ci dans une fonction.


    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
     
    void Allocation(int *(*test), int nb)
    {
        (*test) = malloc (nb * sizeof(int));
        /* Pas de verification, bouh pas bien ! */
        (*test)[0] = 2;
        (*test)[1] = 4;
        (*test)[2] = 5;
     
    }
     
     
     
    int main ()
    {
        int *test;
        Allocation(&test, 3);
     
        printf("%d \n", test[0]);
     
        return 0;
    }

  7. #7
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Ok merci, j'avais un doute qui n'est plus desormais. En tout cas le code compile et s'exécute mais crash instantanément. Donc si l'erreur ne provient pas de là c'est que j'ai un souci autre part. Cependant, je ne trouve pas d'où il provient.

    Auriez vous une idée ?

    Merci.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  8. #8
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 334
    Points
    2 334
    Par défaut
    Tu as peut etre mal vu.

    Si tu declare un pointeur

    Tu passe ledit pointeur a une fonction d'une certaine maniere :

    - Si tu change le contenue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void ChangerContenue (int *Test)
    {
        Test[0] = 1;
    }

    - si tu change le tableau en lui meme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void ChangerContenue (int *(*Test))
    {
        (*Test) = malloc (sizeof(int)*10);
    }

    Quand tu veux changer le tableau, tu dois modifier le pointeur, donc tu dois mettre un "niveau" d'etoile en plus. Sinon rien ne sera modifier.
    Dans ton code, tu as cette erreur.

  9. #9
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 334
    Points
    2 334
    Par défaut
    Finalement j'ai fait le code.

    J'ai simplifier deux trois chose mais le fond reste le meme. En tenant compte de la remarque de pouet_forever et de la mienne, il etait facile d'arriver au resultat escompté.


    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
     
    #include<stdio.h>
    #include<stdlib.h>
     
    void Entier_Dans_Tableau( int Valeur, int *(*Tableau) );
     
     
    int main()
    {
        int *tableau;
     
        Entier_Dans_Tableau(2386, &tableau);
     
    }
     
     
    void Entier_Dans_Tableau(int Valeur, int *(*Tableau) )
    {
        int N=1;
        int Nombre_De_Decimale=1;
     
     
        while (Valeur/N > 9)
        {
            N *= 10;
            Nombre_De_Decimale++;
        }
     
     
     
        (*Tableau) = malloc (Nombre_De_Decimale * sizeof(int));
        int i;
        for ( i=(Nombre_De_Decimale-1) ; i>=0 ; i-- )
        {
            (*Tableau)[i] = Valeur % 10;
            Valeur /= 10;
        }
     
        for (i=0 ; i<Nombre_De_Decimale  ; i++)
             printf("Tableau[%d] : %d\n", i, tableau[i]);
    }
    NB : La fonction Puissance a disparu, elle n'est plus utile.
    Si tu veux pouvoir changer la base pour convertir ton chiffer (c'est le role Digit, non ?) il suffit de faire :







    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
    #include<stdio.h>
    #include<stdlib.h>
    
    void Entier_Dans_Tableau( int Valeur, int *(*Tableau), int Digit);
    
    
    int main()
    {
        int *tableau;
    
        Entier_Dans_Tableau(255, &tableau, 2);
    
    }
    
    
    void Entier_Dans_Tableau(int Valeur, int *(*Tableau), int Digit )
    {
        int N=1;
        int Nombre_De_Decimale=1;
    
    
        while (Valeur/N > Digit-1)
        {
            N *= Digit;
            Nombre_De_Decimale++;
        }
    
    
    
        (*Tableau) = malloc (Nombre_De_Decimale * sizeof(int));
        int i;
        for ( i=(Nombre_De_Decimale-1) ; i>=0 ; i-- )
        {
            (*Tableau)[i] = Valeur % Digit;
            Valeur /= Digit;
        }
    
        for (i=0 ; i<Nombre_De_Decimale  ; i++)
             printf("Tableau[%d] : %d\n", i, tableau[i]);
    }

    Donne effectivement '11111111'.


    Petite remarque. Si tu veux faire l'affichage dans le main , tu dois savoir combien de case tu as. Le seul probleme, c'est que ton tableau ne se termine pas par un caractere predefinie comme les chaine de caractere avec '\0', et tu ne peux pas savoir la longueur dans le main. Il faut donc soit instaurer un systeme '\0', soit recuperer d'une maniere ou d'une autre la longueur de ton tableau, sinon tu ne sais pas quand t'arreter.

  10. #10
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Merci SofEvans pour ton implication et tes explications aussi claires que concises. Je crois avoir compris, jusqu'à une prochaine fois

    Dans le doute, j'aurais une dernière question, est ce que *(*tableau) est la même chose que **tableau ?

    Merci
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  11. #11
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 334
    Points
    2 334
    Par défaut
    Oui, c'est exactement la meme chose.
    Si j'ai mis les parenthese, c'est pour moi. Je vois comme ca que ce n'est pas juste un pointeur de pointeur.

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

Discussions similaires

  1. Décomposer un entier dans tableau
    Par ramzuus95 dans le forum C
    Réponses: 1
    Dernier message: 13/11/2014, 23h06
  2. Charger un fichier dans tableau d'entier
    Par nico0007 dans le forum Langage
    Réponses: 12
    Dernier message: 17/04/2008, 11h30
  3. Réponses: 3
    Dernier message: 13/04/2008, 02h03
  4. [TP] La position des entiers dans un tableau
    Par argon dans le forum Turbo Pascal
    Réponses: 22
    Dernier message: 21/12/2006, 11h42
  5. convertion entier dans tableau
    Par mmarcoboss dans le forum C
    Réponses: 2
    Dernier message: 24/11/2006, 11h59

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