begin process at 2012 05 28 07:20:21
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Allocation dynamique 3 dimensions


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Allocation dynamique 3 dimensions

lundi 13 septembre 2004 à 08:15:46 | Allocation dynamique 3 dimensions

gilimcce

Bonsoir,

J'alloue la mémoire d'un tableau contenant les pixels d'une image. Si je déclare classiquement mon tableau ( ex: image[512][1024][3] ) tout se passe bien, et j'arrive à mapper mon objet...

mais avec le code suivant, ça se complique :
l'image résultante est complètement brouillée...
pourtant l'allocation se passe sans erreur (testé) et je désalloue
(avec free, ou delete selon le cas c ou c++).
Est-ce un probleme d'initialisation de mon tableau ?
Texture est une variable globale, et l'allocation dynamique est faite dans une fonction secondaire.

Merci pour toute info,
Bonne soirée, et douce nuit.

Gil

/////////////////// ALLOC DYNAMIQUE /////////////////////

width = cinfo.image_width;
height = cinfo.image_height;
int dim_gris = width*height;
int dim_rgb = width*height*3;

/////////////////// ESSAI EN C ////////////////////////
/*
texture = (unsigned char ***)calloc(height,sizeof(unsigned char **));
if (texture == NULL) exit (1);

for ( int i = 0; i < height; i++ )
{
texture[i] = (unsigned char **)calloc(width,sizeof(unsigned char *));
if (texture[i] == NULL) exit (1);
}

for ( i = 0; i < height; i++ )
for ( j = 0; j < width; j++ )
{
texture[i][j] = (unsigned char *)calloc(3,sizeof(unsigned char ));
if (texture[i][j] == NULL) exit (1);
}
*/


/////////////////////// ESSAI C++ //////////////////////////

texture = new unsigned char **[height];

for ( i=0; i<height; i++)
texture[i] = new unsigned char *[width];

for ( i=0; i<height; i++ )
for ( j=0; j<width; j++ )
texture[i][j] = new unsigned char [3];

////////////////////////// FIN //////////////////////
lundi 13 septembre 2004 à 08:36:55 | Re : Allocation dynamique 3 dimensions

djl

qu'est ce que tu veux faire avec un tableau de pointeur de pointeur... ?

ce qui compte c'est comment doivent etre ordonnées les données en memoire

pour preserver la contiguite des elements, alloue un tableau de tableau

unsigned char (*texture)[3];

texture = new unsigned char [width*height][3];
...
lundi 13 septembre 2004 à 10:57:18 | Re : Allocation dynamique 3 dimensions

gilimcce

à terme j'ai besoin d'un tableau 3 dim....

unsigned char (**texture)[3];
texture = new unsigned char [height][width][3];

erreur à la compil :
cannot convert unsigned char (*)[((width-1) + 1)] to unsigned char (**)[3]


lundi 13 septembre 2004 à 11:26:11 | Re : Allocation dynamique 3 dimensions

gilimcce

aussi....

unsigned char (**texture)[3];

texture = new unsigned char *[height][3];
for ( i=0; i<height; i++)
texture[i] = new unsigned char [width][3];

erreur compil :
cannot convert unsigned char* (*)[3] to unsigned cahr (**)[3]
(c'est la 1ere allocation qui declenche cette erreur)
lundi 13 septembre 2004 à 18:53:34 | Re : Allocation dynamique 3 dimensions

djl

pas unsigned char (**texture)[3];

toujours unsigned char (*texture)[...][3]; si tu veux presever la contiguité des elements

ta compris pourquoi le type d'allocation que tu fais dans ton 1er post fou tou en l'air ?

pour allouer un tableau a n dimension dynamiquement, seul la premiere doit etre inconnu (non resolu a la compilation)

dans ton cas, la largeur et la hauteur son inconnu, tu es donc obliger de faire

unsigned char (*texture)[3];

texture = new unsigned char [width*height][3];

// pour acceder a l'element [i][j][0] par exemple

for(size_t i = 0; i < height; i ++ )
for(size_t j = 0; j < width; j ++ )
texture[ i * width + j ][0] = ...


// pour liberer
delete[] texture;
mardi 14 septembre 2004 à 11:49:05 | Re : Allocation dynamique 3 dimensions

gilimcce

Le souci est qu'une de mes fonctions sous OpenGL recquiert un tableau 3D en paramètre :

gluBuild2DMipmaps(...,texture)

Si j'imprime le contenu de texture alloué dans le dur [720][1440][3] et alloué dynamiquement comme ds le 1er post, j'obtiens exactement les mêmes valeurs aux mêmes cases. Peut-il ne pas y avoir contiguité quand même ?

En l'occurence, j'utilise gluBuil2DMipmaps au lieu de glTexImage2D car mon jpeg n'a pas de dimensions en puissance de 2. gluBuild2DMipmaps se charge de redimmensionner.

Voili voilou
mardi 14 septembre 2004 à 14:24:33 | Re : Allocation dynamique 3 dimensions

djl

Réponse acceptée !
gluBuild2DMipmaps attend pas un tableau de 3 dimension mais un pointeur sur un buffer contenant les donnée (sinon ausun interet fonctionnel et impossible de passer en parametre un tableau a n dimension si les n-1 dernieres dimension ne sont pas fixées), si ca marche avec un tableau 3 dimension c'est parce que les elements sont bien entendu contigue

"Peut-il ne pas y avoir contiguité quand même ?"

oui, reli un cours sur pointeur et tableau c'est important si tu veux pas te planter par la suite

tu vera comment sont ordonnée les element dans un tableau multidimensionnel (qui est en fait un tableau de tableau...) mais ca reste un zone contigue, la seul difference avec un tableau unidimensionnel c'est que tu peux indexer les elements sur plusieurs dimensions

pour l'allocation dynamique, tu as fais une erreur malheureusement classique en croyant pouvoir allouer un tableau 3d a partir d'un pointeur de pointeur de pointeur (***texture)

par exemple si tu voulais allouer dynamiquement un tableau 2d de 20*50 par exemple, tu aurais fais

int **tab;

tab = new int*[20];
for( unsigned i = 0; i < 20; i ++ ) tab[i] = new int[50];

seulement la les elements ne sont pas contigus car tu as d'abord allouer un tableau de 20 pointeur (int*), puis tu alloue pour chacun de ces pinteur une zone de 50 int qui est certe contigu, mais les zones ne le sont pas entre elle

d'ailleur pour acceder a un elements tu dois faire un double deferencement ce qui traduis bien le fais que les données sont eparpillée en memoire par segment de 50 elements

par exemple pour acceder a l'element , (5,6) tu ferais
tab[5][6] = 5;

mais c'est dans ce cas equivalent a
*(*(tab + 5) + 6) = 5;

==> double deferencement

comme je l'ai dis, la bonne facon d'allouer un tableau a n dimension si tu connais les n-1 derniere dimensions c'est

int (*tab)[50];

tab = new int[20][50];

et la aucun probleme

si tu ne connais pas toutes les dimensions, alors alloue un tableau unidimensionel et arrange toi pour l'indexer sur plusieurs dimensions (cf l'exemple de mon post precedent)


mardi 14 septembre 2004 à 16:27:18 | Re : Allocation dynamique 3 dimensions

gilimcce

Bon, si je te dis que ça marche...
Etonné ?

Dernière mise au point :
Lors de la déclaration et de la définition de ma fonction
"loadJpegImage" où texture est rempli puis
retourné au programme principal, j'ai une rreur à la compilation :

je déclare ma fonction en en-tete de cette façon :
unsigned char *[3] loadJpegImage(char *fichier);

et la défini ainsi :
unsigned char (*t)[3] loadJpegImage(char *fichier)
{
......
.......
}

J'imagine que c'est mal écrit....
Concernant la non contiguité, mon prof m'avait prévenu
qu'il y aurait un problème de ce genre avec mon allocation...

Merci de ne pas en etre resté là dans tes observations !



mardi 14 septembre 2004 à 16:39:56 | Re : Allocation dynamique 3 dimensions

gilimcce

En, fait, et pour etre plus clair :

"loadJpegImage" retourne texture
qui est un unsigned char (*)[3]

et si je declare et defini cette fonction :
unsigned char (*)[3] loadJpegImage(......)
{
...
...
}

j'ai une erreur à la compil
Je suis Sincèrement désolé.

mardi 14 septembre 2004 à 17:03:45 | Re : Allocation dynamique 3 dimensions

djl

en principe on retourne un pointeur sur le pemier element (multidimensionnel ou pas ca reste transparent)

unsigned char *loadJpegImage(...)
{

...
return (unsigned char *)texture;
}

theoriquement il y a une synthaxe pour ca, mais ce n'est pas necessiare

peut etre

(unsigned char *)[3] loadJpegImage(......) ?

sinon vasi a coup de typedef :)

typedef unsigned char *pPix [3];

pPix loadJpegImage(......);


mais globalement je pense pas que le prototype de ta fonction soit le design adequate, en principe quand on charge une texture (qqsoit le format de l'image) on recupere un pointeur sur les données, la largeur et la hauteur

moi je ferais


int loadJpegImage( char *buffer, size_t *width, size_t *height );

ou si tu prefere (mais ca reste strictement identique)

int loadJpegImage( unsigned char *buffer[3], size_t *width, size_t *height );


la valeur retour sert bien sur pour indiquer une eventuelle erreur

1 2

Cette discussion est classée dans : char, width, height, texture, unsigned


Répondre à ce message

Sujets en rapport avec ce message

Allocation Dynampique trois dimensions [ par gilimcce ] Bonsoir,J'alloue la mémoire d'un tableau contenant les pixels d'une image. Si je déclare classiquement mon tableau ( ex: image[512][1024][3] ) tout s OpenGL [ par bouba ] Bonjour, je souhaite dessiner avec OpenGL et afficher le résultat dans une image mais je ne veux pas du tout l'afficher dans une fenêtre, j'ai donc cr Probleme urgent [ par pozor16 ] Une image est composée d'un ensemble de points (des pixels) dont on peut fixer la couleur en donnant la valeur des 4 composantes qui composent une cou Problème de mapping après alloc dynamique [OGL] [ par gilimcce ] Désolé de remettre ce sujet, mais le suicide est proche....Si quelqu'un y comprend qq chose....Je suis revenu a quelque chose de basique :un pointeur pionteur [ par lilington ] Salut j'ai un petit problème avec l'allocation dinamique sur VC++ 6je cherche la correspondance entre "malloc" et "new"voilà la l'allocation que je ve Pointeur récalcitrant [ par asmanur ] Bonjour, j'ai des prob avec des pointeurs regardez le codevoid LoadMap(int** Data,char* path){FILE* f=fopen(path,"r+");int Width=getc(f)-50;//Pourquoi Pb affichage bmp envga c/asm [ par 030417 ] Bonjour à tous,Je suis en train d'essayer d'afficher un bmp en c avec asm sous dos en vga (13h) . j'utilise comme compilateur borland c++ 3.0, mais je Passage de paramètre (par référence / par valeur) [ par thiosyiasar ] Salut,Je début en cpp (je viens de vb et java) donc tout à apprendre des pointeurs.Bref j'ai le code suivantunsigned char *pBuffer = NULL;getBuffer(pB convertir un unsigned char en char [ par nej92 ] Je voudrais convertir un unsigned char en char ou un unsigned char * en char * .QQN peut il m aiderMerci Pointeurs et Desallocation [ par gilimcce ] Bonjour à tous....je declare une fonctionloadJpegImage(char *, unsigned char*, int*, int*)1e parametre : le chemin de l'image chargee2e //


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,265 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales