Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1396 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Besoin d'aide en C pur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Besoin d'aide en C pur

n°1473972
HomerJK
Posté le 11-11-2006 à 18:31:55  profilanswer
 

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
mood
Publicité
Posté le 11-11-2006 à 18:31:55  profilanswer
 

n°1473977
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-11-2006 à 18:46:18  profilanswer
 

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/
n°1473981
HomerJK
Posté le 11-11-2006 à 18:59:27  profilanswer
 

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. }

n°1473982
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-11-2006 à 19:06:55  profilanswer
 

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/
n°1473989
c0wb0y
:d
Posté le 11-11-2006 à 19:22:21  profilanswer
 

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 ?

n°1473994
HomerJK
Posté le 11-11-2006 à 19:38:36  profilanswer
 

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 :)
 

n°1474002
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-11-2006 à 20:32:17  profilanswer
 

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/
n°1474003
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-11-2006 à 20:34:00  profilanswer
 

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/
n°1474012
HomerJK
Posté le 11-11-2006 à 21:00:40  profilanswer
 

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. }

n°1474023
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-11-2006 à 22:00:58  profilanswer
 

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/
mood
Publicité
Posté le 11-11-2006 à 22:00:58  profilanswer
 

n°1474033
HomerJK
Posté le 11-11-2006 à 22:25:11  profilanswer
 

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

n°1475245
Sve@r
Posté le 14-11-2006 à 14:57:55  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Besoin d'aide en C pur

 

Sujets relatifs
[php] Aide pour implanter un sondage![résolu] Besoin d'aide pour écrire une requête SQL compliquée
aide en c # sur une erreur CS01117Besoin d'une petite requette SQL
Aide En C++ Suite De Conway (Urgent!!!)Aide HTML
aide en c : ds1621Aide programme C++
aide pour un programme en c++ 
Plus de sujets relatifs à : Besoin d'aide en C pur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR