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

  1. #1
    Candidat au Club
    Homme Profil pro
    etudiant
    Inscrit en
    Avril 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Comment appelé une procédure dont un tableau initialiser sans taille lui à été passer en paramètre ?
    Nom : testttt.PNG
Affichages : 7263
Taille : 25,7 Ko
    Bonjour a tous !!!
    J'ai déclarer un tableau de string que j'appelle "nom[ ]" sans préciser sa taille (en mettant le vide dans ses crochets) , puis je l'ai initialiser !!

    Maintenant j'ai récupérer sa taille à l'aide de sizeof(nom)/sizeof(string) !! et ça marche parfaitement .

    Maintenant l’orque je veux appeler ma procédure "tri_tableau" , je passe mon tableau "nom" en paramétre !! et lorsque je compile ça affiche un message d'erreur !!

    Comment appelé une procédure dont un tableau initialiser sans taille lui à été passer en paramètre ??? c'est ça ma principale question.

    Merci d'avance les programmeurs !!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Arrêtez avec ces tableaux à la C, on est en C++.
    Utilisez un std::vector.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Il y a plusieurs problèmes avec ton code :
    • Il faut lire la documentation, mais lorsque tu crées un tableau statique, il me semble que les éléments ne peuvent pas être modifiés (dans ton cas ce sont des pointeurs). Donc tes chaînes de caractères ne peuvent pas être déplacées.
    • Il faut passer ton tableau avec un double pointeur, sinon tu vas travailler sur une copie (passage par valeur/ recopie)
    • Détail : Même si un tableau est différent d'un pointeur, il faut mieux passer un paramètre pointeur qu'un paramètre [] Parce que 1) on ne travaille plus (sauf rare cas) avec un tableau C, mais avec un std::vector 2) ton tableau va être dégradé en pointeur
    • Détail : Ton calcul sizeof pour calculer la taille ne fonctionne pas tout le temps, si je ne dis pas de bêtises
    • Détail : using namespace std; <- même si c'est dans un fichier .cpp, il faut soit rien/ std::string soit using std::string; (<- un truc comme cela)
    • Détail : Ta procédure fait 2 choses un tri et des swap. En théorie, il faudrait sortir le swap, on le faire faire à son tableau

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Une solution raisonnablement propre serait:
    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
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <iostream>
    //la référence non constante permet de modifier l'argument passé en parametre
    void tri(std::vector<std::string> & chaines) {
        // std::string fourni un opérateur de comparaison ( string < string)
        // std::sort (dans <algorithm>) permet le tri de n'importe quelle séquence selon un ordre arbitraire, ou l'opérateur < si on ne précise rien.
        // je ne vais donc pas le coder moi-même.
        std::sort(chaines.begin(), chaines.end());
    }
     
    int main() {
        std::vector<std::string> noms = {"lala", "lololo", "pipipi"};
        const auto nombre = noms.size(); // vector fournit size(), directement
     
        tri(noms); // comme noms est passé en référence modifiante (non constante), il est effectivement trié.
     
        // j'ajoute toujours une ligne de préfixe avant d'afficher une liste, pour savoir ce qui est affiché
        std::cout << "Les " << nombres << " noms sont:" << std::endl;
        for (auto const& nom : noms) {
            std::cout << nom << std::endl;
        }
        return 0;
    }
    Et encore, idéalement, je ne ferai même pas la fonction tri, ou j'en ferai une template:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename C>
    inline void sort_collection(C & values) { sort(values.begin(), values.end()); }
    Ce point-ci est pour ta future culture. Tu peux zapper complètement, ou demander des explications.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Citation Envoyé par foetus Voir le message
    Il y a plusieurs problèmes avec ton code :
    1. Il faut lire la documentation, mais lorsque tu crées un tableau statique, il me semble que les éléments ne peuvent pas être modifiés (dans ton cas ce sont des pointeurs). Donc tes chaînes de caractères ne peuvent pas être déplacées.
    2. Il faut passer ton tableau avec un double pointeur, sinon tu vas travailler sur une copie (passage par valeur/ recopie)
    3. Détail : Même si un tableau est différent d'un pointeur, il faut mieux passer un paramètre pointeur qu'un paramètre [] Parce que 1) on ne travaille plus (sauf rare cas) avec un tableau C, mais avec un std::vector 2) ton tableau va être dégradé en pointeur
    4. Détail : Ton calcul sizeof pour calculer la taille ne fonctionne pas tout le temps, si je ne dis pas de bêtises
    5. Détail : using namespace std; <- même si c'est dans un fichier .cpp, il faut soit rien/ std::string soit using std::string; (<- un truc comme cela)
    6. Détail : Ta procédure fait 2 choses un tri et des swap. En théorie, il faudrait sortir le swap, on le faire faire à son tableau
    Point 1:
    Le problème n'est pas avec les tableaux statiques, mais avec les chaines de caractères statiques. Il se pose avec char*, car un literal de chaine de caractère tel que "lala" n'est pas modifiable, même si son adresse peut-être mise dans un char* (et encore, ca dépend).
    Il ne se pose pas pour des std::string.

    Tenter de modifier un litéral de chaine est un comportement indéfini. Le compilateur est autorisé de les stocker dans une zone en lecture seule, ou de combiner plusieurs chaines partageant un même suffixe (comme "la" et "lala").
    En C, un tel litéral est du type char[], en C++03, c'était possible même si c'est un char const[].
    C'est impossible sans effort explicite en C++11.


    Point 2: Je conseille vivement de préférer une réference plutot qu'un pointeur.
    De toute façon, un double pointeur n'est pas requis car ce qui est passé est l'adresse du premier élément, copier cette adresse est sans impact.
    Le double pointeur n'est potentiellement nécessaire que si on souhaite réallouer le tableau, et personnellement, je préfèrerai une référence sur un simple pointeur.

    Point 4:"Détail : Ton calcul sizeof pour calculer la taille ne fonctionne pas tout le temps, si je ne dis pas de bêtises:"
    Cela fonctionne si le tableau vraiment un tableau, pas un paramêtre (parce qu'un tableau en paramètre de fonction est remplacé par un pointeur).

    Point 5:
    "Détail : using namespace std; <- même si c'est dans un fichier .cpp, il faut soit rien/ std::string soit using std::string; (<- un truc comme cela)"
    Explication concrète:
    les namespace servent à éviter les collisions de noms entre des choses distinctes (comme std::vector, une collection et vector d'une bibliothèque de mathématique, par exemple).
    L'instruction using namespace injecte les noms dans l'espace englobant l'instruction using et le namespace utilisé. En général, c'est l'espace global, ce qui annule l'effet du namespace.
    • soit tu préfixes
    • soit tu utilises un using chose;. Un tel using a l'avantage de pouvoir être utilisé dans un bloc ou une fonction (et donc de ne pas polluer le reste du code).

    En général, la recommandation est de ne jamais utiliser de using depuis l'espace std (ni l'espace entier, ni un sous-ensemble).
    Comme tout "jamais" a des exceptions, ici, c'est sauf si l'effet est très limité (dans un petit bloc) ou améliore énormément la lisibilité.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Bonjour,

    Tu dois passer un pointeur car comme dis plus haut, le passage en paramètre d'un tableau statique C est converti en pointeur sur le premier element.

    Tu ne dois pas utiliser std::vector mais std::array dans ton cas : http://fr.cppreference.com/w/cpp/container/array
    Homer J. Simpson


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

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/04/2007, 18h30
  2. [VB.NET]Comment appelé une procédure click d'un bouton?
    Par mustang-f27 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 25/11/2006, 13h01
  3. Réponses: 1
    Dernier message: 07/02/2006, 00h11
  4. Comment appeler une procédure ?
    Par darkmalak01 dans le forum Débuter
    Réponses: 2
    Dernier message: 03/10/2005, 19h05
  5. comment appeler une procédure événementielle
    Par OutOfRange dans le forum Débuter
    Réponses: 8
    Dernier message: 03/06/2005, 19h32

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