[C] Remplissage -Résolu-

Remplissage -Résolu- [C] - C - Programmation

Marsh Posté le 14-11-2006 à 18:05:46    

Alors admettons que j'ai cette structure suivante :

Code :
  1. typedef struct pers {
  2. int age;
  3. char prenom[30];
  4. }t_pers;


 
Pour remplir une entité t_pers, on peut le faire de deux façons :

Code :
  1. int main() {
  2. t_pers jp = {456,"Jean-Paul"};


Ou de cette façon :

Code :
  1. int main() {
  2. t_pers jp;
  3. ...
  4. ...
  5. jp.age = 456;
  6. strcpy(jp.prenom, "Jean-Pierre" );


 
On est d'accord ? [:autobot]
 
MAIS admettons que ma structure se complique (disons 5 paramètres, des GtkWidget par exemple), et ADMETTONS que je fasse un tableau de structures de t_pers de 15 cases... Selon la 2è façon, il faudrait que je fasse 15 cases * 5 paramètres = 75 lignes de code ? (sachant toutes les informations sont toutes différentes les unes des autres : pas de boucle possible).
 
Bien entendu que non, je souhaite éviter cette méthode. Mais le 1er exemple a l'air plus intéressant... Problème : cette manipulation (avec les accolades) ne marche qu'à l'initialisation des variables. Donc ma question est : comment remplir une entité de structure de plusieurs paramètres en une seule fois (dans le même esprit que la 1ère façon) ?
 
N.B. : Je sais qu'on peut créer une fonction qui, en envoyant les données à insérer en paramètre, irait remplir chaque case du tableau. Mais j'aimerais savoir s'il existe une manip' pour éviter cela. Merciiiiiiiiiiiiiiiiiii !  [:petrus jar]

Message cité 2 fois
Message édité par Siluro le 14-11-2006 à 21:53:05
Reply

Marsh Posté le 14-11-2006 à 18:05:46   

Reply

Marsh Posté le 14-11-2006 à 18:18:57    

Siluro a écrit :

Alors admettons que j'ai cette structure suivante :

Code :
  1. struct pers {
  2. char nom[30];
  3. char prenom[30];
  4. }t_pers;


 
Pour remplir une entité t_pers, on peut le faire de deux façons :

Code :
  1. int main() {
  2. t_pers jp = {"2 le retour","Jean-Paul"};


Ou de cette façon :

Code :
  1. int main() {
  2. t_pers jp;
  3. ...
  4. ...
  5. jp.nom = "2 le retour";
  6. jp.prenom = "Jean-Paul";


 
On est d'accord ?


 [:arrakys]  
Non. Pour copier des chaines, on utilise strcpy().


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-11-2006 à 18:26:30    

Ah oui désolé, c'est la mauvaise habitude. Je modifie.

Reply

Marsh Posté le 14-11-2006 à 19:51:38    

Siluro a écrit :

Problème : cette manipulation (avec les accolades) ne marche qu'à l'initialisation des variables


Et encore, avec ta structure initiale, même l'initialisation avec des accolades ne marchera pas
Ex:

typedef struct {
    int age;  
    char prenom[30];
}t_pers;  
 
int main()
{
    static t_pers tabStarAc[]={
        {21, "Pierre Jean-Pierre"},
        {19, "Jean Tchang"},
        {19, "Megane"},
        {18, "Yaris"},
        {23, "Vulva"}
    };
}


Le problème c'est que chaque chaîne écrite en "dur" n'est qu'un pointeur vers une zone statique de la mémoire et l'initialisation ne fera que copier ce pointeur dans "tabStarAc".
Pour que ça marche, il faudra que ta structure soit définie ainsi

typedef struct {
    int age;  
    char *prenom;
}t_pers;


 

Siluro a écrit :

... sachant toutes les informations sont toutes différentes les unes des autres : pas de boucle possible....


Si. Tu peux très bien, à partir de mon initialisation, faire une boucle qui copiera chaque membre de "tabStarAc[i]" dans une variable bien à toi...


Message édité par Sve@r le 14-11-2006 à 19:58:10

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 14-11-2006 à 20:51:13    

l'affectation par accolade hors initialisation a été ajouté en C99 il me semble :
 
typedef struct {  
    int age;    
    char prenom[30];  
}t_pers;  
 
t_pers t;
...
t = (t_pers){ 42, "zozo" };
 
un truc dans le genre...

Reply

Marsh Posté le 14-11-2006 à 21:12:49    

ooooo jesus
je viens de tester sans réfléchir ton cast. ça fonctionne ! merci
je vais quand même aller regarder ton information dans C99.
Merci à tous, ça va beaucoup m'aider ça !! :hello:

Reply

Sujets relatifs:

Leave a Replay

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