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 :

Renverser un tableau


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Renverser un tableau
    Bonjour,

    C'est la première fois que je post sur le forum, mais je le parcours depuis longtemps.

    Je vous explique mon problème :

    J'ai un tableau et j'aimerais avoir une fonction qu'y renverser les valeurs du tableau. Voici la 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
    int* renverser(int tab[], int nb_elements)
    {
        int buffer,
            i,a,z;
     
        for(i=0; i<nb_elements/2; i++)
        {
            buffer = tab[i];
            tab[i] = tab[nb_elements-i-1];
            tab[nb_elements-i-1] = buffer;
        }
     
        return tab;
    }
    Voici l'appel dans le main :

    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
    int main(void)
    {
        [...]
        int* renverser(int tab[], int nb_elements);
        [...]
        int tab_test[1] = {4}; // test avec le nombre 4
        int* tab_test_bin;
     
        tab_test_bin = malloc(3*sizeof(int)); 
        // converti 4 en binaire 0 0 1 et le rentre dans un tableau
        tab_test_bin = decimal_a_binaire(tab_test[1],3); 
        // renverse le tableau 0 0 1 => 1 0 0
        tab_test_bin = renverser(tab_test_bin, 3);
        [...]
    }
    Je fais un printf de mon tableau et il me sort des bonnes valeurs après decimal_a_binaire, mais après renverser, il me sort des nombres aléatoire :
    0 0 1 => renverser => 16852369 0 1

    Quelqu'un voit d'où vient le problème ?

    Arget

  2. #2
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    Salut et bienvenu,

    Ton problème doit être par là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tab_test_bin = malloc(3*sizeof(int)); 
    // converti 4 en binaire 0 0 1 et le rentre dans un tableau
    tab_test_bin = decimal_a_binaire(tab_test[1],3);
    Tu alloue un tableau de 3 int, et tu stocke son adresse dans tab_test_bin.
    À la ligne d'après tu écrases l'adresse de ton tableau stockée dans tab_test_bin pour la remplacer par la valeur de retour de decimal_a_binaire. Je ne sais pas ce que renvoie decimal_a_binaire. Surement un pointer sur int, mais es-ce un tableau de 3 ? En tout cas, au mieux ton pointer, pointe un tableau de 3 int et tu as un memory leak à cause de ton malloc. Au pire, decimal_a_binaire renvoie un pointer sur un élément unique et "renverser" renverse n'importe quoi.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Voici ma fonction decimal_a_binaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int* decimal_a_binaire(int decimal,int nb_bits)
    {
        int tab[nb_bits],
            i;
     
        for(i=0;i<nb_bits;i++)
        {
            tab[i] = decimal%2;
            decimal /= 2;
        }
     
        return tab;
    }
    J'ai fait un printf pour vérifier mes valeurs de mon tableau tab_test_bin, j'obtiens les bonnes valeurs, mais par contre, dans la fonction renverser, j'ai dès le début, tab[0] = 186953 (enfin une valeur aléatoire)

    Quand je passes mon tableau en parametre de renverser, il ne me passe pas les bonnes valeurs.

    Tu as moyen d'être plus précis sur comment faire ? car j'ai pas compris pourquoi ca ne passait pas la bonne adresse de tableau.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Ta variable int tab[nb_bits] dans ta fonction decimal_a_binaire() est une variable locale, et donc temporaire. Le temps d'exécution de ta fonction, elle est créée en mémoire, puis détruite à la fin de celle-ci, libérant ainsi la mémoire occupée ce qui permet de la réutiliser à n'importe quelle autre fin (d'où tes valeurs "aléatoires").

    Comme te l'a indiqué djuju, tu as effectivement une fuite de mémoire (ou memory leak en anglais) car tu alloues un espace mémoire avec malloc(), mais ne t'en sers pas. Au contraire, tu viens pointer sur l'adresse du tableau précédemment cité. Tu pers donc l'adresse initiale allouée sur laquelle tu aurais du effectuer un free() pour éviter la fuite.

    Passe ton pointeur en paramètre de ta fonction decimal_a_binaire().

    Remarques :
    • tu n'as pas besoin de retourner de pointeur dans ta fonction renverser(), le tableau que tu passes est modifié lui-même ;
    • tu as la possibilité de parcourir ton tableau à l'envers, te permettant de te passer de ta fonction renverser().

  5. #5
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    En passant, int tab[nb_bits] est une allocation dynamique dans la stack. Le code que tu as posté ne doit pas compilé.
    Tu n'as pas plutôt une taille constante dans le code que tu testes ?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    k, merci pour votre aide, ça marche.

  7. #7
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Citation Envoyé par djuju Voir le message
    En passant, int tab[nb_bits] est une allocation dynamique dans la stack. Le code que tu as posté ne doit pas compilé.
    Tu n'as pas plutôt une taille constante dans le code que tu testes ?
    L'allocation dynamique en stack est disponible depuis C99.

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

  8. #8
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    Citation Envoyé par transgohan Voir le message
    L'allocation dynamique en stack est disponible depuis C99.
    Ça m'apprendra à développer sous Visual Studio

  9. #9
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Citation Envoyé par djuju Voir le message
    Ça m'apprendra à développer sous Visual Studio
    Je te rassure bon nombre de compilateurs ne vont pas plus loin que la C89.
    En entreprise je pense pas qu'il y ait beaucoup de code qui ai comme prérequis C99+...

    Ou à moins qu'ils utilisent le C89 de base mais permettent les normes plus récentes en précisant un argument...

    « Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur. »
    « Le watchdog aboie, les tests passent »

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

Discussions similaires

  1. [XL-2003] renverser un tableau
    Par zangaloni dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/08/2011, 12h14
  2. Renverser ordre elements d'un tableau
    Par hostyle dans le forum Débuter
    Réponses: 15
    Dernier message: 10/12/2009, 14h11
  3. [Tableaux] Renverser un tableau indicé
    Par ciel65 dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2006, 10h24
  4. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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