j'ai réussi à changer les strcmp par les str.compare.
merci !
ça change quoi dans le fond ?
(bon ça change pas le probleme que j'ai. mais si ça peut rendre le code plus propre c'est cool !)
j'ai réussi à changer les strcmp par les str.compare.
merci !
ça change quoi dans le fond ?
(bon ça change pas le probleme que j'ai. mais si ça peut rendre le code plus propre c'est cool !)
pour le mode débug.
j'avoue que j'aimerais beaucoup mais pour le moment je comprends pas du tout comment marche le mode debug sous dev c++....
En fait, dev-cpp est un problème en soit, parce que son compilateur est ancien (d'aucun dirait périmé), et n'est pas maintenu à jour.
Je te recommande fortement de passer à une solution maintenue, telle que code::blocks ou Eclipse for C++, ou encore MS Visual C++ (express est la version gratuite).
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- 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.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
ah oki.
merci.
c'est vrai que j'ai pris dev-c++ parce que c'est ce que j'avais utilisé en école d'ingénieur il y a ..... (mince chuis vieux ....)
je vais essayer eclipse on m'en avait parlé.
(enfin je vais surtout essayer de passer sur Qt sur linux bientot mais la on a des problemes avec nos stations de travaille ...).
bon ba j'essayer de voir si j'arrive à debugger avec eclipse.
parce que sur dev-cpp il fait les breakpoints dans le main, mais dans les fonctions appelés il me les déclare invalide.
Peut etre est-ce là, le réel problème...
Il est possible que l'on n'ait pas la même notion de ce qu'est une image, mais, pour moi, une image n'est jamais... qu'une "vue" de quelque chose à un instant T donné.
Que tu doive combiner plusieurs vues différentes afin de générer une vue "globale" correspondant à un instant T est tout à fait possible, mais, tu devrais faire en sorte que tu n'aies qu'à combiner les images, indépendamment de ce qu'elles peuvent représenter ou de l'endroit d'où elles sont issues.
Ca, ce sont des données métier...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 ....
C'est à dire que chaque image "de base" correspond à la vue d'un état particulier dans des conditions particulières à un instant T donné.
Il faut que tu soies, effectivement, en mesure de générer la vue en question, mais, une fois qu'il s'agit de générer la vue "globale", les différents états et conditions n'ont plus à intervenir : tu dois avoir sélectionné "par ailleurs" les image à combiner, et laisser ton algorithme de combinaison faire le reste.
En fait, tu devrais avoir une classe "Image" qui correspond à ce que tu veux afficher (un ensemble de pixels qui s'affichent sur deux ou trois dimensions), et un algorithme par "donnée de base" qui converti la donnée de base en image.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.
quand il s'agit, enfin, de combiner plusieurs images de base, tu sélectionnes les images de base qui t'intéressent et tu utilises un algorithme qui permette de les combiner "selon les besoins".
Mais cela implique qu'il te manque sans doute quelque chose comme une classe et autant d'algorithme que tu n'as de tableaux dans ta classe images
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
merci koala pour ta réponse.
alors pour moi les gens avec qui j'ai travaillé et je travaille en ce moment en traitement d'image jusqu'à maintenant) une image n'a pas tout à fait la même définition que toi. du coup j'avais peut être pas assez expliqué/défini ce que je voulais faire et je m'en excuse. ça ne m'étais pas passé par la tête qu'on aurait pas forcément la même définition la dessus.
et par ailleurs pour en revenir à une de tes dernières remarques :
je n'ai aucunement l'intention d'afficher quoi que ce soit.une classe "Image" qui correspond à ce que tu veux afficher (un ensemble de pixels qui s'affichent sur deux ou trois dimensions)
ce que j'appelle image, tu l’appellerais peut être plus data du coup en fait si je me trompe pas.
ma définition d'image est "une information acquise dans un état précis "temps, état de l'échantillon, etc ...". que ça soit une information sous forme d'une seule valeur, d'une matrice 2 ou 3D (ou plus parfois).
et la ma classe me sert juste à répertorier les images (ou data) comme je souhaite pour appliquer mes algo de traitements
mon algorithme va utiliser des données de chaque images de base et non un seul type.
Bah, pour moi, une fois que l'on se met sur la définition du terme image, il n'y a pas de problème
Mais ta définition me pousse quand meme à m'interroger
(à vrai dire, il y a de fortes chances pour que si tu réponds non aux deux questions, la réponse à la troisième soit oui )
- J'ai bien conscience que toutes les données interviennent, à un moment ou à un autre, dans l'algorithme, mais, si l'on fait exception de ce fait:
- Y a-t-il la moindre relation qui puisse réunir l'ensemble des données
- Y a-t-il seulement le moindre moment de l'algorithme où tu aurais besoin de toutes les données en même temps
- Si ton algorithme a vraiment besoin de toutes ces informations, je te vois assez facilement partir sur un "code spagetti" de plusieurs centaines de lignes... Ne crois tu pas qu'il serait intéressant de factoriser cet algorithme
je m'explique. Tu as (si j'ai bien compté ):
- 23 tableaux de chaines de caractères
- 20 tableaux de float
- 4 tableaux d'int
- 1 matrice d'int
- 2 matrices de float
- (je crois ne rien avoir oublié )
Etant donné l'ordre dans lequel les différentes données sont déclarées, je ne serais pas étonné du tout si cela correspondait peu ou prou à 6 parties spécifiques de ton algorithme.
Peut etre devrais tu trouver le moyen de faire en sorte de séparer correctement ces différentes parties, quitte à ce qu'une des partie fasse appel à une autre
Je ne doute pas qu'il puisse, parfois, y avoir des communications entre ces différentes parties, mais si une des données doit passer de l'un à l'autre ben, le passage d'arguments lors de l'appel d'une fonction, ca sert à ca, non
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
back to my problem ....
bon ca faisait longtemps que j'avais plus toucher a ce code ... conf plus redaction d'une publie oblige.
donc voila je m'y remet.
j'ai quitte dev-cpp comme vous m'aviez dit que c'etait obsolette.
j'ai d'ailleurs fait passer mon pc principale sous ubuntu 12.04 car j'en avais mare de windows pour faire ce que je faisais dessus.
je travaille maintenant donc sous ubuntu 12.04, windows seven (quand je bosse sur mon laptop) et suse enterprise (quand je bosse sur les workstations qu' on a finalement reussi a faire fonctionner comme on voulait).
du coup je suis passe sur code::blocks. vous en pensez quoi c'est un bon soft pour faire du c++ ?
on m'avait conseiller Qt creator mais j'ai pas reussi a l'installer sous suse du coup pour avoir 36 environnement different j'ai mis code::blocks.
donc voici ou j'en suis :
program main (a ma connaissance mes problemes ne viennent pas de la):
program test_class.h (pareil je pense pas que les problemes viennent de la)
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 #include <cstdlib> #include <iostream> #include <vector> #include <string> #include <sys/types.h> #include <dirent.h> #include <errno.h> #include "test_class.h" using namespace std; /*function getdir2*/ int getdir2 (string dir, vector<string> &files) { DIR *dp; struct dirent *dirp; if((dp = opendir(dir.c_str())) == NULL) { cout << "Error(" << errno << ") opening " << dir << endl; return errno; } while ((dirp = readdir(dp)) != NULL) { files.push_back(string(dirp->d_name)); } closedir(dp); return 0; } // end function getdir2 //////////////////////////////////////////////////////////////////////////////////// // start function main int main(int argc, char *argv[]) { vector<string> files = vector<string>(); string input = ""; cout << "Enter the path of the folder where there is only the projections :\n>"; getline(cin, input); getdir2(input,files); Images myImages; myImages.reading(input, files); myImages.save_binaryFile(); //cout << myImages.ttype; std::cin.get(); }
et du coup le programm ou tout se passe :
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 #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(); //function: read the vff files. void reading(std::string input, std::vector<std::string> &files); //function: save the final matrix void save_binaryFile(); array_type data; private: std::vector<std::vector<int> > tsize; }; #endif // TEST_CLASS_H
j'ai mis les programmes en quasi entier parce que plusieurs fois on m'a repproche de pas tout mettre et du coup de pas pouvoir tester le programme sur son pc mais comme vous pouvez le voir la plupart des lignes de codes c'est juste pour remplir mes matrices de donnees. du coup j'ai juste enlever les parties dont j'etais vraiment sur qu'elles n'ont aucun lien avec mon probleme.
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 #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; #define BYTETOBINARYPATTERN "%d%d%d%d%d%d%d%d" #define BYTETOBINARY(byte) \ (byte & 0x80 ? 1 : 0), \ (byte & 0x40 ? 1 : 0), \ (byte & 0x20 ? 1 : 0), \ (byte & 0x10 ? 1 : 0), \ (byte & 0x08 ? 1 : 0), \ (byte & 0x04 ? 1 : 0), \ (byte & 0x02 ? 1 : 0), \ (byte & 0x01 ? 1 : 0) //constructor Images::Images():data(boost::extents[3][875][568]) //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 // Create a 3D array //typedef boost::multi_array<double, 3> array_type; //typedef array_type::index index; //array_type data(boost::extents[3][875][568]); //data.resize(boost::extents[3][875][568]); int mat_i = 0; // check the directory is ok if (files.size() < 3) { cout << "Directory is wrong or does not contain any file." << endl; return; } for (vector<string>::iterator it = files.begin()+2 ; it != files.begin()+3; ++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 << 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; if(name_info.compare("size") == 0) { stringstream info3(info); vector<int> vals; while(info3.good()) { info3 >> val; vals.push_back(val); } tsize.push_back(vals); //delete &vals; // cout << "taille info tableau" << tsize[0][0] << tsize[0][1] << endl; if (info2.good()) { info2 >> size_j; cout << "size1 " << size_j << endl; } if (info2.good()) { info2 >> size_k; cout << "size2 " << size_k << endl; } } else { cout << "Header line not processed" << 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]); int length = size_j*size_k*2; char *buffer = new char [length]; cout << "Reading " << length << " characters... " << endl; input_file.seekg(-length,ios::end); 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(array_type::index k = 0; k < size_k; ++k) { for(array_type::index j = 0; j < size_j; ++j) { char num1 = buffer[buffer_i]; buffer_i++; char num2 = buffer[buffer_i]; buffer_i++; int16_t number = 0; number |= (unsigned char)num2; number |= num1 << 8; //int number = num2 + (num1 << 8); //cout << "mat_i : " << mat_i << "j : " << j << "k : " << k << endl; data[mat_i][j][k] = number; // printf("%02x %02x %i\n", num1, num2, number); printf (BYTETOBINARYPATTERN" "BYTETOBINARYPATTERN"\n", BYTETOBINARY(num1), BYTETOBINARY(num2)); //,number); // cout << *(buffer+buffer_i) << " " << *(buffer+buffer_i+1) << endl; //unsigned int number = num2 + (num1 << 8); } //cin.get(); } cout << "size data no elements: " << data.size() << "no bytes : " << sizeof(data) << endl; delete[] buffer; input_file.close(); cin.get(); mat_i++; } } void Images::save_binaryFile() { cout << "saving the images" << endl; //calculation of the size of one slice int length1 = tsize[0][0]*tsize[0][1]*2; cout << "length1 : " << length1 << endl; cout << "size_x : " << tsize[0][0] << " size_y : " << tsize[0][1] << endl; cout << "no of dimensions : " << data.num_dimensions() << "size dimensions : " << data.shape() << " size in no elements : " << data.num_elements() << endl; cout << "sizeof : " << sizeof(data) << endl; //tsize[2]*2; ofstream binaryFile ("test_image.raw", ios::out | ios::binary); binaryFile.write((char*)&data,length1); //sizeof(data) instead of lenght1? binaryFile.close(); }
bon alors ce code semble "marcher" si je ne veux travailler qu'avec la taille de matrice 3 par 865 par 568 que j'ai choisi histoire de pas m'encombrer de toutes mes donnees juste pour faire des tests.
mais je n'arrive jamais a la reshaper.
par exemple quand je lis la taille de la matrice que je souhaite ouvrir (genre quand je definie size_j et size_k j'aimerais bien changer la taille avec les methodes de reshape de multi_array de boost mais pas moyen. il me fait les memes erreurs qu'avant.
(au passage la fonction save ne marche pas ... sauriez vous comment faire l'equivalent sous matlab de data(i,:, avec les multi_array ? (c' est a dire choisir la premiere dimension et sauvegarder toute la matrice 2D pour cette slice la)
sinon oui je suis en train de reflechier a separer plus. peut etre que mon probleme de reshape pourrait se resoudre comme ca ?
Merci a vous.
meme si je separe mes differentes parties il faut que j'arrive a modifier ma taille de ma multi_array.
c'est quand meme pour les fonctions de la multi_array que je me suis embeter a en creer une ...
et pour le moment je ne comprend pas...
rien ne marche ...
j'arrive a cree ma matrice dans le constructeur :
mais j'arrive pas a modifier la taille dans le code apres :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Images::Images():data(boost::extents[220][875][568]) {}
ca devrait marcher pourtant nan ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part data(boost::extents[3][875][568]);
comment on fait pour appeler la fonction extents quand la multi_array fait parti d'une classe ?
dans le constructeur, il y a construction de l'objet.
dans la seconde ligne, tu appelles la fonction operator() de data, avec en argument un boost::extents
Mes principes de bases du codeur qui veut pouvoir dormir:Pour faire des graphes, essayez yEd.
- 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.
le ter nel est le titre porté par un de mes personnages de jeu de rôle
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager