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 :

Ma fonction trier ne fonctionne pas


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Ma fonction trier ne fonctionne pas
    Bonjour,

    Je suis un cours d'un site toutefois je n'arrive pas à faire en sorte que ma fonction tri d'un tableau fonctionne.

    Voici le code :

    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
     
    int ordonnerTableau(int tableau[])
    {
        int i, valeur;
            for (i = 0 ; i < sizeof(tableau)/4 ; i++) /*Size of affiche le nb d'octet utilisé par le tableau, on divise par 4 car type int = 4 octets. */
            {
                    if ((tableau[i] > tableau[i + 1]) && (i <= ((sizeof(tableau))/4) )) /* Pour dire and, on utilise && */
                        {
                            valeur = tableau [i];
                            tableau[i] = tableau [i+1];
                            tableau[i + 1] = valeur;
                            i = 0;
                        }
        }
        return(0);
    }

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Tu n'es jamais sûr qu'un int soit codé sur 4 octet, tu dois donc utiliser sizeof(int) au lieu de mettre directement 4.

    Ensuite lorsqu'un tableau est passé en paramètre d'une fonction, on ne transmet en fait qu'un pointeur et il sera considéré tel quel dans la fonction.
    sizeof(tableau) te renvois donc la taille d'un pointeur.
    Il faut donc que tu transmette en même temps que ton tableau la taille de ce dernier.

    && (i <= ((sizeof(tableau))/4) ) ne sert à rien car cette condition sera toujours vraie.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Tu n'es jamais sûr qu'un int soit codé sur 4 octet, tu dois donc utiliser sizeof(int) au lieu de mettre directement 4.

    Ensuite lorsqu'un tableau est passé en paramètre d'une fonction, on ne transmet en fait qu'un pointeur et il sera considéré tel quel dans la fonction.
    sizeof(tableau) te renvois donc la taille d'un pointeur.
    J'en profite pour rappeler que « sizeof » n'est pas une fonction à part entière mais un mot-clé du langage C et qu'en particulier, il ne prend pas de parenthèse.

    On est obligé d'en mettre lorsque l'on veut connaître la taille d'un type, mais elles s'appliquent alors syntaxiquement au nom du type pour former la même expression que lors d'un transtypage. Lorsque l'on mesure la taille d'une instance quelconque, on donne simplement son nom et cela fait « sizeof tableau ».

    Si l'on voit systématiquement des parenthèses, c'est pour deux raisons : la première, c'est qu'un nom d'instance entre parenthèses est une expression syntaxiquement et algébriquement correcte. Elle est donc tout-à-fait légale et le C utilise le même analyseur pour la décortiquer qu'il le ferait en l'absence de sizeof. La seconde, c'est que sizeof est le seul mot-clé réservé qui se comporte comme un fonction dans le sens mathématique du terme : il s'agit d'une expression évaluable et donc la valeur dépend justement du paramètre.

    Pour autant, je pense qu'il reste bon de faire la distinction et de ne pas coller systématiquement de caractères inutiles… Pour en savoir plus : Cours et tutoriels pour apprendre C

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,
    +1 Obsidian ...
    On peut même faire une remarque similaire sur return qui est souvent «utilisé» comme une fonction (dans le code du PO par exemple) mais c'est moins courant.

    Je me permets aussi de rajouter que bien que valide, modifier la variable de boucle for dans le corps de la boucle peut rendre le code moins lisible et/ou donner un code plus difficilement débogable, du moins ce n'est pas une pratique que j'encouragerais (on peut toujours faire autrement pour faire la même chose).

  5. #5
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bonjour,

    Quasiment tout a été dit, je compléterais simplement kwariz en précisant que la sémantique de la boucle for indique la répétition d'un bloc d'instruction n fois. En modifiant l'indice de boucle dans le corps de celle-ci, on rompt toute relation avec la sémantique. Ce n'est donc pas une pratique à encourager ; et elle est particulièrement difficile à déchiffrer dans des systèmes pluritechniques, dans le sens où les autres langages ne disposent pas toujours d'un indice de boucle assimilable à une lvalue. Ce n'est pas pour rien que le pseudo-code du tri à bulles est souvent donné par deux boucles englobantes, et une variable booléenne pour synchroniser le tout (NB : en C, les sauts locaux peuvent simplifier le flot d'exécution).

    Bonne journée.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/09/2006, 17h46
  2. [Mail] fonction mail qui fonctionne pas
    Par digger dans le forum Langage
    Réponses: 3
    Dernier message: 31/08/2006, 22h28
  3. fonction ridicule qui fonctionne pas sous firefox
    Par Isses dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 27/06/2006, 12h08
  4. fonction plpgsql qui fonctionne pas...
    Par Empty_body dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 15/01/2006, 18h22
  5. La fonction CurrentDb() ne fonctionne pas dans une requête
    Par Sébastien Le Goyet dans le forum Access
    Réponses: 8
    Dernier message: 24/11/2005, 17h46

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