Besoin d'aide en C pur

Besoin d'aide en C pur - C - Programmation

Marsh Posté le 11-11-2006 à 18:31:55    

Bonjour,   :)  
 
je voudrais avoir une petite aide en C pur.
 
Je voudrais savoir s'il est possible (et comment) récuperer une instance de structure à partir d'une méthode lancée par cette instance.
 
Par exemple :  
 
Dans serveurmain.c :

Code :
  1. int main()
  2. {
  3. User *personne= New_User();
  4. personne->setUsername("moi" );
  5. return 0
  6. }


 
Dans serveur.h :
 

Code :
  1. typedef struct{
  2.  void(*setUsername)(char *[]);
  3.  char nomU[20];
  4.  char passU[20];
  5. } User;
  6. void setUsername(char *[]);


 
Dans serveur.c :
 

Code :
  1. void setUsername(char *String[])
  2. {
  3. strcpy( /*recupere personne*/ ->nomU,*String);
  4. }


 
En gros, qu'est ce que j'écris plus haut pour récupérer personne ?
 
J'espère ne pas avoir eu de mal à exprimer mon souci.
Merci d'avance pour les réponses... :)

Message cité 1 fois
Message édité par HomerJK le 11-11-2006 à 18:50:37
Reply

Marsh Posté le 11-11-2006 à 18:31:55   

Reply

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

HomerJK a écrit :


Je voudrais savoir s'il est possible (et comment) récuperer une instance de structure à partir d'une méthode lancée par cette instance.


C'est pas très 'C pur' comme façon de parler. Tu as trop fait de C++... Il n'y a pas de this implicite en C. Il faut être explicite et passer un paramètre.  

Code :
  1. void setUsername (User * this, char *String[])
  2. {
  3.    strcpy (this->nomU, *String);
  4. }


Si on est dans le cadre d'une application générique, le paramètre est de type void * et il sert à initialiser localement un pointeur du bon type.
 
D'autre part, il est inutile de créer un pointeur de fonction pour la "méthode". Ca ne sert à rien.
 

Code :
  1. typedef struct
  2. {
  3.    char nomU[20];
  4.    char passU[20];
  5. }
  6. User;
  7. void setUsername (User * self, char *[]);


 
L'appel se fait donc ainsi :  

Code :
  1. int main (void)
  2. {
  3.    User *personne = New_User ();
  4.    if (personne != NULL)
  5.    {
  6.       setUsername (personne, "moi" );
  7.       /* quand c'est termine : */
  8.       Delete_User (personne), personne = NULL;
  9.    }
  10.    return 0;
  11. }


Message édité par Emmanuel Delahaye le 11-11-2006 à 19:04:25

---------------
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 11-11-2006 à 18:59:27    

Merci pour la réponse.
 
Je n'ai pas très bien compris cette phrase : "Si on est dans le cadre d'une application générique, le paramètre est de type void * et il sert à initialiser localement un pointeur du bon type."
 
Sinon j'ai essayé de passer en paramètre cette meme instance, mais j'ai eu un problème lors de l'execution, une erreur de segmentation.
J'ai fait comme ceci :

Code :
  1. int main()
  2. {
  3. User *personne= New_User();
  4. personne->setUsername("moi", personne);
  5. return 0;
  6. }


 

Code :
  1. void setUsername(char *String[],*User Client)
  2. {
  3. strcpy(Client->nomU,*String);
  4. }

Reply

Marsh Posté le 11-11-2006 à 19:06:55    

HomerJK a écrit :

Je n'ai pas très bien compris cette phrase : "Si on est dans le cadre d'une application générique, le paramètre est de type void * et il sert à initialiser localement un pointeur du bon type."


C'est  normal. C'est un peu 'advanced'... Quand le problème se posera, on en reparlera.

Citation :


Sinon j'ai essayé de passer en paramètre cette meme instance, mais j'ai eu un problème lors de l'execution, une erreur de segmentation.

Marche pas. Regarde ma correction au-dessus.
 
Un peu de lecture...
http://mapage.noos.fr/emdel/tad.htm
http://mapage.noos.fr/emdel/complog.htm
 
Après ça, tu laisses tomber cette usine à gaz qu'est le C++...

Message cité 1 fois
Message édité par Emmanuel Delahaye le 11-11-2006 à 19:09:06

---------------
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 11-11-2006 à 19:22:21    

Emmanuel Delahaye a écrit :


Après ça, tu laisses tomber cette usine à gaz qu'est le C++...


 
Ca trolle un peu là non ? ;)
 
Sinon, je remarque la ligne 9 du code que tu as montré en exemple :  
 

Code :
  1. Delete_User (personne), personne = NULL;


 
Je ne connais pas cette syntaxe (deux instructions séparées par une virgule). Il y a une règle/limitation à ça ?

Reply

Marsh Posté le 11-11-2006 à 19:38:36    

Merci pour la réponse, en fait je voulais faire en sorte que la syntaxe ressemble à du C orienté/objet le plus possible ;
 
Par exemple

Code :
  1. personne->setUsername("moi" );

au lieu de

Code :
  1. setUsername (personne, "moi" );


 
Je crois que je vais laisser tomber ce que je voulais faire.
 
Merci pour ton aide :)
 

Reply

Marsh Posté le 11-11-2006 à 20:32:17    

c0wb0y a écrit :

Ca trolle un peu là non ? ;)


Sur le forum C, dire du mal de C++, c'est Bien.

Code :
  1. Delete_User (personne), personne = NULL;


Citation :

Je ne connais pas cette syntaxe (deux instructions séparées par une virgule). Il y a une règle/limitation à ça ?

comma operator. Rien de nouveau. C'est dans ton K&R. L'exécution se fait de gauche à droite.
 
Le but ici est de rendre visuellement insécable les 2 instructions (celui qui veux insérer quelque chose entre les deux doit être bien courageux...). De plus, ça résiste à l'indentation automatique.


---------------
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 11-11-2006 à 20:34:00    

HomerJK a écrit :

Merci pour la réponse, en fait je voulais faire en sorte que la syntaxe ressemble à du C orienté/objet le plus possible ;
 
Par exemple

Code :
  1. personne->setUsername("moi" );

au lieu de

Code :
  1. setUsername (personne, "moi" );


 
Je crois que je vais laisser tomber ce que je voulais faire.
 
Merci pour ton aide :)


Ben non, c'est pas possible. Au mieux, tu auras :

Code :
  1. personne->setUsername (personne, "moi" );

Ce qui est parfaitement inutile et ralenti l'exécution...
 
 


---------------
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 11-11-2006 à 21:00:40    

Emmanuel Delahaye a écrit :

Ben non, c'est pas possible. Au mieux, tu auras :

Code :
  1. personne->setUsername (personne, "moi" );

Ce qui est parfaitement inutile et ralenti l'exécution...


 
Justement, quand j'essaye d'utiliser cette instruction, j'ai une erreur de segmentation.
Après m'être renseigné sur cette erreur, je sais qu'elle survient quand on tente d'accéder à un emplacement mémoire non alloué.
 
Pourtant, je pense bien avoir fait l'allocation mémoire non ?

Code :
  1. User* New_User()
  2. {
  3. User *This = malloc(sizeof(User));
  4.        /*if(!This) return NULL;*/
  5.        User_Init(This);
  6.        return This;
  7. }
  8. void User_Init(User *This)
  9. {
  10. strcpy(This->nomU,"default" );
  11. strcpy(This->passU,"default" );
  12. }

Reply

Marsh Posté le 11-11-2006 à 22:00:58    

HomerJK a écrit :

Justement, quand j'essaye d'utiliser cette instruction, j'ai une erreur de segmentation.
Après m'être renseigné sur cette erreur, je sais qu'elle survient quand on tente d'accéder à un emplacement mémoire non alloué.
 
Pourtant, je pense bien avoir fait l'allocation mémoire non ?


et personne->setUsername qui l'a initialisé ?


---------------
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 11-11-2006 à 22:00:58   

Reply

Marsh Posté le 11-11-2006 à 22:25:11    

C'est bon j'ai réglé mon problème.
Merci Emmanuel Delahaye :)

Reply

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

c0wb0y a écrit :

Je ne connais pas cette syntaxe (deux instructions séparées par une virgule).


T'as jamais utilisé de virgule en C ???
printf("%s", ...) :D


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

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

Sujets relatifs:

Leave a Replay

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