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 :

Peut on déclarer une structure dans un sous programme ?


Sujet :

C++

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 95
    Points : 52
    Points
    52
    Par défaut Peut on déclarer une structure dans un sous programme ?
    Bonjour,
    Tout est dans l'intitulé, je voudrais savoir si on peut on déclarer une structure dans un sous programme, car j'ai créé une structure pour gérer une image qui contient sa taille horizontale, sa taille verticale et un tableau contenant les
    intensités lumineuses de chacun des pixels.
    Le problème est qu'on me demande de faire un sous programme permettant de faire la symétrie verticale d'une image, le résultat doit être stocké dans une autre image et retourné au programme principal.
    Donc je dois déclarer une nouvelle structure, mais puis-je le faire dans ma fonction ?
    Voilà ce que j'ai fait, dites moi si c'est correct
    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
    #include <iostream>
    using namespace std;
    int const Max_X=1000;
    int const Max_Y=1000;
     
    struct image{
           int tailleX;
           int tailleY;
           int pixel[Max_X][Max_Y];
           };
     
    struct image2 symetrie(struct image im)
    {
        struct image2{
               int tailleX;
               int tailleY;
               int pixel[Max_X][Max_Y];
               };
     
        struct image2 im2;
        int i,j;
        j=0;
        while(j<Max_X){
                            for(i=0;i<Max_Y;i++){
                                                      im.pixel[i][j]=im2.pixel[Max_X-1-i][j];
                                                      }
                            }
        im2.tailleX=im.tailleX;
        im2.tailleY=im.tailleY;
        return im2;
    }
    Merci de bien vouloir me répondre

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Retire les struct dans l'entête de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image symetrie(image im)
    Ton type image2 ne sert à rien, utilise aussi image.

    Retire aussi le struct dans la déclaration des variables :
    Tu es supposé faire du C ou du C++ ?

    ps : sinon tu peux aussi compiler pour savoir si le code a une chance d'être correct...

    MAT.

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 95
    Points : 52
    Points
    52
    Par défaut
    Merci, pour ta réponse,
    j'ai compilé mais ça marche pas.
    Tu peux me dire, si j'ai le droit de déclarer la structure image2 dans la fonction ou pas ?

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par hazaki Voir le message
    j'ai compilé mais ça marche pas.
    Quel est le message d'erreur ?

    Citation Envoyé par hazaki Voir le message
    Tu peux me dire, si j'ai le droit de déclarer la structure image2 dans la fonction ou pas ?
    Ton type image2 ne sert à rien, utilise aussi image.

    MAT.

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 95
    Points : 52
    Points
    52
    Par défaut
    Alors il y a un message d'erreur :

    conversion from `symetrie(image)::image2' to non-scalar type `image2' requested

    Mais le problème c'est que je dois créer une nouvelle image pour stocker l'image symétrique, j'utilise quand même image ?

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 95
    Points : 52
    Points
    52
    Par défaut
    Après un peu de réflexion j'ai changé mon code, il n'y a plus de messages d'erreur, dis moi ce que tu en penses
    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 <iostream>
    using namespace std;
    int const Max_X=1000;
    int const Max_Y=1000;
     
    struct image{
           int tailleX;
           int tailleY;
           int pixel[Max_X][Max_Y];
           };
     
     
    struct image symetrie(struct image im)
    {
        int i,j,a;
        j=0;
        while(j<Max_X){
                            for(i=0;i<Max_Y;i++){
                                                      a=im.pixel[Max_X-1-i][j];
                                                      im.pixel[Max_X-1-i][j]=im.pixel[i][j];
                                                      im.pixel[i][j]=a;
                                                      }
                            }
        return im;
    }

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Oui c'est mieux déjà.

    Retire le struct dans la signature de la fonction et ça fera sans doute l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    image symetrie(image im)
    {
    ...
    }
    MAT.

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 95
    Points : 52
    Points
    52
    Par défaut
    Mais je comprends pas pourquoi tu enlèves le struct dans l'entête parce que dans mes cours, mes profs le mettaientt toujours

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par hazaki Voir le message
    Mais le problème c'est que je dois créer une nouvelle image pour stocker l'image symétrique, j'utilise quand même image ?
    J'ai l'impression que tu confonds classe et instance de classe. Tu veux pour retourner ton résultat une nouvelle instance de la classe image, mais pas une nouvelle classe.

    Pour ce qui est de la répétition de struct, je crois qu'en C, c'est nécessaire, selon certaines règles je je ne connais pas. Mais en tout cas, en C++, pas besoin.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 95
    Points : 52
    Points
    52
    Par défaut
    Oui, je viens de comprendre la différence, c'est pour ca que j'ai changé mon code.
    Ok merci pour la précision, je compile et ça marche donc merci pour l'aide

  11. #11
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    C'est en effet plutôt du C si on doit rajouter le "struct". En général, on définit un nouveau type genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct image{
           int tailleX;
           int tailleY;
           int pixel[Max_X][Max_Y];
           }image;
     
     
    image symetrie(image im) {

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Ceci dit, il est tout à fait légal, en C++, de définir une structure au sein d'une fonction.

    Cependant, la connaissance que le compilateur aura de cette structure sera limitée à la portée dans laquelle elle est définie.

    Cela signifie que tu peu parfaitement avoir un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void foo()
    {
        struct MyStruct
        {
            /* le contenu de MyStruct */
        };
        /* du code utilisant MyStruct */
    }
    Tu pourrais d'ailleurs parfaitement définir MyStruct dans différentes fonctions sans que cela ne pose de problème.

    MAIS tu ne peux, quoi qu'il en soit, utiliser MyStruct que dans le corps de la fonction dans laquelle la structure est définie (foo selon l'exemple), c'est à dire, ni comme type de retour, ni comme type d'argument, que ce soit pour foo ou pour une quelconque autre fonction.

    Ce genre de pratique est essentiellement utilisé pour créer des foncteurs dont l'utilité se limite à la fonction dans laquelle ils sont définis ou dont on souhaite restreindre l'usage à cette seule fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void bar(std::vector<UnType> /* const */ & tab)
    {
        struct functor
        {
            void operator()(UnType /* const */ & t)
            {
                /* un traitement particulier devant être exécuté sur chaque objet
                 * de type UnType se trouvant dans tab
                 */
            }
        };
        std::for_each(tab.begin(), tab.end(), functor());
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::for_each(tab.begin(), tab.end(), functor());
    Mais si je ne me trompe pas, avant la nouvelle norme, le code que tu présente était (absurdement ?) illégal.

  14. #14
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    Non tu confonds avec les lambda expression.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Non, je maintiens : une petite recherche sur google avec comme mot-clé "local class as template argument" donne divers résultat dont celui par exemple. Ou encore sur GotW, deuxième réponse. En c++98 ET c++03 une classe locale ne peut pas être utilisée avec des fonction template( et en gros elle ne peut être que très rarement utilisée comme argument d'une fonction, vu qu'on ne peut pas en créer la prenant explicitement comme argument dans un scope exterieur à la fonction)

  16. #16
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Effectivement, c'était illégal. Une classe locale ne peut servir de paramètre template.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  17. #17
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    autant pour moi mal compris la question visiblement

Discussions similaires

  1. [MEX] Utilisation d'une structure dans un sous-programe
    Par Michael007 dans le forum MATLAB
    Réponses: 1
    Dernier message: 22/07/2009, 10h31
  2. Peut-on déclarer une constante dans un ActionForm
    Par g_g_30 dans le forum Struts 1
    Réponses: 1
    Dernier message: 10/12/2007, 14h34
  3. Comment déclarer une DataSource dans server.xml
    Par guillaume06 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 16/06/2004, 14h27
  4. [ADRESSAGE][DEBUTANT]Accés à une machine dans un sous-réseau
    Par Milark dans le forum Développement
    Réponses: 4
    Dernier message: 26/03/2004, 09h45
  5. Peut on mettre une image dans une BD MySQL ?
    Par maddog2032 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 25/07/2003, 16h18

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