[C/C++] Pointeur sur tableau

Pointeur sur tableau [C/C++] - Programmation

Marsh Posté le 27-11-2001 à 18:09:39    

Voila, j'aimerait déclarer un pointeur sur un tableau et allouer de la place pour ce tableau via malloc
 
Alors au debut j'ai essayé
 
GLubyte *texture[64][64];
texture = ( GLubyte*[64][64] )(malloc(64*64*sizeof(GLubyte)));
 
Mais ca ca marche pas parce que au fait, texture est pas un pointeur sur tableau mais un tableau de pointeur ( apparemment )
 
alors j'ai essayé
 
GLubyte (*texure)[64][64];
... idem ...
 
Mais la marche pas non plus .... (erreur de cast)
 
Alors j'ai bien une solution qui marche mais je l'aime pas ( pas envie d'un typedef pour ca )
 
typedef GLubyte texdata[64][64];
texdata *texture;
texture = (texdata*)(malloc(sizeof(texdata)));
 
Personne ne sais comment faire sans typedef ???

Reply

Marsh Posté le 27-11-2001 à 18:09:39   

Reply

Marsh Posté le 27-11-2001 à 18:11:42    

GLubyte * tout simplement...
sinon regarde les slice arrays de la STL...

Reply

Marsh Posté le 27-11-2001 à 19:27:09    

Bon alors si j'ai bien compris ce que tu veux faire voilà comment faut le coder:
 
GLubyte  texture[64][64]; /*Le tableau*/
Glubyte *ptexture=texture;/*Pointeur sur le tableau, ici il pointe sur le début du tableau*/

Reply

Marsh Posté le 27-11-2001 à 19:36:24    

BENB : ah ? et je pourrait faire texture[x][y], il me chiera pas dessus ? je vais essayer desuite
 
LetoII :
Oaui mais la la memoire qui est alloué elle l'est par ton GLubyte texture[64][64]
 
moi au fait, j'ai mis malloc dans l'exemple mais elle sera alloué par wglAllocateMemoryNV qui me retourne aussi un void* mais lui il m'alloue de la memoire dans la memoire video ( ou AGP au choix )
 
Et je veut pouvoir faire

Reply

Marsh Posté le 27-11-2001 à 20:47:40    

246tNt a écrit a écrit :

BENB : ah ? et je pourrait faire texture[x][y], il me chiera pas dessus ? je vais essayer desuite
 
LetoII :
Oaui mais la la memoire qui est alloué elle l'est par ton GLubyte texture[64][64]
 
moi au fait, j'ai mis malloc dans l'exemple mais elle sera alloué par wglAllocateMemoryNV qui me retourne aussi un void* mais lui il m'alloue de la memoire dans la memoire video ( ou AGP au choix )
 
Et je veut pouvoir faire  




 
Ben falait le dire tout de suite tout ce que tu as à faire c:
 
GLubyte *texture=(GLubyte *)wglAllocateMemoryNV(arguments);

Reply

Marsh Posté le 27-11-2001 à 20:48:18    

BENB :
 
en le declarant GLubyte * texture, si je fait
 
texture[i][j] = 10; ca marche pas ...

Reply

Marsh Posté le 27-11-2001 à 20:53:28    

246tNt a écrit a écrit :

BENB :
 
en le declarant GLubyte * texture, si je fait
 
texture[i][j] = 10; ca marche pas ...  




 
tante: GLubyte [64][] texture;
 
si ça marche pas tu fait les accés à la main:
texture[i*(sizeof(GLubyte)*64)+j]

Reply

Marsh Posté le 27-11-2001 à 20:59:19    

Quand tu fais GLubyte *texture[64][64];, il est pas deja alloue en memoire ton tableau (qui est un tableau de tableaux de pointeurs sur GLubyte) ??

Reply

Marsh Posté le 27-11-2001 à 21:03:29    

bjbebert a écrit a écrit :

Quand tu fais GLubyte *texture[64][64];, il est pas deja alloue en memoire ton tableau (qui est un tableau de tableaux de pointeurs sur GLubyte) ??  




 
si mais je pense que si tu lui fait type tableau[64][] il n'alloue pas de mémoire car il ne connait pas la taille totale du tableau, mais il a besoin du 64 pour connaitre la taille des lignes

Reply

Marsh Posté le 27-11-2001 à 21:04:53    

Apres avoir relu la question (je vois pas tres bien ce que tu cherches a avoir), je dirais simplement :
 
GLubyte *texture;
texture = (GLubyte *)malloc(64*64 * sizeof(GLubyte));
 
Pour acceder :
texture[y * 64 + x];
 
Remplace le 64 par les constantes SIZE_X et SIZE_Y, ca fait pro :D

Reply

Marsh Posté le 27-11-2001 à 21:04:53   

Reply

Marsh Posté le 27-11-2001 à 21:07:01    

LetoII a écrit a écrit :

 
 
si mais je pense que si tu lui fait type tableau[64][] il n'alloue pas de mémoire car il ne connait pas la taille totale du tableau, mais il a besoin du 64 pour connaitre la taille des lignes  




 
Avec tableau[64][], je serais pas etonne s'il t'allouais un tableau de 64 pointeurs non initialises.
J'ai pas de compilo sous la main, dur de tester.

Reply

Marsh Posté le 27-11-2001 à 21:15:05    

bo alors c moi qui est di une bétise t'as pas le choix:
 
type *texture=(type *)malloc(sizeof(type)*64*64);
 
texture[i*64+j]=element;
ou alors tu te fait ta class qui encapsule ça

 

[edtdd]--Message édité par LetoII--[/edtdd]

Reply

Marsh Posté le 28-11-2001 à 00:04:21    

LetoII:  
 
Ben au fait j'aimerai eviter les acces a la main ... ( parce que mon vrai tableau a 3 dimension et ca me fait un peu chier parce que j'aimerait pouvoir faire
 
(*texture)[x][y] et qu'il me retourne un tableau de 4 byte ( en gros un vecteur couleur RGBA )
 
 
bjbebert:
 
a) GLubyte   (*texture)[64][64][4];
 
   Ca n'alloue pas de memoire ( avec le debugger j'ai bien que texture == NULL )
 
b) Ben ce que je cherche a faire c avoir un pointeur sur un tableau multidimensionnel et convertir un pointeur void vers un pointeur de ce type la. Parce que avec le compilateur C++ de Visual qui est pas tres tolérant ( il a raison ... ) c marche pas
 
Quand a SIZE_X et SIZE_Y, c fait ( ca s'appele TEX_HEIGHT et TEX_WIDTH en fait ) mais je voulait pas encombrer mon exemple ...
 
 
LetoII:
 
Je vais pas faire une classe rien que pour ca, alors je prend la methode typedef ... mais c enervant, ca me chiffone cette histoire

Reply

Marsh Posté le 28-11-2001 à 00:11:39    

C bon je viens de trouver ...
 
Declaration:
GLubyte (*texture)[TEX_HEIGHT][TEXT_WIDTH][4];
 
Allocation:
texture = (GLubyte (*)[64][64][4])( malloc( sizeof( GLubyte ) * TEX_WIDTH * TEX_HEIGHT * 4 ) );
 
Utilisation:
(*texture)[y][x][0...4] = ...  
 
.. Et ce qui foirait avant c tait pour l'allocation je mettait par l' * entre ()
et pour l'utilisation je faisait *texture[y][x][0...4] sans les () ...
 
Maintenant c nickel. Merci pour votre aide

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed