2010-12-13 4 views
0

Salut Je ne suis pas un programmeur C/C++ "natif". Je suis capable d'écrire des choses de base et de faire un codage qui est commun à d'autres langues. Mais j'ai ce problème et je ne sais même pas comment demander autre chose que de l'expliquer (donc la recherche google ne me va pas).Affectation d'un tableau de tableaux en C/C++

J'ai dans mon code

typedef float point3[3]; 

Et maintenant, je suis initilizing un tas de points en 3D (x, y, z) par ceci:

point3 cpoint = {computeX(u,v),computeY(u,v)-5,computeZ(u,v)}; 

Quelles sont les fonctions et les valeurs de u et v sont sans rapport avec ma question (mais je peux fournir un code si demandé).

Maintenant, je veux déclarer un tableau (unidimensionnel) de point3. Donc quand j'appelle array [0] j'obtiendrai une variable de type point3. Comment je peux faire ça?

EDIT:

J'ai fourni des informations insuffisantes. Ma faute. Je dois retenir: typedef float point3 [3]; parce que j'utilise OpenGL avec GLUT et en utilisant cette fonction glVertex3fv (cpoint); où cpoint est le type point3. Donc je suis sûr que je ne peux pas utiliser struct.

+1

Vous pouvez fournir un cast ou une conversion d'un struct à un float * que vous passez ensuite à la fonction ... En outre, il n'existe pas de "C/C++". Ce sont des langues différentes, et bien qu'il soit possible d'écrire des choses qui se compileraient, vous vous tirez dans le pied en essayant de le faire. Choisissez en un et gardez le. C++ fournit de nombreux outils utiles que vous vous refusez. –

Répondre

0

Je voudrais élargir la réponse de Robin Welch d'une manière qui permet de rester compatible avec le typedef point3:

typedef float point3[3]; 


struct Point 
{ 
    Point(float x, float y, float z) 
    : x_(values_[0]), y_(values_[1]), z_(values_[2]) 
    { 
     values_[0] = x; 
     values_[1] = y; 
     values_[2] = z; 
    } 

    float& x_; 
    float& y_; 
    float& z_; 
    point3 values_; 

    operator const point3&() const { return values_; } 
    operator point3&() { return values_; } 
}; 

Maintenant vous pouvez simplement utiliser ce simple struct, et le transmettre aux fonctions OpenGL tout comme si ce n'était pas cette structure du tout. Il contient le tableau original point3 pour OpenGL, mais un accès pratique et un constructeur pour vous-même.

2
point3 cpoint[2] = { 
    {computeX(a, b), computeY(a,b)-5, computeZ(a,b)}, 
    {computeX(c, d), computeY(c,d)-5, computeZ(c,d)} 
} 
+0

Si ce code est quelque chose comme ceci: test point3 [2]; point3 cpoint = {calculerX (u, v), calculerY (u, v) -5, calculerZ (u, v)}; point3 test [0] = cpoint ;?Si oui, cela ne fonctionne pas et c'est mon cas. – Ertai

+0

@Ertai: Vous devez distinguer entre l'initialisation et l'affectation. L'initialisation des tableaux est possible et devrait être faite, l'assignation dans son ensemble non. J'ai récemment écrit des choses autour de ce thème: https://gustedt.wordpress.com/2010/12/12/assignment-and-initialization/ –

+0

Ok, si fondamentalement mon problème est que je n'ai pas le bon opérateur d'affectation. Je pense que je pourrais utiliser une assignation Si je reçois mes pointeurs correctement ... le problème est que je ne sais pas comment faire cela, et l'apprentissage des pointeurs en C++ est un peu difficile à faire (et un peu exagéré pour les simples assigment que j'ai) juste pour assigner une valeur (tableau) à un tableau de valeurs. – Ertai

1

Au début, vous déclarer propriétaire point3 comme celui-ci

struct point3 
{ 
float x; 
float y; 
float z; 
}; 

puis déclarez votre tableau

point3 points[2] = {{calculateX(a1, b1), calculateY(a1, b1), calculateZ(a1, b1)},{calculateX(a2, b2), calculateY(a2, b2), calculateZ(a2, b2)}}; 
+0

J'ai fourni des informations insuffisantes. Ma faute. Je dois retenir: typedef float point3 [3]; parce que j'utilise OpenGL avec GLUT et en utilisant cette fonction glVertex3fv (cpoint); où cpoint est le type point3. Donc je suis sûr que je ne peux pas utiliser struct. – Ertai

+0

Avez-vous essayé? Pas si sûr si vous ne pouvez vraiment pas utiliser le pointeur sur struct. –

0

En C, je n'initialiser le tableau lors de la déclaration à moins que ce soit un petit tableau avec des valeurs constantes.

typedef float point3[3]; /* point is a type */ 
point3 *pp;    /* pp points to objects of type point3 */ 
point3 ap[NELEMS];  /* each (of NELEMS) element of ap is of type point3 */ 

pp = malloc(NELEMS * sizeof *pp); 
if (pp) { 
    /* use pp */ 
    pp[0][0] = computeX(); pp[0][1] = computeY(); pp[0][2] = computeZ(); 
    (*(pp+42))[0] = computeX(); (*(pp+42))[1] = computeY(); (*(pp+42))[2] = computeZ(); 
    free(pp); 
} 

ap[0][0] = computeX(); ap[0][1] = computeY(); ap[0][2] = computeZ(); 
+0

Je suppose que (* (pp + 42)) est comme tableau [42]? – Ertai

+0

Oui, même chose. Vous pouvez utiliser la syntaxe d'indice de tableau à la place. Je voulais juste montrer la syntaxe du pointeur. – pmg

+0

Cette ligne pp = malloc (NELEMS * sizeof * pp); dans mon code est comme ceci \t pp = malloc (N * N * sizeof * pp); où N est const int N = 20; Et j'ai "conversion invalide de 'void *' en 'float (*) [3]'" – Ertai

2

En supposant C++, serait la façon la plus simple de créer une classe pour encapsuler la structure de votre point, puis créer un vecteur de ce type:

struct Point 
{ 
    Point(float x, float y, float z) : x_(x), y_(y), z_(z) 
    float x_; 
    float y_; 
    float z_; 
}; 

typedef std::vector<Point> Points; 

Ensuite, vous pouvez créer une collection pour le stockage des points :

Points points; 

plus tard dans le code, une fois peuplée, vous pouvez accéder à l'aide:

Point a = points[ 3 ]; // for example 
+0

+1 pour le vecteur. Et struct. Mais la plupart du temps pour le vecteur :) – Default

+0

Pourrait vouloir jeter aussi comment ajouter au vecteur .. – Default

+1

J'ai fourni des informations insuffisantes. Ma faute. Je dois retenir: typedef float point3 [3]; parce que j'utilise OpenGL avec GLUT et en utilisant cette fonction glVertex3fv (cpoint); où cpoint est le type point3. Donc je suis sûr que je ne peux pas utiliser struct. – Ertai

Questions connexes