Tom's Guide > Forum > Programmation > [Résolu] Questions sur le language C

[Résolu] Questions sur le language C

Forum Programmation : [Résolu] Questions sur le language C

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !

Lire la meilleure réponse, apportée par mcpherson.

Mot :    Pseudo :           
 

Bonsoir, alors comment je l'ai précisé dans le sujet, je me pose 2-3questions sur le language ".c".
Tout d'abord mon prof ma dit que quand je faisais appel a une fonction en tout début de mon programme, il fallait que le titre termine par ".h" et non par ".c" , quand je lui ai demander pourquoi il n'a pas était capable de me répondre! xd
Donc pourquoi utilisons nous le ".h" pour les définitions des programmes?
Ensuite donc j'ai créer une bibliotheque regroupant plusieurs bibliothèques qui appelles des fonctions et je voudrais savoir si mon ".h" peut s'exécuter automatiquement au début de mon programme sans que je l'appelle?
Sa doit pas être clair ce que je vous raconte, je vous envoie mon programme vous aller comprendre.

 

Programme:

 

#include <Pouyadoux.c>

 


/********************** P R O G R A M M E ***********************/

 

Initialisation();

 

void main()
{
start_progr(); // appel de la fonction start_prog

 

while(1)

 

{
progr_gen(); // appel de la fontion progr_gen
}

 


{
progr_enc(); // appel de la fonction progr_enc
}

}

 

// Voila donc le programme en question, maintenant je vous envoie le contenu de la bibliotheque "Pouyadoux.c"

 

#include <Initialisation.h>
#include <start_progr.c>
#include <progr_gen.c>
#include <progr_enc.c>

 

Voila et après chaque bibliothèque se rapporte à une partie précise de mon programme.
Mais je voulais savoir donc si dans mon programme principal j'avais besoin de rajouter " Initialisation();" ou si cette fonction s'exécuter automatiquement?

 

Merci d'avance pour votre aide, si quelque chose n'ai pas clair j'essaierais d'être le plus clair et le plus compréhensible possible à l'avenir !:)

 

Bonne soirée


Message édité par yoyohand le 03-06-2009 à 13:08:34
pour mieux t'expliquer j'ai sorti un de mes vieux serveur client, vola le code du client avec un .h et un .c.
le .h

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <errno.h>
  5. #include <netdb.h>
  6. #include <sys/types.h>
  7. #include <netinet/in.h>
  8. #include <sys/socket.h>
  9. #include <sys/stat.h>
  10. #include <fcntl.h>
  11. #include <string.h>
  12. #include <sys/ioctl.h>
  13. void creer_socket_client(const char *hostname, const int port);


tu vois il y a les inclusions et une déclaration de fonction et donc le .c

Code :
  1. #include "client.h"
  2. void creer_socket_client(const char *hostname, const int port)
  3. {
  4.     int socket_fd;
  5.     int port;     
  6.     struct sockaddr_in adr_socket; 
  7.     struct hostent *hostinfo;
  8.     char buf[20];
  9.     int perm=1;
  10.     if((socket_fd = socket(AF_INET, SOCK_DGRAM, 0) ) ==-1)
  11.             {
  12.                 perror("socket" );
  13.                 exit(errno);
  14.             }
  15.       /* initialisation de la structure */
  16.     adr_socket.sin_family = AF_INET;
  17.     adr_socket.sin_port = htons(port);
  18.     if ((hostinfo = gethostbyname(hostname)) == NULL)
  19.     {
  20.         perror("Hote inconnu" );
  21.         return;
  22.     }
  23.     /*demande de diffusion*/
  24.     if (setsockopt(socket_fd, SOL_SOCKET, SO_BROADCAST, (void *) &perm, sizeof(perm)) < 0)
  25.             {
  26.                 perror("setsockopt" );
  27.                 exit(errno);
  28.             }
  29.     /*pseudo connexion du client au serveur*/
  30.     if((connect(socket_fd, (struct sockaddr *)&adr_socket, sizeof(struct sockaddr_in))) == -1)
  31.     {
  32.         perror("Echec lors la de connexion au serveur, serveur inactif ou mauvais choix de port" );
  33.         return;
  34.     }
  35.  
  36.     /* envoi du message */
  37.     while(1)
  38.     {
  39.         sprintf(buf, "test %d", i);
  40.         usleep(200000);
  41.         if(write(socket_fd,buf,strlen(buf) == -1))
  42.         {
  43.             perror("write" );
  44.             return;
  45.         }
  46.         i++;
  47.        
  48.     }
  49. }


qui contient l'inclusion du .h et qui fais le corps de la fonction

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

J'ai pas tout compris lol
Mais je pense que ce texte issu du Site du Zero pourrait t'expliquer le .h et .c :

Citation :


Comme vous le voyez, il y a 2 types de fichiers différents sur la capture d'écran que je vous ai montrée :


Les .h : appelés fichiers headers. Ces fichiers contiennent les prototypes des fonctions.
Les .c : les fichiers sources. Ces fichiers contiennent les fonctions elles-mêmes.


En général, on met donc rarement les prototypes dans les fichiers .c comme on l'a fait tout à l'heure dans le main.c (sauf si votre programme est tout petit).

Pour chaque fichier .c, il y a son équivalent .h qui contient les prototypes des fonctions.
Rejetez un oeil à ma capture d'écran :


Il y a ia.c (le code des fonctions) et ia.h (les prototypes des fonctions)
Il y a affichage.c et affichage.h
etc.



Si tu veux plus de détail sur le C et visiblement en apprendre plus qu'avec ton prof (^^) je te conseil le Site du Zero qui est je trouve tres tres bien expliquer.

Bon courage pour la suite.

------------------------------ La parole est d'argent mais le silence est d'or
Répondre à DivX_666

salut, alors ton prof est vraiment une m...
tu pourrais faire un programme C avec seulement un fichier .c. Le .h te sert à organiser ton code, dedans tu y met les prototypes des fonctions que tu déclare dans les .c et tu y met aussi les structures, les inclusions genre #include <stdio.h>.
dans ton .c, au début tu dois inclure le .h par #include "tonfichier.h"
quand ton projet C devient un minimum important tu auras plusieurs .c et plusieurs .h et c'est un fichier Makefile qui permettra de faire le liens entre eux et de donner les instructions au compilateur.
donc en clair les .h comme leur petite lettre l'indique sont des headers, ils contiennent les déclarations, les .c contiennent le code proprement dit.

------------------------------ "Parlons moins codons plus"
Répondre à mcpherson

Dacord merci beaucoup j'ai compris comment utiliser soit un .h ou un .c ^^!
Oui mon prof n'ai pas très calé et quand on débute c'est pas toujours évident! xD
Je me sert du site du zéro quand je recherche des informations mais j'ai mal du rechercher car je n'avais pas trouver le passage, merci Divx_666.
Bon je ferme pas le topic, si j'ai d'autres questions je viendrais vous les poser :)!
Bonne journée =)

 

ps: A oui, encore une question, est ce que dans mon programme je dois rajouter la ligne " Initialisation();" pour appeler les prototypes de mes fonctions ou le fichier "Initialisation.h" inclus dans ma bibliothèque va s' exécuter tout seul?

 

Merci d'avance ==)


Message édité par yoyohand le 03-06-2009 à 13:10:59
Répondre à yoyohand

En théorie, on peut inclure un fichier .c, mais ce n'est à faire que dans des cas extrêmement particulier, donc à ne pas faire.
En fait, la différence, c'est qu'un .h ne se compile pas. Pour faire un programme, on compile tous les .c qui inclus des déclarations dans les .h. Si une déclaration doit être dupliquée, il suffit d'utiliser le même .h.
Faire des inclusion de .c, c'est inclure des fichiers "compilables", et donc inclure directement du code exécutable dans un .c. Il est facile de ne plus s'y retrouver. Pour pouvoir s'y retrouver, tout ce qui est code exécutable, se met dans des .c, et les déclaractions dans des .h.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Ok CRicky, mais je n'ai toujours pas la réponse que je cherche !! Xd
En très simple, est ce que dans mon programme si j'enlève la ligne " Initialisation();" mon fichiers ".h" va s'exécuter ou bien je dois forcement laisser la ligne?
Sinon pour ce qui est des ".c" j'ai bien compris ^^.
Aprioris si j'ai bien compris, mon fichier header doit s'exécuter automatiquement en début de programme sans que j'ai besoin de rajouter une ligne pour l'appeler.
Voila merci bonne soirée

Répondre à yoyohand

le .h ne s'exécute pas mais s'inclus.
au début de ton .c si tu as besoin d'un .h tu fais #include "fichier.h"
ensuite pour ta question j'ai du mal à comprendre parce que ton programme est vraiment mal foutu, tu devrais commencé par le structurer : faire un .h avec des déclarations de fonctions et un .c avec les corps de ces fonctions
ton .h est en fait un fichier de ressources, c'est un panier de fruits, il ne bouge pas jusqu'a ce que tu prenne un fruit, jusqu'a ce que le .c s'en serve.

quelle belle métaphore.

------------------------------ "Parlons moins codons plus"
Répondre à mcpherson
Meilleure réponse

pour mieux t'expliquer j'ai sorti un de mes vieux serveur client, vola le code du client avec un .h et un .c.
le .h

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <errno.h>
  5. #include <netdb.h>
  6. #include <sys/types.h>
  7. #include <netinet/in.h>
  8. #include <sys/socket.h>
  9. #include <sys/stat.h>
  10. #include <fcntl.h>
  11. #include <string.h>
  12. #include <sys/ioctl.h>
  13. void creer_socket_client(const char *hostname, const int port);


tu vois il y a les inclusions et une déclaration de fonction et donc le .c

Code :
  1. #include "client.h"
  2. void creer_socket_client(const char *hostname, const int port)
  3. {
  4.     int socket_fd;
  5.     int port;     
  6.     struct sockaddr_in adr_socket; 
  7.     struct hostent *hostinfo;
  8.     char buf[20];
  9.     int perm=1;
  10.     if((socket_fd = socket(AF_INET, SOCK_DGRAM, 0) ) ==-1)
  11.             {
  12.                 perror("socket" );
  13.                 exit(errno);
  14.             }
  15.       /* initialisation de la structure */
  16.     adr_socket.sin_family = AF_INET;
  17.     adr_socket.sin_port = htons(port);
  18.     if ((hostinfo = gethostbyname(hostname)) == NULL)
  19.     {
  20.         perror("Hote inconnu" );
  21.         return;
  22.     }
  23.     /*demande de diffusion*/
  24.     if (setsockopt(socket_fd, SOL_SOCKET, SO_BROADCAST, (void *) &perm, sizeof(perm)) < 0)
  25.             {
  26.                 perror("setsockopt" );
  27.                 exit(errno);
  28.             }
  29.     /*pseudo connexion du client au serveur*/
  30.     if((connect(socket_fd, (struct sockaddr *)&adr_socket, sizeof(struct sockaddr_in))) == -1)
  31.     {
  32.         perror("Echec lors la de connexion au serveur, serveur inactif ou mauvais choix de port" );
  33.         return;
  34.     }
  35.  
  36.     /* envoi du message */
  37.     while(1)
  38.     {
  39.         sprintf(buf, "test %d", i);
  40.         usleep(200000);
  41.         if(write(socket_fd,buf,strlen(buf) == -1))
  42.         {
  43.             perror("write" );
  44.             return;
  45.         }
  46.         i++;
  47.        
  48.     }
  49. }


qui contient l'inclusion du .h et qui fais le corps de la fonction

------------------------------ "Parlons moins codons plus"
Répondre à mcpherson

DivX_666 a écrit :


je te conseil le Site du Zero qui est je trouve tres tres bien expliquer.



Vu ton niveau de français, effectivement, ça va pour le site du zero (interdit aux plus de 12 ans)
Comme tous les forums web de programamtion , c'est une calamité et ça mène droit dans le mur (puisqu'il faut tout réapprendre de zéro justement ensuite)

Voir les avis sur hardware.fr et Usenet (consultants pros), où ce genre de site fait rire tour le monde, autant les questions que les réponses (genre "C++ est plus puissant que C", etc......)

Répondre à lucas666

Merci Mcpherson, ce coup ci c'est bon :)! J'ai bien modifié mon programme et compris comment fonctionner un fichier header en début de programme :)!
Le sujet peut être clos, encore merci de m'avoir aider.
yoyohang

Répondre à yoyohand

lucas666 a écrit :

Vu ton niveau de français, effectivement, ça va pour le site du zero (interdit aux plus de 12 ans)
Comme tous les forums web de programamtion , c'est une calamité et ça mène droit dans le mur (puisqu'il faut tout réapprendre de zéro justement ensuite)


C'est ce que tu as fais ? et tu t'es planté en beauté ? et bien le problème ne vient peut-être pas du site... :D

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

Bonjour, bon ben c'est bon j'ai passé mon oral, j'ai eu aucune question sur les programme en ".C" pour les Micro-contrôleurs, les boules!!! :( ...
Enfin, c'est une bonne chose de faite, merci pour votre aide, le sujet peut être clos.

Répondre à yoyohand
Tom's Guide > Forum > Programmation > [Résolu] Questions sur le language C
Aller à :

Il y a 2571 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Liens