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 :

[c++] Programmation d'un logiciel d'images et gestion des fichiers


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Par défaut [c++] Programmation d'un logiciel d'images et gestion des fichiers
    Bonjour à tous,

    Je programme un logiciel de conversion d'images de deux formats différents et j'ai quelques soucis.

    Je programme via Visual C++. Je crée une dll pour un logiciel d'image.
    Le code ci dessous compile bien mais à l'exécution (dans le logiciel d'image), ça plante (le logiciel se ferme brutalement).

    J'ai pu constater (grâce aux traces) que cela se produits à la fin de la boucle while (autrement dit quand on a lu les octets souhaité - la fin du fichier n'étant pas atteinte).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //déclaration des variables
    	char octet;
    	bool run = true;
    	int numOctet = 0;
    	string  buff, image, header_dm2;
    	int dimension, offsetArrayOffset,dataType, width, height, pixelDepth, nbOctetImage;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    i = 1;
    while (i <= nbOctetImage) {    //nbOctet= 8 388 608
            f_in.read(&octet , 1);
            oct = octet;
            s_octet = getOctetLu(oct);
            image = image + s_octet;
            numOctet++;
            i++;
           //trace
           PlugIn::gResultOut << i << endl;
    }

    Le problème vient de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    f_in.read(&octet , 1);
    En effet pour tester quand j'execute le code ci dessous ca plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       f_in.read(&octet , 4000000);
    Je comprend vraiment pas ce bug







    J'ai aussi un deuxième problème.
    Un pixel d'image est représenté par deux octets X1X2X3X4 Y1Y2Y3Y4. Ce sont les valeur hexadécimal.

    Le problèmes c'est que dans ce format la valeur de l'octet en hexadécimal est:
    Y3Y4Y1Y2 X3X4X1X2 au lieu de X1X2X3X4 Y1Y2Y3Y4.
    Je dois donc octet par octet traiter manuellement cela avant de calculer la valeur en décimal de Y3Y4Y1Y2 X3X4X1X2.
    Le problème c'est qu'à l'execution cela va prendre beaucoup trop de temps.

    Est-ce que quelqu'un aurait une idée pour résoudre cela?
    J'ai aussi vaguement entendu parler de swap data sans comprendre vraiment ce que c'était. Est-ce que cela pourrait résoudre mon problème?


    Merci d'avance pour votre aide,
    funkyKong

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu as oublié d'indiquer le type de f_in, mais c'est tout-à-fait normal que ça plante: Tu as de la place pour un seul octets, et tu essaies d'y en mettre 4 000 000, donc forcément, ça déborde...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Par défaut
    Merci pour ta réponse Médonoc

    Voici la déclaration de f_in:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	//fichier en flux d'entrée.
    	ifstream f_in  (nomFichier,ios::binary | ios::in);

    Cependant je ne vois pas trop le problème

    quand je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     f_in.read(&octet , 10);
    ca marche parfaitement (on lit bien plus que 1 octet là)

    c'est bien dans cette boucle que ca plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while (i <= nbOctetImage) {    //nbOctet= 8 388 608
            f_in.read(&octet , 1);
            oct = octet;
            s_octet = getOctetLu(oct);
            image = image + s_octet;
            numOctet++;
            i++;
           //trace
           PlugIn::gResultOut << i << endl;
    }
    et là on lit bien un octet par un octet


    Donc je comprend pas trop

  4. #4
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu as oublié d'indiquer le type de f_in, mais c'est tout-à-fait normal que ça plante: Tu as de la place pour un seul octets, et tu essaies d'y en mettre 4 000 000, donc forcément, ça déborde...
    ben oui forcément, ca dépend ca dépasse!!!

  5. #5
    screetch
    Invité(e)
    Par défaut
    pour en revenir au sujet, le fait que ca ne plante pas ne veut pas dire que ca marche. ca veut juste dire que tu as du bol. et des fois on a du bol avec 10 octets, mais avec 4 miyons c'est plus du bol, il faut jouer au loto. si tu arrives a faire rentrer 4 miyons d'octets dans un seul je te felicite, tu as trouvé la methode de compression la plus efficace au monde.

    reserve de la place pour un octet.
    reserve de la place pour 1024 octets.

    a toi de savoir combien tu en veux (4 miyons ca ne tiendra pas dans une variable locale) mais 1 seul ce n'est pas assez d'espace.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Par défaut
    En fait je croyait qu'a chaque fois qu'il bouclait, il allait ecraser la valeur précédente.


    effectivement c'est logique. J'ai honte

    En tout cas Merci à tout les deux

    En fait il faut que j'en réserve 10 000 000 de places

    Sinon personne a une idée concernant mon deuxième problème (expliqué à mon premier post ci-dessus) ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu sais, tu peux utiliser la fonction membre ignore() si tu veux "sauter" des octets...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Recherche logiciel programmation analyse video/reconnaissance d'image
    Par MoneyCivius dans le forum Logiciels Libres & Open Source
    Réponses: 0
    Dernier message: 10/09/2014, 10h15
  2. [MySQL] Création de dossiers pour stocker des images et gestion des droits
    Par heretik25 dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 14/12/2011, 10h24
  3. Réponses: 1
    Dernier message: 07/04/2009, 00h18
  4. [MySQL] Programmation Objet PHP-Mysql - Comment formaliser la gestion des listes
    Par bacchus41 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/04/2009, 21h33
  5. Recherche d'un SGBG pour la gestion des fichiers images !
    Par PandaConstantin01 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 04/09/2006, 13h53

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