Initialisation de structure

Signaler
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008
-
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008
-
Salut,

J'ai une structure temps:
struct temps 
{
float time, elapsedTime, lastTime;
};


Je l'itinialise :
struct temps Time[2];


Donc ici, on pourras mettre Time[1] et Time[2].

Mais j'aimerais ne pas avoir à définir un nombre au départ car à l'initialisation je ne sais pas combien de structures temps j'aurai besoin.

Si je fais ça c'est bon ??? :
struct temps Time[];

82 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
struct temps Time[2];

alors index maxi sera 1 et non 2.

si tu ne sais pas le nbr max alors alloc dynamique par malloc par exemple.

ciao...
BruNews, MVP VC++
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
encore toi ? ;)

bon la je vois qu'on est exactement sur le meme pb.
perso j'ai fait 50 struct persos, 1000 struct batiments, 50 struct armes,....
ca marche mais il est édident que c'est loin d'etre optimisé ;)

je sé pas si ca marche mais vaudrait mieux faire un typedef devant ta def de struct, puis temps * Time;
la fudra allouer ta mem a chaque création d'un timer (dis c'est vraiment un timer que tu veux faire? je doute ;) )
Et ne pas oublier de 'freeer' la mem aussi... si toutefois c'est correct comme méthode :)
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
ouah ben brunews a répondu en meme tps que moi ;)
c'est juste ce que j'ai dit?
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Tient j'ai une question. Personnellement, je n'utilise que des classes. Point de vue optimisation, est-ce plus lent qu'une struct ?
Evidemment puisqu'il y a l'appelle du constructeur etc ... mais a part ca, l'acces au donné est le meme ?
Car je trouve la classe bien plus pratique que la struct, notament pour l'initialisation des données.
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
heu...c'et quoi la différence entre class et struct a part que pour class ya tout en public par éfaut?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
serait pas le contraire, class tout private par defaut ?

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
En effet tout en private dans une classe. Et puis la différence c'est que la classe n'existe pas en C.
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

Bizarre...

J'ai fais :
struct temps Time[2];

et j'utilise :
Time.lastTime[1]
et
Time.lastTime[2]
et ça marche ... pas de bugs.

Comment ça se fait ???

Ok je vais voir pour l'alloc dynamique.
Merci
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
3
En c++ il n'y a pas de structure, le mot clé struct désigne une classe dont l'accés aux attributs et l'héritage sont par défaut publique.

struct temps Time[2]; ce n'est pas une initialisation mais une instanciation.

Pour unitialiser une structure en C :

struct temps t = { 0.f, 0.f, 0.f };

la norme C99 autorise également
struct temps t {.lastTime 0.f };
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Time[1].lastTime et non Time.lastTime[1]
De plus si tu a acces a Time[0] et Time[1] (2 elements) et pas Time[2]
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

Excuse moi je me suis trompé, j'ai en effet mis :
Time[1].lastTime et Time[2].lastTime

Par contre je n'arrive pas à faire une alloc dynamique avec ça...

Pouvez vous m'aider SVP ???
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
vi j'mai planté ;)
mais si on fait temps *Time, comment on accede aux différents Time, avec Time[0],Time[1],... (apres avoir alloué la mem?)?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
int n = 100;
struct temps* Time= malloc(n * sizeof *Time);

Ensuite accès Time[0], Time[1]...
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
3
n doit être de type size_t, la fonction malloc prend un size_t en paramètre pour la taille en byte.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
La conversion de int en size_t est vite vue, il n'y a pas de perte de donnée.
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

J'ai fais ça :

int nb_ennemies;
struct temps* Time = malloc(nb_ennemies * sizeof *Time);

et ça me met cette erreur:
cannot convert from 'void *' to 'struct temps *
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
mets un cast

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Compile en C, ou bien fait un cast explicite:
struct temps* Time = (struct temps*)malloc(nb_ennemies * sizeof *Time);
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
Il n'y a pas d'erreur (et il ne faut pas de cast), en principe on compile du C avec un compilateur C.
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
pour le size_t, autant toujours utiliser ce type pour les taille, pour etre tranquille