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 :

Problème de passage par adresse.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 64
    Par défaut Problème de passage par adresse.
    Bonjour,

    Je souhaite "délocaliser" une partie de mon travail dans une fonction.
    Cependant je suppose que je me heurte à un problème d'adresse ...

    Voici mon 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
    17
     
    int main(void) {
            ........
     
            IplImage *source_hsv;
            IplImage *source_rgb;
     
            source_hsv = cvCloneImage(source);
            source_rgb = cvCreateImage(cvGetSize(source), source->depth, 1);
            result = cvCreateImage(cvGetSize(source_rgb), source_rgb->depth, 1);
     
            cvConvertImage(source, source_rgb, 0);
            cvCvtColor(source, source_hsv, CV_BGR2HSV);
     
            cvCanny(source_rgb, result, 20.0, 30.0, 3);
     
            ....
    Dans mon main le bout de code marche parfaitement (ici l'image s'affiche correctement).

    mais lorsque je mets tout ça dans une fonction de cette manière ci dessous
    l'image n'est plus correcte, comme si l'opération ne c'était pas bien déroulée ..

    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
     
     
    void Detection(IplImage *source, IplImage *result) {
     
            IplImage *source_hsv;
            IplImage *source_rgb;
     
            source_hsv = cvCloneImage(source);
            source_rgb = cvCreateImage(cvGetSize(source), source->depth, 1);
            result = cvCreateImage(cvGetSize(source_rgb), source_rgb->depth, 1);
     
            cvConvertImage(source, source_rgb, 0);
            cvCvtColor(source, source_hsv, CV_BGR2HSV);
     
            cvCanny(source_rgb, result, 20.0, 30.0, 3);
    }
     
    int main(void) {
     
           ....
     
           Detection(source, result);
     
           .....
     
           // ici result ne semble pas correcte !
     
           return 0;
    }
    Je suppose qu'il y a un problème lors du passage d'adresse, en effet
    une fois les adresses passées à la fonction Detection elles sont à nouveaux passées à d'autres fonctions et c'est surment là que ça cloche (?), l'adresse correcte n'est pas donnée ou autre (?).

    Qu'en pensez-vous ?

    merci,

    PS: J'utilise GCC,

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Tu crées deux pointeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IplImage *source_hsv;
    IplImage *source_rgb;
    qui sont capitaux pour tes fonctions de traitement d'image. Je suppose que ces pointeurs sont essentiels également pour la suite du programme.

    Dans le second code, le problème est que tu crées deux pointeurs locaux à la fonction "Detection"... qui sont perdus une fois la fonction terminée.
    Il faut déclarer ces deux pointeurs non pas dans la fonction "Detection", mais dans la fonction "main". Et lorsque tu appelles "Detection", il faut lui faire passer l'adresse de ces deux pointeurs afin qu'elle puisse modifier leur valeur "à distance".

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 64
    Par défaut
    Bonjour jeroman,

    Non en fait les deux pointeurs source_* ne sont pas nécessaires pour la suite du code. En réalité ma fonction Detection n'est pas totalement terminée (les pointeurs source_* seront utilisés plus tard dans la fonction).
    En fait je souhaite juste récupérer result, mais cela ne fonctionne pas.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void Detection(IplImage *source, IplImage *result) {
    ...
            result = cvCreateImage(cvGetSize(source_rgb), source_rgb->depth, 1);
    ...
     
            cvCanny(source_rgb, result, 20.0, 30.0, 3);
    }
    int main(void) {
           ....
           Detection(source, result);
           .....
           // ici result ne semble pas correcte ! 
           return 0;
    }
    Dans la fonction, le seul fait d'avoir un paramètre, ici result, modifié avant toute utilisation doit être suspect : La valeur passée par ce paramètre est ignorée donc ce paramètre est inutile
    Dans le main() : Detection(source, result). Quelle que soit la fonction Detection(), source et result ne peuvent être modifiés par la fonction.

    En conclusion, puisque la fonction doit modifier result (du main) , il faut passer son adresse ou utiliser la valeur de retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Detection(IplImage *source, IplImage **result) {
    ...
            *result = cvCreateImage(cvGetSize(source_rgb), source_rgb->depth, 1);
    ...
     
            cvCanny(source_rgb, *result, 20.0, 30.0, 3);
    }
    int main(void) {
           ....
           Detection(source, &result);
           ..... 
           return 0;
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    IplImage *Detection(IplImage *source) {
    ...
           IplImage * result = cvCreateImage(cvGetSize(source_rgb), source_rgb->depth, 1);
    ...
     
            cvCanny(source_rgb, result, 20.0, 30.0, 3);
           return result;
    }
    int main(void) {
           ....
           result = Detection(source);
           .....
           return 0;
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 64
    Par défaut
    Merci ça a reglé le problème!

Discussions similaires

  1. Problème de passage par adresse dans un sous-programme
    Par Maskeren dans le forum Débuter
    Réponses: 11
    Dernier message: 17/05/2015, 18h11
  2. passage par adresse
    Par gloubig dans le forum C++
    Réponses: 1
    Dernier message: 20/05/2006, 06h35
  3. Passage par valeur / passage par adresse
    Par jeje99 dans le forum C++
    Réponses: 13
    Dernier message: 16/02/2006, 10h29
  4. passage par adresse
    Par cari dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/02/2006, 11h33
  5. [Debutant(e)]passage par adresse?
    Par cap2fosse dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2004, 10h05

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