2010-06-09 5 views
1

J'ai un tableau de GLuint avec une taille fixe:Objective-C: comment allouer tableau de GLuint

GLuint textures[10]; 

Maintenant je dois définir dynamiquement une taille de tableau. J'ai écrit quelque chose comme ceci:

* .h:

GLuint *textures; 

* .m:

textures = malloc(N * sizeof(GLuint)); 

N - taille nécessaire.

Ensuite, utilisé comme ceci:

glGenTextures(N, &textures[0]); 
// load texture from image 

-(GLuint)getTexture:(int)index{ 
    return textures[index]; 
} 

J'ai utilisé la réponse de here, mais le programme est tombé dans l'exécution. Comment régler ceci? Le programme est écrit sur Objective-C et utilise OpenGL ES.

+0

Que voulez-vous dire par "échouer"? – kennytm

+0

cessé de travailler, a écrit: "Exécuter passer 'Combiner des instructions redondantes' sur la fonction '@ glvmInterpretFPTransformFour9'". Fixé en question. – sashaeve

+0

postez votre source s'il vous plaît –

Répondre

1

J'ai trouvé ce problème.

Ce code est valide mais ne semble pas fonctionner. Ce problème est décrit here, mais ce n'est pas si clair.

La solution qui fonctionne pour moi est de créer une catégorie distincte à la propriété GLuint:

@interface Texture : NSObject 
    GLuint texture; 
@end 

@property (nonatomic, readwrite) GLuint texture; 

Ensuite, nous pouvons créer des textures NSMutableArray:

NSMutableArray *textures; 

Dans le fichier * .m nous devrions remplir notre tableau:

for(int i=0;i<N;i++){ 
    Texture *t = [[Texture alloc] init]; 
    t.texture = i; 
    GLuint l = t.texture; 
    [textures addObject:t]; 
    glGenTextures(1, &l); 
} 

Si vous utilisez d'autres tableaux avec des textures, vous devez déplacer GLui nt indexes, par exemple:

t.texture = i+M; 

où M - taille du tableau utilisé précédemment de GLuint.

Alors getTexture sera réécrite comme suit:

-(GLuint)getTexture:(int)index{ 
    return textures[index].texture; 
} 

Je ne suis pas heureux avec cette approche mais il est un simple je fais le travail.

0

Si vous définissez la valeur de N sur 10, le comportement des deux méthodes sera identique. Vous devriez donc chercher la raison de l'échec dans différents endroits.

0

void glGenTextures (GLsizei, textures GLuint *);

accepte un tableau de ints non signés, et il semble que vous passez un pointeur vers le premier élément du tableau, que je pense est pas ce que vous voulez faire ou ce que la fonction accepte

peut-être juste essayer

glGenTextures (N, textures);

+0

Merci pour suggestion, mais le comportement de ce code est égal à fourni. – sashaeve

Questions connexes