Peut-on initialiser les champs d'une structure?

Peut-on initialiser les champs d'une structure? - C++ - Programmation

Marsh Posté le 04-09-2002 à 19:46:05    

Par ex:
typedef struct
{int a=0;
 int b=1;
}x;
 
Ça marche?

Reply

Marsh Posté le 04-09-2002 à 19:46:05   

Reply

Marsh Posté le 05-09-2002 à 03:36:08    

Non, x est une forme, pas une valeur.
 
On peut initialiser à l'instanciation:

Code :
  1. x ox= {0,1};


 
Maintenant, si tu veux qu'à chaque fois que tu crée un x il soit automatiquement initialisé avec a=0,b=1...
...alors il est temps de passer au C++ qui dispose de constructeurs faits pour ça:

Code :
  1. struct x{
  2. int a;
  3. int b;
  4. x(){
  5.  a=b=0;
  6. }
  7. };


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 05-09-2002 à 11:10:48    

Ok merci! :hello:  

Reply

Marsh Posté le 05-09-2002 à 11:17:28    

Musaran a écrit a écrit :

Non, x est une forme, pas une valeur.
 
On peut initialiser à l'instanciation:

Code :
  1. x ox= {0,1};


 
Maintenant, si tu veux qu'à chaque fois que tu crée un x il soit automatiquement initialisé avec a=0,b=1...
...alors il est temps de passer au C++ qui dispose de constructeurs faits pour ça:

Code :
  1. struct x{
  2. int a;
  3. int b;
  4. x(){
  5.  a=b=0;
  6. }
  7. };






 
Fondamentalement y a t-il une différence entre struct et class, faite par le complo C++ ?


---------------
"If you can walk away from a landing, it's a good landing. If you use the airplane the next day, it's an outstanding landing." - Chuck Yeager. | Chaîne YT | Photos
Reply

Marsh Posté le 05-09-2002 à 12:29:52    

toxin> ça doit être une histoire d'encapsulation...
 
Sinon j'ai une autre question.
J'ai toujours ma structure X:
typedef struct  
{int a;  
int b;  
}x;  
 
Et je veux savoir si on peut comparer deux instances de X:
X toto;
X titi;
toto.a=1;
toto.b=2;
titi.a=0;
titi.b=5;
Est-ce qu'on peut faire:
if (toto==titi) {...} :??:


---------------
Découvrez la version 2005 du  Site des Mains!! C'est la même qu'en 2004!
Reply

Marsh Posté le 05-09-2002 à 12:35:49    

heffer a écrit a écrit :

toxin> ça doit être une histoire d'encapsulation...




 
par défaut (si on spécifie rien) c'est private dans une classe et public dans une structure, non ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-09-2002 à 12:36:12    

heffer a écrit a écrit :

 
Est-ce qu'on peut faire:
if (toto==titi) {...} :??:  




 
si tu redéfinis l'opérateur ==, oui
sinon, non


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-09-2002 à 12:37:28    

antp a écrit a écrit :

 
 
si tu redéfinis l'opérateur ==, oui
sinon, non




 
Ok mais là je travaille en C donc je ne peux pas le redéfinir si?


---------------
Découvrez la version 2005 du  Site des Mains!! C'est la même qu'en 2004!
Reply

Marsh Posté le 05-09-2002 à 12:41:00    

je pense pas, en effet :/


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-09-2002 à 13:02:15    

J'ai encore une autre question (j'ai l'impression d'avoir tout oublié).
Si je veux modifier mon toto, est-ce qu'il vaut mieux passer le pointeur de toto en argument ou retourner un autre X:
 
void modifier (X* toto)
{toto->a=54;}
 
ou
 
X modifier (X toto)
{X temp;
 temp=toto;
 temp.a=54;
 return temp;
}
 :??:  
 


---------------
Découvrez la version 2005 du  Site des Mains!! C'est la même qu'en 2004!
Reply

Marsh Posté le 05-09-2002 à 13:02:15   

Reply

Marsh Posté le 05-09-2002 à 13:32:48    

heffer a écrit a écrit :

 
 
Ok mais là je travaille en C donc je ne peux pas le redéfinir si?




Y'a une solution dite à l'arrache :
Ca marche tres bien pour ton exemple !!!
 

Code :
  1. TToto a;
  2. TToto b;
  3. [...]
  4. if (memcmp(a, b, sizeof(TToto) == 0)
  5. {
  6. }


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 05-09-2002 à 13:38:05    

heffer a écrit a écrit :

J'ai encore une autre question (j'ai l'impression d'avoir tout oublié).
Si je veux modifier mon toto, est-ce qu'il vaut mieux passer le pointeur de toto en argument ou retourner un autre X:
 
void modifier (X* toto)
{toto->a=54;}
 
ou
 
X modifier (X toto)
{X temp;
 temp=toto;
 temp.a=54;
 return temp;
}
 :??:  
 




 
Moi dans ce cas là je passe un pointeur sur l'instance de toto en parmetre dans le cas ou je veux modifier les champs. ET je retourne l'etat de l'operation : OK ou ERREUR.
 

Code :
  1. TToto a;
  2. int initialise(void* toto, taille)
  3. {
  4. if (toto == NULL) return ERREUR;
  5. if (taille < 1) return ERREUR;
  6. memset(toto,0, taille);
  7. return OK;
  8. }
  9. if (initialise(&a, sizeof(TToto)) != OK)
  10. {
  11.   fprintf(stderr, ""Y'a une couille.\n" );
  12.   return ou exit ...
  13. }


 


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 06-09-2002 à 02:45:28    

Toxin a écrit a écrit :

Fondamentalement y a t-il une différence entre struct et class, faite par le complo C++ ?


A part l'histoire du public/private par défaut, C++ ne fait aucune différence entre struct et class.
 

heffer a écrit a écrit :

Et je veux savoir si on peut comparer deux instances de X


Suffisait d'essayer... non, ça marche pas.
On peut faire:

Code :
  1. if( memcmp(&toto,&titi,sizeof(X)== 0) /*identiques*/;

Mais si il y a des trous dans la structure à cause d'alignements, ce n'est pas garanti.
Reste alors une macro:

Code :
  1. #define Xequal(x1,x2) ( (x1).a==(x2).a && (x1).b==(x2).b )


T'as pas envie de passer au C++ où c'est possible ?
 
 

Citation :

Si je veux modifier mon toto, est-ce qu'il vaut mieux passer le pointeur de toto en argument ou retourner un autre X:

Si toto est gros, il est plus rapide de passer par adresse.
Si toto a beaucoup de membres à modifier, il est plus rapide de passer/renvoyer par valeur.
Si la fonction doit servir dans des expressions, il vaut mieux renvoyer par valeur.
Perso, je préfères par adresse (référence en C++).


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 09-09-2002 à 22:14:12    

Musaran a écrit a écrit :

Non, x est une forme, pas une valeur.
 
On peut initialiser à l'instanciation:

Code :
  1. x ox= {0,1};


 
Maintenant, si tu veux qu'à chaque fois que tu crée un x il soit automatiquement initialisé avec a=0,b=1...
...alors il est temps de passer au C++ qui dispose de constructeurs faits pour ça:

Code :
  1. struct x{
  2. int a;
  3. int b;
  4. x(){
  5.  a=b=0;
  6. }
  7. };






 
Pour les gens qui ont fait plus de 2 heures de C++ dans leur vie, ils peuvent mettre x() : a(0), b(1) {}
c'est beaucoup plus elegant, et ca évite d'initialiser 2 fois la valeur.
 
edit : et en passant, a=b=0 c'est pas terrible non plus, c'est même carrément cochon.


Message édité par Profil supprimé le 09-09-2002 à 22:16:00
Reply

Marsh Posté le 10-09-2002 à 05:30:50    

Je connais...
Je voulais pas l'effrayer avec un truc incompréhensible :D.
a=b=0, c'est juste la flemme qui m'a pris comme ça...


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 22-11-2009 à 20:28:52    

comment peut on initialiser une tableau de structure en C
par exemple  
struct text  
{char id[20];
 char pw[20];
};
typdef struct text;
text tableau[100];

Reply

Marsh Posté le 22-11-2009 à 21:33:05    

text tableau[100] = { {"lol","rofl"}, .... , {"test","test} };

Reply

Marsh Posté le 23-11-2009 à 22:54:20    

le strcmpr dans le langage C rutern soit 0 ,1ou bien -1 .dans ce cas
j'ai apple la fonction strcmpr(tableau.id[0],"add" ); il me retourne 1  
 
sachant que tablea.id est initialise :strcpy(tableau.id,"add" );
 
==> normalement la fonction strcmpr doit retouner comme valeur "0"
 
et c'est l'errur que j'arrive pas à trouveeeeeeer
                                                                    merci  

Reply

Marsh Posté le 25-11-2009 à 12:11:54    

poste le code qui pose problème directement


---------------
last.fm
Reply

Marsh Posté le 26-11-2009 à 20:18:40    

merci j'ai trouvee l'erreur

Reply

Marsh Posté le 27-11-2009 à 01:01:22    

je veux savoir les fonction predefinie du langage C qui permet de bloquer l'instruction pour une moment  
                         et merciiiiiiii

Reply

Marsh Posté le 27-11-2009 à 10:42:54    

kamola a écrit :

je veux savoir les fonction predefinie du langage C qui permet de bloquer l'instruction pour une moment  
                         et merciiiiiiii


 
et en décrypté, tu veux savoir quoi ? [:pingouino]


---------------
last.fm
Reply

Marsh Posté le 27-11-2009 à 13:07:15    

des fonction comme le getch() par exemple qui bloque l'instruction  
par exemple si dans un programme on veut ploquer une instruction pour 2 min comment faire

Reply

Marsh Posté le 27-11-2009 à 14:09:09    

si tu veux faire de la temporisation aussi grande, tu demandes à ton os de te mettre en attente (sleep, wait ou autre suivant quelle API tu dois utiliser, ca va varier) comme ca, tu ne consommes pas de ressources inutilement
 
j'ai comme l'impression que tu es sous du windows, donc ce qu'il te faut se trouve là : http://msdn.microsoft.com/en-us/li [...] S.85).aspx
 
Sinon, regarde du côté de la doc des threads posix


---------------
last.fm
Reply

Marsh Posté le 16-12-2009 à 19:39:52    

salam 3alikom  
  les fonctions de la bibliotheque<dos.h> ne marchent sur le dev C++ pk et comment faire pour les etuliser  
  et marci bcp

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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