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 :

Programme qui ne se termine pas correctement


Sujet :

C

  1. #1
    Membre régulier Avatar de teka_22
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 75
    Points : 84
    Points
    84
    Par défaut Programme qui ne se termine pas correctement
    Bonjour,

    Je développe en ce moment un programme qui utilise la librairie Opencv. Mon programme fonctionne comme je le veux mais lorsqu'il a fini de s'exécuter, celui-ci continue de tourner (il ne propose pas d'appuyer sur une touche pour quitter la commande windows).

    J'ai pourtant placé un return 0; et j'ai vérifié aussi qu'il ne reste pas bloqué dans la seule while de mon programme (ce n'est pas le cas puisqu'il exécute les lignes de commande suivantes).

    Avez vous déjà rencontré ce problème? Je suis encore un peu débutant donc c'est peut être tout simple à résoudre.
    Sinon j'ai pensé qu'il existait peut être une commande pour forcer la fermeture du programme.

    Merci de votre aide

    voilà mon programme:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    # include <cv.h>
    # include <highgui.h>
    # include <stdio.h>
    # include <stdlib.h>
    # include <string.h>
     
     
    IplImage *relief(IplImage * img1, IplImage * img2);
    IplImage *capturation(void);
     
     
     
    //Déclaration et création de la fonction relief
    IplImage *relief(IplImage * img1, IplImage * img2)
    {
        int i=0;
        IplImage *result = cvCloneImage(img2);
     
        for(i=0; i<img1->imageSize; i++)
        {
            if(i%3==2.) {continue;}
            result->imageData[i] = img1->imageData[i];
        }
        //cvResizeWindow( result, 1000, 800 );
        return result;
    }
     
    //Déclaration de la fonction de prise d'image via une CAM
    IplImage *capturation(void)
    {
        IplImage* image =NULL;
        IplImage* image2=NULL;
     
        CvCapture *capture=cvCaptureFromCAM(-1);
        if (!capture) {printf("Camera error\n");}
        image = cvQueryFrame(capture);
        image2=cvCloneImage(image);
        image =NULL;
        cvReleaseCapture( &capture ); //Je pense que le prob vient de cette instruction
     
        return image2;
    }
     
    int main()
    {
        char key;
        IplImage *img1 =NULL;
        IplImage *img2 =NULL;
        IplImage *img3D =NULL;
     
     
        while(key!=27)
        {
            img1 = capturation();
            key= cvWaitKey(1);
            img2 = capturation();
            img3D = relief(img1, img2);
     
            if(!img3D) {printf("ERREUR\n"); exit(EXIT_FAILURE);}
     
            cvNamedWindow("Image en relief", CV_WINDOW_AUTOSIZE);
            cvShowImage("Image en relief", img3D);
     
            cvReleaseImage(&img1);
            cvReleaseImage(&img2);
            cvReleaseImage(&img3D);
     
        }
        cvDestroyAllWindows();
     
     
        return 0;
    }

  2. #2
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Un conseil assez simple est d'afficher des mot clé tout au long de ton programme pour savoir d'où viens le bogue:

    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
     
    int main()
    {
        IplImage *img1 =NULL;
        IplImage *img2 =NULL;
        IplImage *img3D =NULL;
     
        img1 = capturation();    //ici on utilise une while
        printf("palier 1\n");
        img2 = capturation();    //ici aussi (la même)
        printf("palier 2\n");
        img3D = relief(img1, img2);
     
        if(!img3D) {printf("ERREUR\n"); exit(EXIT_FAILURE);}
         printf("palier 3\n");
        cvNamedWindow("Image en relief", CV_WINDOW_AUTOSIZE);
        printf("palier 4\n");
        cvShowImage("Image en relief", img3D);
        printf("palier 5\n");
        cvWaitKey(0);
         printf("palier 6\n");
        cvReleaseImage(& img1);
        printf("palier 7\n");
        cvReleaseImage(& img2);
        printf("palier 8\n");
        cvReleaseImage(& img3D);
        printf("palier 9\n");
        cvDestroyAllWindows();
        printf("palier 10\n");
        return 0;
    }
    Peut être que le problème est simple mais en attendant un professionnel, tu peux déjà executer ce code afin de localiser d'où viens le problème!
    (Tu peux poster le résultat de l'exécution du programme)

  3. #3
    Membre régulier Avatar de teka_22
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 75
    Points : 84
    Points
    84
    Par défaut
    Oui j'avais déjà testé le printf mais justement, tout s'exécute, rien ne reste bloqué dans une while ou autre erreur possible de programmation.


    Cependant, je n'ai pas le "cliquez sur une touche pour fermer la console" après l'execution du programme.

  4. #4
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Citation Envoyé par teka_22 Voir le message
    Oui j'avais déjà testé le printf mais justement, tout s'exécute, rien ne reste bloqué dans une while ou autre erreur possible de programmation.


    Cependant, je n'ai pas le "cliquez sur une touche pour fermer la console" après l'execution du programme.
    Donc ton programme ne tourne pas à l'infini et ton résultat est normal!

    Si tu veux forcer l'arret de ta console remplace ton return par exit!

  5. #5
    Membre régulier Avatar de teka_22
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 75
    Points : 84
    Points
    84
    Par défaut
    Edit/ C'est bon j'ai trouvé ! un pointeur ne se vidais pas assez souvent donc ça faisait ramer le programme. Merci de ton aide ! /Edit


    Même exit ne marche pas.
    Quoi qu'il en soit j'ai trouvé (je pense) l'origine du problème.
    Je n'avais pas vidé le buffer du flux vidéo, donc ça mangeait petit à petit ma mémoire vive, jusqu'à planter.

    j'ai donc ajouté un cvReleaseCapture, et ça ne plante plus.

    MAIS (snif y'a toujours un problème ^^") avec ce cvReleaseCapture le programme est lent, mais lent comme pas possible, et là j'ai beau réfléchir je ne vois pas pourquoi. Donc je me demande si cette instruction est connue pour ralentir les programme.

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

Discussions similaires

  1. [Conception] requete qui ne s'effectue pas correctement
    Par eclipse012 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 29/01/2007, 12h06
  2. ORA-00933 la commande SQL ne se termine pas correctement
    Par habasque dans le forum Sql*Plus
    Réponses: 1
    Dernier message: 09/12/2006, 14h41
  3. Réponses: 1
    Dernier message: 21/11/2006, 16h53
  4. Un programme qui veut bosser; mais pas trop.
    Par Flodelarab dans le forum C++
    Réponses: 8
    Dernier message: 28/08/2006, 15h33
  5. Réponses: 8
    Dernier message: 08/05/2006, 20h40

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