IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

organisation du code.


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut organisation du code.
    bonjour tout le monde,

    je souhaiterais organiser mon code dans différent fichier afin de le rendre plus visible. Cependant je ne sais pas trop comment faire!

    je pense qu'il faut placer le code dans différents .h est les inclures dans le .h principal afin de pouvoir appeler les fonctions. Je ne sais pas si c'est la bonne méthode????

    une autre question est : quel est la différence entre un .cpp et un .h? a quoi servent ils exactement?

    voila mes questions du moment. Je suis un peu perdu et comme mon programme commence a être plus ou moins volumineux, je voulais le réorganiser.

    merci d'avance pour votre aide.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Dans la FAQ, il y a les premières réponses à tes questions.
    Mais c'est bizarre que tu poses ce genre de question si tu as déjà un programme en C++

  3. #3
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    Basiquement, une paire de fichier .h .cpp par classe.

    Le .h contient la déclaration de ta class, et les includes. Il commence par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #ifndef NOM_DE_FICHIER_H
    #define NOM_DE_FICHIER_H
    et se termine par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #endif /*NOM_DE_FICHIER_H*/
    pour éviter les définitions multiples.

    Chaque .cpp n'inclut que le .h correspondant puis définit toutes les fonctions de la classe correspondante.

    Mais c'est vrai qu'il y a la

    EDIT: j'ai comme l'impression de me répéter aujourd'hui

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Citation Envoyé par harsh
    EDIT: j'ai comme l'impression de me répéter aujourd'hui
    Il y a un étrange phénomène que j'ai déjà observé : Il y a des questions qui arrivent par troupeaux d'elles même.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    Ca coïncide pourtant pas avec des dates de projets "scolaires", étrange

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    je vous prie à tous d'excuser mon ignorance. Mais comme je ne programme pas depuis longtemps en C++, je pense que j’ai encore pas mal de choses à apprendre.

    Mais maintenant, je sais que dans un .h on met les déclarations des fonctions que l’on utilise dans le .CPP, avec les type de retour, et le types des arguments (pas obligé de mettre un nom pour ces arguments).

    Je réalise un programme qui utilise les protocoles IP, TCP, ICMP et UDP. Pour cela je souhaite créer un .h et .cpp pour chaque protocole (avec les fonctions associées à chaque protocole). Cependant il y a encore des éléments qui m’échappent.

    Les include se font dans le .h ?
    Ou se fait la déclaration des structures ?

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Les includes se font là où il faut. Si un header a besoin d'un include, on le met dans le header. Dans le cpp, on met les headers dont on a besoin - pas les mêmes que dans le .h qui lui sera inclus -.
    Les déclarations de structures, ce sont des déclarations de classes -> .h si c'est partagé par plusieurs classes, .cpp si c'est local à une classe.

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    Tu me parles de classe, mais en ce qui me concerne, je n'utilise pas de classe dans mon programme. a aucun moment le mot privé classe est utilisé.

    j'utilise les .h et .cpp uniquement pour organiser mon code et pas pour arganiser d'éventuelles classes.

  9. #9
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Une classe pour chaque protocole, c'est pas une mauvaise idée pour le futur!
    C'est plus clair, et bien souvent plus propre.

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par poporiding
    Tu me parles de classe, mais en ce qui me concerne, je n'utilise pas de classe dans mon programme. a aucun moment le mot privé classe est utilisé.

    j'utilise les .h et .cpp uniquement pour organiser mon code et pas pour arganiser d'éventuelles classes.
    Tu fais du C ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Par défaut
    il faut mettre les include que lorsque tu est oblige.
    exemple:

    dans fichier1.h tu a une fonction `int fonction1(int);`, le corps de cette fonction est dans le fichier fichier1.cpp. cette fonction appelle une autre fonction declare dans fichier2.h, dans ce cas, tu inclue dans le .cpp, pas dans le .h

    et comme tu dis que tu n'utilises pas de classe, a priori tu ne devrais pas avoir a include grand chose dans tes .h

  12. #12
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    Du C++ sans classe ... même si je ne prone pas l'utilisation abusive de POO, reste que le C++ sans la gestion de classe se résume à du C revu est modifié a coup de string et de template...

  13. #13
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    je défini par exemple un socket.h et un socket.cpp.

    Voila ce que j'ai dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #ifndef __SOCKET_H__
    #define __SOCKET_H__
     
    #include <Winsock2.h>
    #include <windows.h>
    #include <ws2tcpip.h>
     
    // ********************************************************
    // Les pragma
    // ********************************************************
    #pragma comment(lib, "ws2_32.lib")
     
    //fonction booleen permettant d'initialiser WS2_32.DLL
    bool initWSA();
     
    //fonction booleen permettant de terminer l'utilisation de WS2_32.DLL
    void clearWSA();
     
    //Fonction booleen permettant de créer la socket
    bool creat_Socket();
     
    //Fonction booleen permettant d'initialiser la socket
    bool init_socket();
     
    //Fontion booleen permettant de savoir si l'envoie c'est bien réalisé
    bool envoi_Socket(struct sockaddr_in IP_sock_info, int paquetSize, char * paquet);
     
    #endif
    Voila le contenu de mon .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #include "socket.h"
     
    #define PACKET_SIZE 1024
     
    //variable globale
    SOCKET socketRaw;		// Numéro de la socket obtenu
    char buffer[PACKET_SIZE];
     
    // The WSAStartup function initiates use of WS2_32.DLL by a process.
    bool initWSA()
    {
    	bool tempo = true;
    	WSAData wsaData;
    	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    	 {
    		 tempo = false;
    	 }
    	 return tempo;
    }
     
    // The WSACleanup function terminates use of the WS2_32.DLL.
    void clearWSA()
    {
    	WSACleanup();
    }
     
    /// <summary>
    /// Fonction permettant de créer la socket qui me permetra d'envoyer mes données.
    /// Paramètre d'entrée : aucun
    /// Paramètre de sortie : un booléen (vrai ou faux) m'indiquant que la création s'est bien (ou pas) réalisée
    /// </summary>
    bool creat_Socket()
    {
    	bool tempo = true;
    	int result;
     
    	socketRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, 0);
    	if(socketRaw == INVALID_SOCKET)
    	{
    		tempo = false;
    	}
    	return tempo;
    }
     
    /// <summary>
    /// Fonction permettant d'initialiser la socket qui me permetra d'envoyer mes données.
    /// Paramètre d'entrée : aucun
    /// Paramètre de sortie : un booléen (vrai ou faux) m'indiquant que l'initialisation s'est bien (ou pas) réalisée
    /// </summary>
    bool init_socket()
    {
    	bool tempo = true;
    	int sockOpt = 1;
    	int result;
     
    	// IPPROTO_IP IP_HDRINCL ==> Indique que l'IP header doit etre fourni par des données externes
    	if((result = setsockopt(socketRaw, IPPROTO_IP, IP_HDRINCL, (char*)&sockOpt, sizeof(sockOpt))) == SOCKET_ERROR)
    	{
    		tempo = false;
    	}
    	return tempo;
    }
     
    /// <summary>
    /// Fonction réalisant l'envoi des données au travers d'une socket
    /// Attend une structure sockaddr-in en entrée
    /// Retourne un booléen suivant le bon fonctionnement ou pas de la fonction.
    /// </summary>
    bool envoi_Socket(struct sockaddr_in IP_sock_info, int paquetSize, char * paquet)
    {
    	bool tempo = false;
    	int result;
     
    	result = sendto(socketRaw, paquet, sizeof(paquet), 0, (struct sockaddr *)&IP_sock_info, sizeof(IP_sock_info));
     
    	if(result != SOCKET_ERROR)
    	{
    		tempo = true;
    	}
     
            return tempo;
    }
    note pour chaque couple .h et .cpp j'ai l'erreur suivante qui est générée:

    socket.cpp
    socket.cpp(82) : fatal error C1010: fin de fichier inattendue lors de la recherche d'une directive d'en-tête précompilé
    Savez vous d'ou cela peut venir?

  14. #14
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    C'est dans la FAQ

    http://c.developpez.com/faq/vc/?page=IDE#C1010

    EDIT: dans la mesure ou tu mets en general un S majuscule a Socket dans tes noms de fonction, tu devrait en faire de meme pour init_socket (), ca t'evitera des erreurs stupides futurs

  15. #15
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155

  16. #16
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    Merci pour les liens en rapport avec mon erreur.

    cependant je voulais savoir si la construction de mes .h et .cpp était correcte?

  17. #17
    Membre confirmé Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Par défaut
    Comme ca, ca m'a l'air plutôt OK a ceci pres que la norme C++ des fichiers inclus est
    au lieu de
    Mais peut etre n'est-ce pas valable dans tous les cas, je demande confirmation

  18. #18
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    merci pour cette précision harsh.

    maitenant que j'ai commencer à révolutionner ma facon de coder en c++, je vais te poser une question.

    Je uis allé sur la FAQ pour la création de classe. Cependant avec les même cpp sur les socket, je ne vois pas quelles modifications réaliser afin de tout transformer en class???

    J'ai fait un peu de java donc je ne sais pas si c'est identique (de plus ces souvenir sont un peu lointain).

    je cré un class socket, mes données membre sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SOCKET socketRaw;		// Numéro de la socket obtenu
    char buffer[PACKET_SIZE];
    Mes fonctions reste inchangé?

    je doit faire des get et des set sur chaque données membres?

    comment est géré le constructeur d'une telle classe?

  19. #19
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Non, ce n'est pas valable dans ton les cas...
    Mais globalement, les en tete avec un ".h" sont soit démodés, soit ce sont des en-têtes non "standard", comme <windows.h>

    Bref, il est difficile de généraliser!

  20. #20
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par poporiding
    merci pour cette précision harsh.

    maitenant que j'ai commencer à révolutionner ma facon de coder en c++, je vais te poser une question.

    Je uis allé sur la FAQ pour la création de classe. Cependant avec les même cpp sur les socket, je ne vois pas quelles modifications réaliser afin de tout transformer en class???

    J'ai fait un peu de java donc je ne sais pas si c'est identique (de plus ces souvenir sont un peu lointain).
    Ben pas tellement de modif, mais bcp de bonheur après!!!
    Tu pourrais créer une classe Socket, et une classe pour chaque protocole...
    Sachant qu'un protocole a tjs besoin d'un socket!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Persistance et organisation du code
    Par K-Kaï dans le forum Hibernate
    Réponses: 16
    Dernier message: 06/06/2007, 17h01
  2. [Session] Organisation du code et les Sessions
    Par sir_gcc dans le forum Autres composants
    Réponses: 3
    Dernier message: 03/01/2007, 21h49
  3. Organisation du code source
    Par _kal_ dans le forum C
    Réponses: 18
    Dernier message: 04/08/2006, 14h15
  4. organisation du code.
    Par poporiding dans le forum C++
    Réponses: 3
    Dernier message: 28/06/2006, 17h10
  5. Réponses: 4
    Dernier message: 19/09/2005, 17h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo