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 :

Lire et créer des fichiers BMP


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Lire et créer des fichiers BMP
    Salut à tous,

    voilà je travaille sur un projet de biométrie (reconnaissance de mouvement), avec mon binome, nous avons commencé à bosser sur matlab mais nous voulons à présent switcher sur C++ car nous devrons interfacer avec des librairies 3d c++. Les appelles c++ - matlab étant trop laborieux, nous avons décidé de traduire nos simples fonctions.

    Je n'a pas trouvé grand chose comme code pour réaliser l'imread et l'imwrite de matlab... Nous travaillons avec des images BMP, je pensais m'en sortir avec la classe <vector> de STD ...

    Je n'ai trouvé qu'un fichier nommé bmp_io.h bmp_io.C mais celui-ci me crée des misères.

    Voici les headers d'un de mes fichiers tests pour cette fonction bmp_io:

    # include <cstdlib>
    # include <iostream>
    # include <iomanip>
    # include <fstream>
    # include <ctime>

    using namespace std;

    # include "bmp_io.H"

    Lors de la compilation, j'obtiens plus d'une centaines d'erreurs de type:

    1>bmp_io.C
    1>c:\program files\microsoft visual studio 8\vc\include\cstdlib(18) : error C2143: syntax error : missing '{' before ':'

    qui ont rapport avec le fichier cstdlib.h qui emploie des

    using ::size_t;

    que je ne comprends pas...

    Si quelqu'un pense pouvoir m'aider, je lui en serai très reconnaissant,

    bien à vous,

    Tanguy

  2. #2
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Une petite remarque : tu code en C++ alors que tes fonctions de gestion des fichiers BMP sont en C.

    Donc il est impératif d'inclure les fichiers "*.h" du C avant les fichiers pour le C++. En plus pour des raisons d'encodage des symboles en C++, il te faut utiliser la directive "extern". Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    extern "C" {
    #  include "bmp_io.H"
    }
     
    #include <cstdlib>
    #include <iostream>
    #include <iomanip>
    #include <fstream>
    #include <ctime>
     
    using namespace std;
    Tu devrais avoir nettement moins d'erreurs maintenant

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Salut mchk0123,

    merci pour ta réponse mais j ai toujours les mêmes erreurs... j ai testé avec extern mais rien ne change. J ai alors retesté avec un fichier d extension C et spécifier en option de compiler en C et non en C++.

    et j obtiens toujours le même type d erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1>bmp_io.C
    1>c:\program files\microsoft visual studio 8\vc\include\cstdlib(18) : error C2143: syntax error : missing '{' before ':'
    + de 100x

    ainsi que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1>bmp_io_prb.C
    1>c:\program files\microsoft visual studio 8\vc\include\cstdlib(18) : error C2143: syntax error : missing '{' before ':'
    + de 100x


    ces erreurs renvoient à des lignes du type:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using ::size_t; using ::div_t; using ::ldiv_t;

    Si qq sait d'où ça vient, ou si qq détiens du code c++ pour la lecture et l'écriture de fichiers bmp, ce serait encore mieux

    Merci encore pour l'aide mchk0123,

    Tanguy

  4. #4
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    On va y arriver, tu vas voir.

    Premièrement, tes fichiers bmp_io.H et bmp_io.C sont des fichiers en lanagage C. Dans ces fichiers, le code utilise le type "size_t" qui est défini
    soit dans l'entête <stdlib.h> (pour le langage C), soit dans l'entête <cstdlib> (pour le langage C++).

    Or le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using ::size_t; using ::div_t; using ::ldiv_t;
    Est du code C++ et non pas C (l'utilisation de "::" n'existe pas en C).

    Donc deuxièmement, si tu as ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c:\program files\microsoft visual studio 8\vc\include\cstdlib(18) : error C2143: syntax error : missing '{' before ':'
    C'est que ton compilateur utilise la definition C++ de size_t alors qu'il compile du code C. D'où l'erreur !

    Donc il faut impérativement qu'au moment ou tu fasses :

    , le compilateur ait inclus juste avant le fichier <stdlib.h> et surtout pas de <cstlib> !

    Vérifie tous tes "#include" dans tous tes fichiers (*.h, *.c, *.cpp) et ayant à l'esprit que les #include de code C doivent toujours avoir lieu avant les #include de code C++.

    Mais j'y penses ..., essaye de compiler séparément tes fichiers bmp_io.c, ... dans une librairie statique (tu compile d'un côté tout ce qui est C, et d'un autre côté tout ce qui est C++). Puis ensuite tu rajoutes la librairie aux fichiers lors de l'édition de liens.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 593
    Points
    41 593
    Par défaut
    Tu es sous Visual, donc sous Windows, et Windows n'est pas sensible à la casse du nom d'un fichier.

    Par conséquent, l'extension ".C" n'indique pas un fichier C++ sous Windows, mais le langage C.
    Pour compiler en C++ sous Windows, il faut utiliser une extension qui diffère de ".c" par autre chose que la casse. Exemples : ".cc", ".cxx", ".cpp"...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses,

    comme expliqué, j'ai essayé de compiler simplement les fichiers bmp_io.c et bmp_io.h (j'utilise visual studio 8). J'ai ceci en entête de fichier .c:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # include "bmp_io.h"
    # include <stdlib>
    # include <iostream>
    # include <iomanip>
    # include <fstream>
     
    using namespace std;
    j'obtiens ce genre d'erreurs par rapport au fichier .h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    bmp_io.c
    1>c:\documents and settings\tanguy\my documents\visual studio 2005\projects\biometrics\vector\bmp\bmp_io.h(1) : error C2061: syntax error : identifier 'bmp_byte_swap_get'
    1>c:\documents and settings\tanguy\my documents\visual studio 2005\projects\biometrics\vector\bmp\bmp_io.h(1) : error C2059: syntax error : ';'
    1>c:\documents and settings\tanguy\my documents\visual studio 2005\projects\biometrics\vector\bmp\bmp_io.h(1) : error C2059: syntax error : 'type'
    1>c:\documents and settings\tanguy\my documents\visual studio 2005\projects\biometrics\vector\bmp\bmp_io.h(2) : error C2146: syntax error : missing ')' before identifier 'value'
    1>c:\documents and settings\tanguy\my documents\visual studio 2005\projects\biometrics\vector\bmp\bmp_io.h(2) : error C2061: syntax error : identifier 'value'
    1>c:\documents and settings\tanguy\my documents\visual studio 2005\projects\biometrics\vector\bmp\bmp_io.h(2) : error C2059: syntax error : ';' ...
    Y a qqch qui m'échappe ...

  7. #7
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Je ne penses pas que cela marchera.

    Ce n'est pas trés propre de vouloir compiler en C++ en fichier codé en C.
    Déjà qu'il à +100 erreur, cela ne va pas arranger les choses.
    Peut-être que cela corrigera son pb. de "using ::size_t" mais cela risque de lui générer plein de nouveaux autres messages d'erreur.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 593
    Points
    41 593
    Par défaut
    mchk0123 : Je pense que c'est pire, le P.O. tente de compiler en C un fichier codé en C++.

    Ketchup666 : Le code que tu nous montres, c'est du C++, pas du C.
    Renommes ton fichier en .cc, .cxx ou .cpp et compiles-le en C++, et là, ça devrait marcher à priori.

  9. #9
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Relie bien ce qu'à écrit ketchup666 et tu verra que son fichier de gestion BMP est du C et pas du C++.

    En revanche la définition de size_t qu'il utilise est celle définie dans cstdlib qui elle est codé en C++ d'ou les messages d'érreur (conflit avec stdlib.h) !

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 593
    Points
    41 593
    Par défaut
    On peut voir le début du fichier bmp_io.C ?

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    voici les 2 fichiers, le .c faisait 67ko d'où le zip ..

    tous les indices se trouvent désormais entre vos mains
    Fichiers attachés Fichiers attachés

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 593
    Points
    41 593
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool bmp_08_data_read ( ifstream &file_in, unsigned long int width, 
      long int height, unsigned char *rarray )
    C'est du C++, donc mon post est valide: Renomme ton fichier en .cc, .cxx ou .cpp pour le compiler en C++.

    De plus, <stdlib> n'est pas un header C++ valide : Essaie avec <cstdlib> à la place.

  13. #13
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Bon medinoc +1

    Ca fait trop longtemps que j'ai basculé sur le monde Windows. J'avais oublié cet artefact "*.C" vs. "*.c" !

Discussions similaires

  1. Créer des fichiers mdl
    Par Michaël dans le forum Développement 2D, 3D et Jeux
    Réponses: 9
    Dernier message: 18/08/2006, 13h18
  2. Créer des fichiers cachés
    Par arasium dans le forum Langage
    Réponses: 10
    Dernier message: 03/08/2006, 10h05
  3. Réponses: 9
    Dernier message: 05/04/2005, 10h39
  4. [CR] Version nécessaire pour créer des fichiers DSR ?
    Par aysse dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 17/11/2003, 10h01

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