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 :

boost création multiarray classe


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut boost création multiarray classe
    Bonjour,

    j'ai un problème lorsque j'essaye de générer une multiarray membre d'une classe et de l'utiliser par la suite.

    dans le .h j'ai mis ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private:  
       typedef boost::multi_array<float, 5> array_type;
       array_type::extent_gen extents;
       array_type data(boost::extents[1][1][1][1][1]);
    je veux juste l'initialiser.

    et dans le .cpp associé à la classe.
    je veux resize la matrice data.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data.resize([2][2][2][2][2]);
    (les 2 c'est juste pour l'essai. normalement c'est des size_x,size_y, etc ...)

    si je fais ça j'ai les erreur suivantes:

    test_class.h:75: error: expected `;' before '(' token

    test_class.cpp: In member function `void Images::reading(std::string, std::vector<std::string, std::allocator<std::string> >&)':
    test_class.cpp:479: error: `data' undeclared (first use this function)
    test_class.cpp:479: error: (Each undeclared identifier is reported only once for each function it appears in.)

    test_class.cpp:479: error: expected primary-expression before '[' token
    si je commente la ligne dans le point cpp j'ai plus que l'erreur suivante:
    In file included from test_class.cpp:19:
    test_class.h:75: error: expected `;' before '(' token
    quelqu'un vois le problème ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    quelle est la ligne 75 du .h ? L'erreur vient clairement de là.

    Ensuite, sur la doc de boost, l'exemple n'est pas identique au tien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef boost::multi_array<double, 3> array_type;
      typedef array_type::index index;
      array_type A(boost::extents[3][4][2]);
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    arf oui désolé.

    la ligne 75 de mon .h ça correspond à la ligne 4 dans l'extrait que j'ai mis.
    la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     array_type data(boost::extents[1][1][1][1][1]);
    et j'ai pris cet exemple dans la doc de boost:
    typedef boost::multi_array<double, 3> array_type;

    array_type::extent_gen extents;
    array_type A(extents[2][3][4]);
    j'avais essayé aussi l'exemple que tu cites. mais sans succès non plus.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par svagrim Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private:  
       typedef boost::multi_array<float, 5> array_type;
       array_type::extent_gen extents;
       array_type data(boost::extents[1][1][1][1][1]);
    Salut,

    A mon humble avis, tu ferais bien de retirer le namespace boost:: de boost::extents.
    Tu définis une variable extents la ligne juste au dessus (array_type::extent_gen extents;).
    Par contre, tu ne l'utilises pas. Mais tu vas chercher un symbol extents dans le namespace boost, qui ne correspond pas à ce que tu veux.

    Peut-être que ce n'est pas ton erreur. En tout cas, c'est louche

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    nan ça ne change rien.
    par contre oui je suis d'accord avec ton argument.
    je sais pas pourquoi dans la doc de boost il remette boost::...

    mais bon c'est pas ça l'erreur. toujours le meme probleme de compilation sans ça.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    arf je m'en sors toujours pas ...
    j'ai beau parcourir l'aide de boost je vois pas.
    personne n'a d'idée du problème ?

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Montre-nous les 80 premières lignes de ton .h, que l'on voit ce qui peut se passer.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    voici la totalité du .h :
    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
    74
    75
    76
    77
    78
    79
    80
    #ifndef TEST_CLASS_H
    #define TEST_CLASS_H
     
    #include <vector>
    #include <string>
    #include <boost/multi_array.hpp>
     
    #define WANT_TRACE 1
     
    /*reading the vff files, header and images, and sort them in the variable ... */
     
    class Images
    {   
    public:
     
       Images();
       void reading(std::string input, std::vector<std::string> &files);
     
    private:   
       std::vector<std::string> ttype; 
       std::vector<std::vector<int> > tsize; 
       std::vector<int> tbits;
       std::vector<std::string> trank;
       std::vector<std::string> tbands;
       std::vector<int> ty_bin;
       std::vector<int> tz_bin;
       std::vector<float> trfan_y;
       std::vector<float> trfan_z;
       std::vector<float> tmin;
       std::vector<float> tmax;
       std::vector<float> twater;
       std::vector<float> tair;
       std::vector<float> tbonehu;
       std::vector<float> tangle_increment;
       std::vector<float> tcenter_of_rotation;
       std::vector<float> tcentral_slice;
       std::vector<std::vector<float> > tspacing;
       std::vector<std::vector<float> > torigin;
       std::vector<std::string> tformat;
       std::vector<float> telementsize;
       std::vector<std::string> tmodality;
       std::vector<std::string> tdate;
       std::vector<std::string> ttitle;
       std::vector<std::string> tsubject;
       std::vector<std::string> treverse_order;
       std::vector<std::string> trecon_sysid;
       std::vector<std::string> tmacaddr;
       std::vector<int> trawsize;
       std::vector<float> tcurrent;
       std::vector<std::string> tcurrentUnit;
       std::vector<std::string> tdataSourceJID;
       std::vector<std::string> texam;
       std::vector<float> texposure;
       std::vector<float> tframesAverage;
       std::vector<float> tgain;
       std::vector<float> tgantryPosition;
       std::vector<float> tincrementAngle;
       std::vector<float> toffset;
       std::vector<std::string> tproject;
       std::vector<std::string> tprotocol;
       std::vector<std::string> tscanTechnique;
       std::vector<std::string> tscanType;
       std::vector<std::string> tsequence;
       std::vector<std::string> tserialNumber;
       std::vector<std::string> tseries;
       std::vector<std::string> tseriesVersion;
       std::vector<float> ttablePosition; 
       std::vector<float> tvoltage;
       std::vector<std::string> tvoltageUnit;
       std::vector<std::string> tspacingUnit;       
     
       // Create a 3D array that is 1 x 1 x 1 x 1 x 1 to start
       typedef boost::multi_array<float, 5> array_type;
       array_type::extent_gen extents;
       array_type data(extents[1][1][1][1][1]);
    //   array_type A(boost::extents[3][4][2][4][4]);
     
    };
     
    #endif // TEST_CLASS_H
    y a pas grand chose dedans.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    voici la totalité du .h :
    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
    74
    75
    76
    77
    78
    79
    80
    #ifndef TEST_CLASS_H
    #define TEST_CLASS_H
     
    #include <vector>
    #include <string>
    #include <boost/multi_array.hpp>
     
    #define WANT_TRACE 1
     
    /*reading the vff files, header and images, and sort them in the variable ... */
     
    class Images
    {   
    public:
     
       Images();
       void reading(std::string input, std::vector<std::string> &files);
     
    private:   
       std::vector<std::string> ttype; 
       std::vector<std::vector<int> > tsize; 
       std::vector<int> tbits;
       std::vector<std::string> trank;
       std::vector<std::string> tbands;
       std::vector<int> ty_bin;
       std::vector<int> tz_bin;
       std::vector<float> trfan_y;
       std::vector<float> trfan_z;
       std::vector<float> tmin;
       std::vector<float> tmax;
       std::vector<float> twater;
       std::vector<float> tair;
       std::vector<float> tbonehu;
       std::vector<float> tangle_increment;
       std::vector<float> tcenter_of_rotation;
       std::vector<float> tcentral_slice;
       std::vector<std::vector<float> > tspacing;
       std::vector<std::vector<float> > torigin;
       std::vector<std::string> tformat;
       std::vector<float> telementsize;
       std::vector<std::string> tmodality;
       std::vector<std::string> tdate;
       std::vector<std::string> ttitle;
       std::vector<std::string> tsubject;
       std::vector<std::string> treverse_order;
       std::vector<std::string> trecon_sysid;
       std::vector<std::string> tmacaddr;
       std::vector<int> trawsize;
       std::vector<float> tcurrent;
       std::vector<std::string> tcurrentUnit;
       std::vector<std::string> tdataSourceJID;
       std::vector<std::string> texam;
       std::vector<float> texposure;
       std::vector<float> tframesAverage;
       std::vector<float> tgain;
       std::vector<float> tgantryPosition;
       std::vector<float> tincrementAngle;
       std::vector<float> toffset;
       std::vector<std::string> tproject;
       std::vector<std::string> tprotocol;
       std::vector<std::string> tscanTechnique;
       std::vector<std::string> tscanType;
       std::vector<std::string> tsequence;
       std::vector<std::string> tserialNumber;
       std::vector<std::string> tseries;
       std::vector<std::string> tseriesVersion;
       std::vector<float> ttablePosition; 
       std::vector<float> tvoltage;
       std::vector<std::string> tvoltageUnit;
       std::vector<std::string> tspacingUnit;       
     
       // Create a 3D array that is 1 x 1 x 1 x 1 x 1 to start
       typedef boost::multi_array<float, 5> array_type;
       array_type::extent_gen extents;
       array_type data(extents[1][1][1][1][1]);
    //   array_type A(boost::extents[3][4][2][4][4]);
     
    };
     
    #endif // TEST_CLASS_H
    y a pas grand chose dedans.

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Je pense qu'eti_nne a raison.
    Avec typedef boost::multi_array<float, 5> array_type;, array_type est un type.
    array_type::extent_gen extents; déclare extents comme une variable du type array_type::extent_gen.

    Donc array_type data(extents[1][1][1][1][1]); définit data comme un array_type en appelant un de ses constructeurs avec en argument la valeur de operateur[](operateur[](operateur[](operateur[](operateur[](extents,1),1),1),1),1)Ce qui n'est possible qu'en C++11 (et pas encore avec tous les compilateurs), et n'est pas ce que tu souhaites
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    donc en gros faut que à la place de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       typedef boost::multi_array<float, 5> array_type;
       array_type::extent_gen extents;
       array_type data(extents[1][1][1][1][1]);
    j'essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       typedef boost::multi_array<float, 5> array_type;
       array_type data([1][1][1][1][1]);
    c'est ça ?
    je suis pas sur d'avoir compris.

    je peux pas essayer aujourd'hui mais je pourrais demain.
    c'est bien ça qu'il faut que j'essaye ?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    Bon j'ai essayé de faire ce que j'avais noté, enlever l'extend en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef boost::multi_array<float, 5> array_type;
       array_type data([1][1][1][1][1]);
    et j'ai toujours la même erreur:
    75 C:\Users\pierre\Dropbox\micro-ct_files\sinogram\test_class.h expected `;' before '(' token
    j'arrive vraiment pas à trouver l'erreur ....

  13. #13
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    L'initialisation se fait dans un constructeur, à moins d'être en C++11, et auquel cas, ce n'est pas encore gagné, selon le compilateur.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    oki, je retourne à mes tutoriels que j'ai un peu oublié sur les constructeurs alors

    merci

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    lorsque j'insère l'initialisation dans un constructeur,
    le compilage plante en me disant qu'il ne connais pas les variables que j'ai initialisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //constructor
    Images::Images()
    {
    // Create a 3D array that is 1 x 1 x 1 to start
    typedef boost::multi_array<double, 3> array_type;
    typedef array_type::index index;
    array_type A(boost::extents[3][875][568]);               
    }
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    //function reading
    void Images::reading(string input, vector<string> &files)
    {
     
    Images A;
     
    #if WANT_TRACE > 0
      cout << "files are: \"" << input << endl;
      for (vector<string>::iterator it = files.begin() ; it != files.end(); ++it)
        cout << *it << endl;
      cout << "\"" << endl;
    #endif
     
    int mat_i = 0;
     
      for (vector<string>::iterator it = files.begin()+2 ; it != files.end(); ++it) 
      {
     
        /* Read projection file*/
    #if defined _WIN32 || defined _WIN64
        string sep = "\\";
    #else
        string sep = "/";
    #endif
     
        string file_to_open = input+sep+*it;
     
    #if WANT_TRACE > 0
        cout << "file is: \"" << file_to_open << "\"" << endl;
    #endif
     
        ifstream input_file;
        cout << "test" << endl;
    cout << file_to_open << endl;
        input_file.open (file_to_open.c_str(), ifstream::in);
        input_file.seekg(0,ios::beg);
     
        if(input_file == NULL)
        {
          cerr<<"Cannot open input file \n";
          return;
        }
     
        /* Read the header */
        string line;
     
        getline(input_file, line );
     
    #if WANT_TRACE > 0	
        cout << "first line :" << endl << line << endl;
    #endif
     
        string test ("=");
        size_t found;
    	int n;
        int size_j = 0;
    	int size_k = 0;
     
        while ( getline(input_file, line ) )
        {
          found = line.find(test);
     
    //#if WANT_TRACE > 0	
    //      cout << "found :" << int(found) << endl;
    //#endif
    //	  if (found == string::npos)
    //		break;
     
          string name_info;
          string info;
          name_info = line.substr(0,found);
          info = line.substr(found+1,(line.length()-found-2));
          stringstream info2(info); 
          int val; float val2;
     
          //cout << (line.length()-found-2) << endl;
          //cout << name_info << endl;
          //cout << "info :" << info << endl;
     
          if(!strcmp(name_info.c_str(), "type" ))
          {
            ttype.push_back(info.c_str());
          }
          else if(!strcmp(name_info.c_str(), "size" ))
          {
          /*
            //stringstream info2(info); 
            vector<int> vals;
            while(info2.good()) 
            {
              info2 >> val;
              cout << "TAILLE MATRICE" << endl;
              cout << val << endl;
              vals.push_back(val);
              tsize.push_back(vals);
            }
            //delete &vals;
          */
     
            if (info2.good()) {
                info2 >> size_j;
                }
            if (info2.good()) {
                info2 >> size_k;
                }
          }
     
          else if(!strcmp(name_info.c_str(), "bits" ))
          {
            info2 >> val;
            cout << "BITS" << endl;
            cout << val << endl;
            tbits.push_back(val);
          }
     
          else if(!strcmp(name_info.c_str(), "rank" ))
          {
            trank.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "bands" ))
          {
            tbands.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "y_bin" ))
          {
            info2 >> val;
            cout << "Y_BIN";
            cout << val << endl;
            ty_bin.push_back(val);
          }
     
          else if(!strcmp(name_info.c_str(), "z_bin" ))
          {
            info2 >> val;
            cout << "Z_BIN";
            cout << val << endl;
            tz_bin.push_back(val);
          }
     
          else if(!strcmp(name_info.c_str(), "rfan_y" ))
          {
            info2 >> val2;
            cout << "RFAN_Y";
            cout << val2 << endl;
            trfan_y.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "rfan_z" ))
          {
            info2 >> val2;
            cout << "RFAN_Z";
            cout << val2 << endl;
            trfan_z.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "min" ))
          {
            info2 >> val2;
            cout << "MIN";
            cout << val2 << endl;
            tmin.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "max" ))
          {
            info2 >> val2;
            cout << "MAX";
            cout << val2 << endl;
            tmax.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "water" ))
          {
            info2 >> val2;
            cout << "WATER";
            cout << val2 << endl;
            twater.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "air" ))
          {
            info2 >> val2;
            cout << "AIR";
            cout << val2 << endl;
            tair.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "bonehu" ))
          {
            info2 >> val2;
            cout << "BONE_HU";
            cout << val2 << endl;
            tbonehu.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "angle_increment" ))
          {
            info2 >> val2;
            cout << "ANGLE_INCREMENT";
            cout << val2 << endl;
            tangle_increment.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "center_of_rotation" ))
          {
            info2 >> val2;
            cout << "CENTER_OF_ROTATION";
            cout << val2 << endl;
            tcenter_of_rotation.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "central_slice" ))
          {
            info2 >> val2;
            cout << "CENTRAL_SLICE";
            cout << val2 << endl;
            tcentral_slice.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "spacing" ))
          {
            vector<float> vals2;
            while(info2.good()) 
            {
              info2 >> val2;
              cout << "SPACING" << endl;
              cout << val2 << endl;
              vals2.push_back(val2);
              tspacing.push_back(vals2);
            }
            //delete &vals2;
          }
     
          else if(!strcmp(name_info.c_str(), "origin" ))
          {
            vector<float> vals2;
            while(info2.good()) 
            {
               info2 >> val2;
               cout << "SPACING" << endl;
               cout << val2 << endl;
               vals2.push_back(val2);
               torigin.push_back(vals2);
             }
             //delete &vals2;
          }
     
          else if(!strcmp(name_info.c_str(), "format" ))
          {
            tformat.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "elementsize" ))
          {
            info2 >> val2;
            cout << "ELEMENTSIZE" << endl;
            cout << val2 << endl;
            telementsize.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "modality" ))
          {
            tmodality.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "date" ))
          {
            tdate.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "title" ))
          {
            ttitle.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "subject" ))
          {
            tsubject.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "reverse_order" ))
          {
            treverse_order.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "recon_sysid" ))
          {
            trecon_sysid.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "macaddr" ))
          {
            tmacaddr.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "rawsize" ))
          {
            info2 >> val;
            cout << "RAWSIZE";
            cout << val << endl;
            trawsize.push_back(val);
          }
     
          else if(!strcmp(name_info.c_str(), "current" ))
          {
            info2 >> val2;
            cout << "CURRENT" << endl;
            cout << val2 << endl;
            tcurrent.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "currentUnit" ))
          {
            tcurrentUnit.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "dataSourceJID" ))
          {
            tdataSourceJID.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "exam" ))
          {
            texam.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "exposure" ))
          {
            info2 >> val2;
            cout << "EXPOSURE" << endl;
            cout << val2 << endl;
            texposure.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "framesAverage" ))
          {
            info2 >> val2;
            cout << "FRAMESAVERAGE" << endl;
            cout << val2 << endl;
            tframesAverage.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "gain" ))
          {
            info2 >> val2;
            cout << "GAIN" << endl;
            cout << val2 << endl;
            tgain.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "gantryPosition" ))
          {
            info2 >> val2;
            cout << "GANTRYPOSITION" << endl;
            cout << val2 << endl;
            tgantryPosition.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "incrementAngle" ))
          {
            info2 >> val2;
            cout << "INCREMENTANGLE" << endl;
            cout << val2 << endl;
            tincrementAngle.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "offset" ))
          {
            info2 >> val2;
            cout << "OFFSET" << endl;
            cout << val2 << endl;
            toffset.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "project" ))
          {
            tproject.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "protocol" ))
          {
            tprotocol.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "scanTechnique" ))
          {
            tscanTechnique.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "scanType" ))
          {
            tscanType.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "sequence" ))
          {
           tsequence.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "serialNumber" ))
          {
            tserialNumber.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "series" ))
          {
            tseries.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "seriesVersion" ))
          {
            tseriesVersion.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "tablePosition" ))
          {
            info2 >> val2;
            cout << "TABLEPOSITION" << endl;
            cout << val2 << endl;
            ttablePosition.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "voltage" ))
          {
            info2 >> val2;
            cout << "VOLTAGE" << endl;
            cout << val2 << endl;
            tvoltage.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "voltageUnit" ))
          {
            tvoltageUnit.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "spacingunit" ))
          {
            tspacingUnit.push_back(info.c_str());
          }
     
          else
          { 
            cout << "Header line not processed" << endl;
          }
     
          // afficher la ligne à l'écran
          //cout << line << endl;   
        }
     
        //getline(input_file,line);
        //cout << line << endl;
        cout << "End of header" << endl;
        //cout << ttype.at(1) << endl;
     
        //datasize=prod(info.Dimensions)*(info.BitDepth/8);
        //fseek(vff_file_id,-datasize,'eof');
        //input_file.seekg(-trawsize[i],ios::end);
     
        //boost::array<array_type::index,3> dims = {{4, 3, 2}};       
        //data.resize([2][2][2]);
     
        //input_file.seekg(-trawsize.back(),ios::end);
     
        int length = size_j*size_k*2;
    	char * buffer = new char [length];
     
    	cout << "Reading " << length << " characters... " << endl;
    	input_file.read (buffer,length);
     
    	if (input_file)
    		std::cout << "all characters read successfully." << endl;
    	else
    		std::cout << "error: only " << input_file.gcount() << " could be read" << endl;
     
    	int buffer_i = 0;
    	// Assign values to the elements
    	for(index j = 0; j < size_j; ++j) {
    		for(index k = 0; k < size_k; ++k) {
    			printf("%08x %08x \n", *(buffer+buffer_i), *(buffer+buffer_i+1));
    //			cout << *(buffer+buffer_i) << " " << *(buffer+buffer_i+1) << endl;
    			A[mat_i][j][k] = *(buffer+buffer_i+1);
    			buffer_i += 2;
    		}
    		cin.get();
    	}
     
    	delete[] buffer;
     
    	input_file.close();	
    	cin.get();
    	mat_i++;
      }
     
    }
    l'erreur que j'ai est la suivante :
    test_class.cpp: In member function `void Images::reading(std::string, std::vector<std::string, std::allocator<std::string> >&)':
    test_class.cpp:518: error: `index' undeclared (first use this function)
    test_class.cpp:518: error: (Each undeclared identifier is reported only once for each function it appears in.)
    test_class.cpp:518: error: expected `;' before "j"
    test_class.cpp:518: error: `j' undeclared (first use this function)
    test_class.cpp:519: error: expected `;' before "k"
    test_class.cpp:519: error: `k' undeclared (first use this function)

    test_class.cpp:522: error: no match for 'operator[]' in 'A[mat_i]'

    make.exe: *** [test_class.o] Error 1

    Execution terminated

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    j'ai essayé comme ça aussi (d'après l'aide d'un forum C++ pour quelqu'un qui faisait à peu prêt pareil):

    .h
    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
    74
    75
    76
    77
    78
    #ifndef TEST_CLASS_H
    #define TEST_CLASS_H
     
    #include <vector>
    #include <string>
    #include <boost/multi_array.hpp>
     
    #define WANT_TRACE 1
     
    /*reading the vff files, header and images, and sort them in the variable ... */
     
    typedef boost::multi_array<float, 3> array_type;
    typedef array_type::index index;
     
    class Images
    {   
    public:
     
       Images();
       void reading(std::string input, std::vector<std::string> &files);
       array_type data;
     
    private:   
       std::vector<std::string> ttype; 
       std::vector<std::vector<int> > tsize; 
       std::vector<int> tbits;
       std::vector<std::string> trank;
       std::vector<std::string> tbands;
       std::vector<int> ty_bin;
       std::vector<int> tz_bin;
       std::vector<float> trfan_y;
       std::vector<float> trfan_z;
       std::vector<float> tmin;
       std::vector<float> tmax;
       std::vector<float> twater;
       std::vector<float> tair;
       std::vector<float> tbonehu;
       std::vector<float> tangle_increment;
       std::vector<float> tcenter_of_rotation;
       std::vector<float> tcentral_slice;
       std::vector<std::vector<float> > tspacing;
       std::vector<std::vector<float> > torigin;
       std::vector<std::string> tformat;
       std::vector<float> telementsize;
       std::vector<std::string> tmodality;
       std::vector<std::string> tdate;
       std::vector<std::string> ttitle;
       std::vector<std::string> tsubject;
       std::vector<std::string> treverse_order;
       std::vector<std::string> trecon_sysid;
       std::vector<std::string> tmacaddr;
       std::vector<int> trawsize;
       std::vector<float> tcurrent;
       std::vector<std::string> tcurrentUnit;
       std::vector<std::string> tdataSourceJID;
       std::vector<std::string> texam;
       std::vector<float> texposure;
       std::vector<float> tframesAverage;
       std::vector<float> tgain;
       std::vector<float> tgantryPosition;
       std::vector<float> tincrementAngle;
       std::vector<float> toffset;
       std::vector<std::string> tproject;
       std::vector<std::string> tprotocol;
       std::vector<std::string> tscanTechnique;
       std::vector<std::string> tscanType;
       std::vector<std::string> tsequence;
       std::vector<std::string> tserialNumber;
       std::vector<std::string> tseries;
       std::vector<std::string> tseriesVersion;
       std::vector<float> ttablePosition; 
       std::vector<float> tvoltage;
       std::vector<std::string> tvoltageUnit;
       std::vector<std::string> tspacingUnit;       
     
    };
     
    #endif // TEST_CLASS_H
    et .cpp
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <sstream>
    #include <sys/types.h>
    #include <dirent.h>
    #include <errno.h>
    #include <vector>
    #include <conio.h>
    #include <algorithm>
    #include <functional>
    #include <iterator>
     
    #include <boost/multi_array.hpp>
     
    #include "test_class.h"
    using namespace std;
     
    typedef boost::multi_array<float, 3> array_type;
    typedef array_type::index index;
     
    //constructor
    Images::Images():data(boost::extents[1][1][1])
    //Images::Images()
    {
    // Create a 3D array that is 1 x 1 x 1 to start
    //typedef boost::multi_array<double, 3> array_type;
    //typedef array_type::index index;
    //array_type A(boost::extents[3][875][568]); 
    //A(boost::extents[3][875][568]);              
    }
     
    //function reading
    void Images::reading(string input, vector<string> &files)
    {
     
    #if WANT_TRACE > 0
      cout << "files are: \"" << input << endl;
      for (vector<string>::iterator it = files.begin() ; it != files.end(); ++it)
        cout << *it << endl;
      cout << "\"" << endl;
    #endif
     
    data.resize(boost::extents[3][875][568]);
    int mat_i = 0;
     
      for (vector<string>::iterator it = files.begin()+2 ; it != files.end(); ++it) 
      {
     
        /* Read projection file*/
    #if defined _WIN32 || defined _WIN64
        string sep = "\\";
    #else
        string sep = "/";
    #endif
     
        string file_to_open = input+sep+*it;
     
    #if WANT_TRACE > 0
        cout << "file is: \"" << file_to_open << "\"" << endl;
    #endif
     
        ifstream input_file;
        cout << "test" << endl;
        cout << file_to_open << endl;
        input_file.open (file_to_open.c_str(), ifstream::in);
        input_file.seekg(0,ios::beg);
     
        if(input_file == NULL)
        {
          cerr<<"Cannot open input file \n";
          return;
        }
     
        /* Read the header */
        string line;
     
        getline(input_file, line );
     
    #if WANT_TRACE > 0	
        cout << "first line :" << endl << line << endl;
    #endif
     
        string test ("=");
        size_t found;
    	int n;
        int size_j = 0;
    	int size_k = 0;
     
        while ( getline(input_file, line ) )
        {
          found = line.find(test);
     
          string name_info;
          string info;
          name_info = line.substr(0,found);
          info = line.substr(found+1,(line.length()-found-2));
          stringstream info2(info); 
          int val; float val2;
     
          if(!strcmp(name_info.c_str(), "type" ))
          {
            ttype.push_back(info.c_str());
          }
          else if(!strcmp(name_info.c_str(), "size" ))
          {
          /*
            //stringstream info2(info); 
            vector<int> vals;
            while(info2.good()) 
            {
              info2 >> val;
              cout << "TAILLE MATRICE" << endl;
              cout << val << endl;
              vals.push_back(val);
              tsize.push_back(vals);
            }
            //delete &vals;
          */
     
            if (info2.good()) {
                info2 >> size_j;
                }
            if (info2.good()) {
                info2 >> size_k;
                }
          }
     
          else if(!strcmp(name_info.c_str(), "bits" ))
          {
            info2 >> val;
            cout << "BITS" << endl;
            cout << val << endl;
            tbits.push_back(val);
          }
     
          else if(!strcmp(name_info.c_str(), "rank" ))
          {
            trank.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "bands" ))
          {
            tbands.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "y_bin" ))
          {
            info2 >> val;
            cout << "Y_BIN";
            cout << val << endl;
            ty_bin.push_back(val);
          }
     
          else if(!strcmp(name_info.c_str(), "z_bin" ))
          {
            info2 >> val;
            cout << "Z_BIN";
            cout << val << endl;
            tz_bin.push_back(val);
          }
     
          else if(!strcmp(name_info.c_str(), "rfan_y" ))
          {
            info2 >> val2;
            cout << "RFAN_Y";
            cout << val2 << endl;
            trfan_y.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "rfan_z" ))
          {
            info2 >> val2;
            cout << "RFAN_Z";
            cout << val2 << endl;
            trfan_z.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "min" ))
          {
            info2 >> val2;
            cout << "MIN";
            cout << val2 << endl;
            tmin.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "max" ))
          {
            info2 >> val2;
            cout << "MAX";
            cout << val2 << endl;
            tmax.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "water" ))
          {
            info2 >> val2;
            cout << "WATER";
            cout << val2 << endl;
            twater.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "air" ))
          {
            info2 >> val2;
            cout << "AIR";
            cout << val2 << endl;
            tair.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "bonehu" ))
          {
            info2 >> val2;
            cout << "BONE_HU";
            cout << val2 << endl;
            tbonehu.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "angle_increment" ))
          {
            info2 >> val2;
            cout << "ANGLE_INCREMENT";
            cout << val2 << endl;
            tangle_increment.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "center_of_rotation" ))
          {
            info2 >> val2;
            cout << "CENTER_OF_ROTATION";
            cout << val2 << endl;
            tcenter_of_rotation.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "central_slice" ))
          {
            info2 >> val2;
            cout << "CENTRAL_SLICE";
            cout << val2 << endl;
            tcentral_slice.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "spacing" ))
          {
            vector<float> vals2;
            while(info2.good()) 
            {
              info2 >> val2;
              cout << "SPACING" << endl;
              cout << val2 << endl;
              vals2.push_back(val2);
              tspacing.push_back(vals2);
            }
            //delete &vals2;
          }
     
          else if(!strcmp(name_info.c_str(), "origin" ))
          {    
            vector<float> vals2;
            while(info2.good()) 
            {
               info2 >> val2;
               cout << "SPACING" << endl;
               cout << val2 << endl;
               vals2.push_back(val2);
               torigin.push_back(vals2);
             }
             //delete &vals2;
          }
     
          else if(!strcmp(name_info.c_str(), "format" ))
          {
            tformat.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "elementsize" ))
          {
            info2 >> val2;
            cout << "ELEMENTSIZE" << endl;
            cout << val2 << endl;
            telementsize.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "modality" ))
          {
            tmodality.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "date" ))
          {
            tdate.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "title" ))
          {
            ttitle.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "subject" ))
          {
            tsubject.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "reverse_order" ))
          {
            treverse_order.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "recon_sysid" ))
          {
            trecon_sysid.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "macaddr" ))
          {
            tmacaddr.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "rawsize" ))
          {
            info2 >> val;
            cout << "RAWSIZE";
            cout << val << endl;
            trawsize.push_back(val);
          }
     
          else if(!strcmp(name_info.c_str(), "current" ))
          {
            info2 >> val2;
            cout << "CURRENT" << endl;
            cout << val2 << endl;
            tcurrent.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "currentUnit" ))
          {
            tcurrentUnit.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "dataSourceJID" ))
          {
            tdataSourceJID.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "exam" ))
          {
            texam.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "exposure" ))
          {
            info2 >> val2;
            cout << "EXPOSURE" << endl;
            cout << val2 << endl;
            texposure.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "framesAverage" ))
          {
            info2 >> val2;
            cout << "FRAMESAVERAGE" << endl;
            cout << val2 << endl;
            tframesAverage.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "gain" ))
          {
            info2 >> val2;
            cout << "GAIN" << endl;
            cout << val2 << endl;
            tgain.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "gantryPosition" ))
          {
            info2 >> val2;
            cout << "GANTRYPOSITION" << endl;
            cout << val2 << endl;
            tgantryPosition.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "incrementAngle" ))
          {
            info2 >> val2;
            cout << "INCREMENTANGLE" << endl;
            cout << val2 << endl;
            tincrementAngle.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "offset" ))
          {
            info2 >> val2;
            cout << "OFFSET" << endl;
            cout << val2 << endl;
            toffset.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "project" ))
          {
            tproject.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "protocol" ))
          {
            tprotocol.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "scanTechnique" ))
          {
            tscanTechnique.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "scanType" ))
          {
            tscanType.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "sequence" ))
          {
           tsequence.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "serialNumber" ))
          {
            tserialNumber.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "series" ))
          {
            tseries.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "seriesVersion" ))
          {
            tseriesVersion.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "tablePosition" ))
          {
            info2 >> val2;
            cout << "TABLEPOSITION" << endl;
            cout << val2 << endl;
            ttablePosition.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "voltage" ))
          {
            info2 >> val2;
            cout << "VOLTAGE" << endl;
            cout << val2 << endl;
            tvoltage.push_back(val2);
          }
     
          else if(!strcmp(name_info.c_str(), "voltageUnit" ))
          {
            tvoltageUnit.push_back(info.c_str());
          }
     
          else if(!strcmp(name_info.c_str(), "spacingunit" ))
          {
            tspacingUnit.push_back(info.c_str());
          }
     
          else
          { 
            cout << "Header line not processed" << endl;
          }
     
          // afficher la ligne à l'écran
          //cout << line << endl;   
        }
     
        cout << "End of header" << endl;
     
        int length = size_j*size_k*2;
    	char * buffer = new char [length];
     
    	cout << "Reading " << length << " characters... " << endl;
    	input_file.read (buffer,length);
     
    	if (input_file)
    		std::cout << "all characters read successfully." << endl;
    	else
    		std::cout << "error: only " << input_file.gcount() << " could be read" << endl;
     
    	int buffer_i = 0;
    	// Assign values to the elements
    	for(index j = 0; j < size_j; ++j) {
    		for(index k = 0; k < size_k; ++k) {
    			printf("%08x %08x \n", *(buffer+buffer_i), *(buffer+buffer_i+1));
    //			cout << *(buffer+buffer_i) << " " << *(buffer+buffer_i+1) << endl;
    			data[mat_i][j][k] = *(buffer+buffer_i+1);
    			buffer_i += 2;
    		}
    		cin.get();
    	}
     
    	delete[] buffer;
     
    	input_file.close();	
    	cin.get();
    	mat_i++;
      }
     
    }
    là ça compile. mais le code plante direct. "le projet a cessé de fonctionné".

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    sans faire avancer le schmilblik, trop de code à relire.
    Si ça compile c'est déjà pas mal, si "ça a cessé de fonctionné", tu as surement un accès mémoire interdit. Et pour ça, tu dois maintenant utiliser un debugger.

    Ce qui ne m'étonne pas particulièrement parce que... que ce code est moche !

    Tu es en C++, tu utilises std::string et... tu utilises strcmp...
    C'est un peu de l'hérésie..
    La fonction c_str est bien pratique mais c'est pas obligatoire de l'utiliser et en abuser à toutes les sauces !

    Remercions la stl de surcharger les opérateurs pour pouvoir utiliser ce que nous faisons tous naïvement pour comparer des chaînes de caractères (et source de nombreux messages "pourquoi conschar*1 == constchar*2 est toujours faux ?"). Si vraiment tu veux garder le fonctionnement en méthode type strcmp, on a la méthode compare.
    Encore plus fort : pourquoi ajouter via string::c_str dans un vector de... string ?

    Egalement de nombreux header qui sont issus du C qui gagneraient à être remplacés par leur pendant C++.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  18. #18
    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,

    Il y a, quand même, quelque chose qui m'échappe plus ou moins...

    Je n'arrive absolument pas à comprendre pourquoi la classe Images (qui, si j'ai bien compris, sert de gestionnaire d'images ) est composée de... 50 tableaux différents

    A priori, une image est une image, quelle que soit la chose qu'elle doit représenter.

    S'il te faut faire la différence entre une image et une autre, tu ne devrais avoir à le faire qu'au niveau d'un "identificateur unique" qui identifie de manière unique et non ambigüe une image particulière (le nom du fichier dont elle est tirée , un index représentant sa position dans un vecteur , une clé permettant de l'identifier dans une map ou un set )

    Si, comme je le comprends, Images est une collection d'images, alors, c'est que tu devrais avoir une classe (de base ) Image qui permet, outre le fait d'afficher le graphisme en question "quelque part", de distinguer une image d'une autre.

    La manière dont les différents "graphismes" sont générés, manipulés, modifiés ne devant dépendre, au final, que du type d'images utilisé

    Si tu veux créer une image basée sur la valeur d'un réel, d'un entier ou d'une chaine de caractères, il faut juste de quoi convertir le rée ou l'entier en chaine de caractères et utiliser un seul algorithme qui permet de créer une image sur base de la chaine de caractères

    Si, pour une raison ou une autre, (parce que le score a augmenté de 100, par exemple), ce qui doit être représenté par l'image a été modifié, il "suffit" de recréer l'image avant de l'afficher

    bref, il me semble clairement y avoir un problème "quelque part" avec ta classe.

    Mais comme tu ne nous as pas dit jusqu'à présent ce que tu voulais faire de ta classe Images, il nous sera sans doute difficile de te dire comment y arriver
    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

  19. #19
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    D'ailleurs, si tu veux un point de comparaisons, dans l'API OpenGL, les textures sont manipulés via des entiers, qui sont des indices dans un tableau interne à l'API
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Points : 110
    Points
    110
    Par défaut
    je vais commencer à répondre mais je pars bientot en conférence alors je finirais peut être plus tard.

    alors oui j'ai pas utilisé de C++ depuis très longtemps, j'ai fait les tutoriels C++ et j'ai relu un bouquin de c++ pour me remettre dedans mais bien sur, il faut que je recode pour me rappeller du c++.

    pour les std::string. ba c'était de faire comme ça dans des tutoreils spécialisé C++ alors pour le moment j'ai "recopié" bêtement. avec l'expérience je comprendrais peut etre pourquoi il faut pas faire ça mais pour le moment je vois pas.

    pareil pour strcmp j'ai trouvé ça sur un site de c++ et j'ai réussi à m'en sortir avec du coup j'étais content. je sais pas pourquoi ça n'a pas sa place en c++.
    je vais regarder ton lien en tout cas merci !

    pour le .c_str dans un vector de string, j'ai modifié des tableaux qui n'était pas des strings pour les faires passer en string dernièrement. fort bien possible que il y a des .c_str à enlever du coup. je vais regarder ça. merci !

    pour la classe image elle comprend de nombreux tableaux parce que je fais du traitement d'images multi-modale.
    en gros à la fin je me retrouve avec un volume d'image, à plusieurs temps, pris à des endroits un peu différent dans l'espace, avec une fois sur deux ou une fois sur trois une modalité d'imagerie différente, et une fois sur deux un état de l'échantillon différent (expiration, inspiration).

    les tableaux servent à répertorier toutes les conditions d'imageries différentes et les variables qui entrent dans des équations pour calculer des phénomènes physiologique à partir de l'ensemble de ses images.
    les valeurs de certains de ses tableaux sont directement des variables de ses équations, d'autres servent à dire, cette équation va servir pour ces images, cette équation pour celles là etc ...
    l'image en cas d'inspiration tu va la pondérer avec telle fonction dépendant du temps si on souhaite utiliser ce modèle mathématique, avec telle autre si on souhaite utiliser un autre modèle mathématique.
    idème pour les images en cas d'expiration etc ....

    je voudrais que la classe image me serve à avoir toutes ses données à disposition, pour après à partir d'autres fonctions dépendant notamment des modèles pharmaco-cinétique que je veux utiliser je puisse modifier mes images avec mes pondérations et lancer les calculs des paramètres physiologique.

    voilà j'espère que c'est un peu plus claire.

Discussions similaires

  1. [RMI] problème Création *_stub.class et *_skel.class
    Par philobedo dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 29/05/2006, 20h03
  2. Contrôler l'ordre de création de classes globales
    Par 10_GOTO_10 dans le forum C++
    Réponses: 4
    Dernier message: 24/04/2006, 20h39
  3. Création de classe exception
    Par HNT dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 03/01/2006, 15h53
  4. Création de classes à la volée...
    Par ouiffi dans le forum Langage
    Réponses: 8
    Dernier message: 16/12/2005, 18h01

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