2011-08-06 5 views
0

Venant d'un environnement Java, PHP, j'essaie d'entrer dans C++. Je voudrais stocker un tableau dans une structure. Mon problème est de spécifier la taille du tableau après l'initialisation de la structure.Tableau dans Struct, pointeurs [C++ Débutant]

Voici mon code pour le struct:

struct SpriteAnimation { 
    // ... 
    int parts;     // total number of animation-parts 
    unsigned int textures[]; // array to store all animation-parts 
    // ... 
}; 

Et ici pour la fonction principale:

SpriteAnimation bg_anim; 
bg_anim.parts = 3; 
unsigned int *myarray = new unsigned int[bg_anim.parts]; 
bg_anim.textures = myarray; 

Que dois-je changer pour résoudre ce problème?

Répondre

0
struct SpriteAnimation { 
    // ... 
    int parts;     // total number of animation-parts 
    unsigned int * textures; // array to store all animation-parts 
    // ... 
}; 

Vous pouvez utiliser la syntaxe type name[] que si vous déclarez en ligne membres.

+0

Est-il correct de l'utiliser ensuite avec 'bg_anim.textures = new unsigned int [bg_anim.parts];'? – Ben

+0

Que se passe-t-il lorsque vous copiez votre structure? Que se passe-t-il quand il y a une exception? –

+0

@Ben oui cela fonctionne correctement, en fait ce n'était pas correct avant, car la texture est un tableau alloué dynamiquement et devrait être montré comme un pointeur. Vous devez rechercher des classes si vous souhaitez utiliser C++ lorsque vous utilisez la syntaxe de style c. Rappelez-vous également de supprimer [] le tableau à la fin – Will03uk

9

Dans moderne C++, vous pouvez utiliser un conteneur dynamique pour la « matrice » intérieure:

struct SpriteAnimation { 
    std::vector<unsigned int> textures; // array to store all animation-parts 
    size_t num_parts() const { return textures.size(); } 
}; 

Ceci est bien plus sûr et plus modulaire que tout ce que vous pouvez essayer avec le stockage alloué manuellement. Utilisation:

SpriteAnimation x; 
x.textures.push_back(12); // add an element 
x.textures.push_back(18); // add another element 

SpriteAnimation y = x;  // make a copy 

std::cout << "We have " << x.num_textures() << " textures." std::endl; // report 
+2

Downvoter, souciez-vous d'expliquer votre objection? Je comprends que ce n'est pas la façon de faire les choses en C, mais la question demande une solution C++, et la façon idiomatique et morale de faire C++ est d'utiliser (exception-safe et gestion des ressources et simple responsabilité) les récipients en tant que blocs de construction. –

+0

Comment est-ce que cela connait la taille du tableau (ou 'vecteur' - pourriez-vous expliquer la différence, s'il vous plait)? Est-ce que 'push_back()' le redimensionne en en créant un nouveau chaque fois qu'il est appelé? Ce serait horriblement inefficace par rapport à la solution de John, ou est-ce que je me méprends quelque chose? – Ben

+1

@Ben: Expliquer le fonctionnement complet de 'vector' est au-delà de ce commentaire, mais faites-le [read it up] (http://www.cplusplus.com/reference/stl/vector/) - oui,' push_back' ne ajouter un nouvel élément, mais celui-ci est amorti O (1) grâce à la magie. En fait, la majeure partie de la bibliothèque standard C++ ne peut être décrite que comme telle. –

0

La taille d'une structure doit être connue au moment de la compilation.

+0

Il voulait utiliser un pointeur et le type unsigned int * est une taille statique – Will03uk

0

J'ai travaillé autour du problème à travers le code suivant.Il pourrait y avoir des problèmes de conception alors s'il vous plaît chercher le code suivant fonctionne pour moi.

#include <iostream> 
using namespace std; 
struct lol { 
    // ... 
    int parts;     // total number of animation-parts 
    unsigned int *texture; // array to store all animation-parts 
    // ... 
}; 

int main() { 
    // your code goes here 
    lol bg_anim; 
    bg_anim.parts = 3; 
    unsigned int *myarray = new unsigned int[bg_anim.parts]; 
    bg_anim.texture = myarray; 
    return 0; 
} 

Pardonne-moi pour l'utilisation lol au lieu de votre spécifiée name.Do me dire tout issues.And me aider s'il y a d'autres problèmes dans mon code. Merci! :)

+0

par la façon dont un 'struct' n'est rien d'autre qu'une classe avec tout public. Une meilleure solution aurait été d'utiliser des classes. –