Bonjour à tous,

ma maîtrise limitée du c++ et de ses rouages m'empêchent de débuguer mon code avec succès, j'en appelle donc à la communauté en espérant ne pas trop vous embêter et apprendre de mes erreurs .



Pour essayer de décrire ma situation succintement, j'ai défini une template classe que j'ai nommée image:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
template <classe T>
class image {
 public: 
 
// diverses méthodes...
 
T *data;
 
 private:
int width, height;
}
Ensuite, je défini une structure rgb, me permettant de travailler avec des images "triples" (3 composantes ou bandes).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
typedef struct { 
	uchar r, g, b; 
} rgb;
Que je manipule dans mes fonctions principales de la manière suivante (je n'écris ici que la ligne d'allocation mémoire et le remplissage, je vous épargne la définition d'imRef qui n'a pas d'importance ici):

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
image<rgb>* im = new image<rgb>(width, height);
 
// quelque part plus loin ...
 
 image<float> *red = new image<float>(width, height); 
 image<float> *green = new image<float>(width, height); 
 image<float> *blue = new image<float>(width, height);
 
  for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
      imRef(red, x, y) = imRef(im, x, y).r;	  //remplissage
      imRef(green, x, y) = imRef(im, x, y).g;	
      imRef(blue, x, y) = imRef(im, x, y).b;	
    }
  }
Jusqu'ici tout va bien ! Maintenant mon problème est que je cherche une solution pour travailler avec des images qui n'ont plus 3 composantes, mais un certain nombre N (N>>3). Chacune de ces composantes est à proprement dit une image elle-même, de taille constante width*height.
Je cherche donc à définir un "tableau de tableau" de manière à récupérer un pointeur, que j'appelle bands, me permettant d'accéder via bands[i] à la composante n°i de mon image.

J'ai donc fonctionné en définissant une autre structure hyperSpec de la sorte:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
typedef struct {
	uchar *bands;
} hyperSpec;
Que je veux ensuite utiliser comme ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
image<hyperSpec>* theIm = new image<hyperSpec>(width, height);
 
//quelque part plus loin ...
 
image<float> *b[num_bands] = new image<float>(width, height); // erreurs de compilation ici
 
for (int i = 0; i<num_bands; i++){
	 for (int y = 0; y < height; y++) {     // remplissage
	     for (int x = 0; x < width; x++) {
			 imRef(b[i], x, y) = imRef(im,x,y).bands[i] ; // erreurs de compilation ici
		 }
     }
  }
L'idée étant, après remplissage, de récupérer les composantes via b[i].

Mais ces dernières lignes de code me renvoie des erreurs de compilation que je n'arrive pas à corriger. Ces erreurs sont les suivantes :

- expected constant expression
- cannot allocate an array of constant size 0
- 'b' : array initialization needs curly braces
- 'new' : 'image<T>' no default constructor to initialize arrays of objects
with
[
T=float
]
J'ai essayé de ne mettre que le strict minimum de code tout en essayant d'être clair sur mon problème, si ce n'est pas le cas n'hésitez pas à me demander des compléments.

Merci d'avance