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. #21
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    Citation Envoyé par poukill
    Sachant qu'un protocole a tjs besoin d'un socket!
    si tu parles d'héritage, je ne vois pas ce qu'il a à faire dans mon programme ...

    en tout cas, si je prend l'exemple de mon .cpp

    les données membres seront :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SOCKET socketRaw;		// Numéro de la socket obtenu
    char buffer[PACKET_SIZE];
    et les fonctions resteront inchangé?

    doit on faire des get et des set sur chaque donnée membres?

    comment et géré le constructeur? me crée t'il la socket? si oui, je dois juste modifier ma fonction creat_Socket???

  2. #22
    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
    Héritage, ça me parle tout de même fort quand tu me dis que tu peux choisir entre plusieurs protocoles.

  3. #23
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    Citation Envoyé par Miles
    Héritage, ça me parle tout de même fort quand tu me dis que tu peux choisir entre plusieurs protocoles.

    Pour moi, héritage implique un lien et des variables en commun. on part d'un truc générale et on va sur un truc plus complexe. En ce qui me concerne, si je parle de protocole, a part le nom, il y a aucun lien entre IP, TCP, UDP et ICMP! Aucune valeur en commun ... c'est pourquoi je ne vois pas ou l'héritage pourrais intervenir.

  4. #24
    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 dit Miles, c'est l'occasion de faire un truc propre à l'aide de l'heritage. Typiquement, ce qui est transparent à l'utilisateur de ton code (bref, surement toi plus tard), ce sont les actions (emissions/receptions pour faire simple) qui auront une action globalement identque quelque soit le protocole employé.

    Donc tu fais une super classe genre Dialog, et tu declare toutes les fonctions vrtuelles (non définies dans la super classe) qui sont commune a tes protocoles.

    Tes protocoles codés sous forme de classe hérite de Dialog et doivent définir explicitement ces fonctions.

    Ainsi tu pourras gérer par la suite tous tes protocole de manière (presque) générique

    EDIT:j'ai commencé a écrire avant ta derniere reponse... N'y a t il vraiment aucun lien?

  5. #25
    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
    Tu n'as pas des types de fonctions communes ? initialiser un transfert, effectuer un transfert, ... ? En plus, ça simplifierait ton code de beaucoup d'utiliser le polymorphisme pour ce genre de bestiole - pas de switch, ... -. Avec quelques patterns comme la factory et la template method pour certains cas, tu aurais un code évolutif, plus compréhensible, ..
    Mais après, ce n'est qu'une opinion pour améliorer ton code.

  6. #26
    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
    Pour ce qui est des get et set sur toutes les variables membres oui si elle sont déclarées privées... mais dans quel cadre doit on se forcer à les mettre privées surtout si c'est pour donner une liberté totale sur celles-ci à l'aide d'accesseurs tels que getMaVar() et setMaVar()

    J'aimerais bien connaitre l'avis de notre souris des champs (Miles) la dessus...

  7. #27
    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
    Pour moi, héritage implique un lien et des variables en commun. on part d'un truc générale et on va sur un truc plus complexe. En ce qui me concerne, si je parle de protocole, a part le nom, il y a aucun lien entre IP, TCP, UDP et ICMP! Aucune valeur en commun ... c'est pourquoi je ne vois pas ou l'héritage pourrais intervenir.
    C'est vrai!
    Mais rien ne t'empeche d'avoir des fonctions membres comme:
    - envoyer message
    - recevoir message
    virtuelle pure, que tu pourrais réimplanter dans chaque classe fille (protocole)

  8. #28
    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 harsh
    Pour ce qui est des get et set sur toutes les variables membres oui si elle sont déclarées privées... mais dans quel cadre doit on se forcer à les mettre privées surtout si c'est pour donner une liberté totale sur celles-ci à l'aide d'accesseurs tels que getMaVar() et setMaVar()

    J'aimerais bien connaitre l'avis de notre souris des champs (Miles) la dessus...
    Dans le code que j'écris - ce n'est pas la vérité universelle, il y a des gens comme Luc qui expliquerait plus théoriquement et plus en profondeur les tenants et les aboutissants des variables privées et de leurs accesseurs -, je n'ai d'accesseurs que sur très peu de variables privées. J'ai des variables privées qui dépendent de mon implémentation propre, donc ça ne sert à rien de polluer l'interface publique avec des accesseurs. Par exemple, on peut donner des accesseurs pour modifier la taille d'une matrice, mais on ne donnera pas d'accesseurs vers la liste des threads attendant de bloquer un mutex, sauf exception.

  9. #29
    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 viens de voir le lien.

    lors de l'envoie, je dois transmettre les paquet (IP et ICMP ou UDP ou TCP) afin de l'envoyé.

    je dois donc surcharger la fonctions send_Socket dans chaque classe (UDP, TCp et ICMP)?

    Voila un début de classe pour les socket. Pouvez vous me dire si ca se tiend?
    .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
     
    #include "stdafx.h"
    #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;
     
    	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;
    }
    la classe tiré de ca:
    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
     
    class socket
    {
    private:
    	SOCKET socketRaw;		// Numéro de la socket obtenu
    	char buffer[PACKET_SIZE];
     
    public:
    	// 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;
     
    		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;
    	}
    }

  10. #30
    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
    C'est un début, ça peut être le squelette de abse de ta classe protocole, mais c'est tout. Après, tu dois rajouter des fonctions virtuelles pour pouvoir les redéfinir dans les classes filles.

  11. #31
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    j'ai un problème de compréhension.

    le constructeur ne porte il pas le nom de la classe?

    quand je crée un objet socket, il a juste un identifiant (SOCKET ou int) je dois donc juste faire appel à la fonction socket ou WSASocket (qui me cré cet identifiant)??

    comme la donnée membre paquet représente les données à envoyé (ICMP, UDP ou TCP) a t'elle raison d'exister dans la classe socket?


    la dans l'imédia, je suis quand meme pas mal perdu avec les classe en c++

  12. #32
    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
    http://c.developpez.com/faq/cpp/?page=OO
    Oui, le constructeur a le même nom que la classe.

  13. #33
    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
    Voili, ici tous les liens vers les cours que tu DOIS lire
    http://www.developpez.net/forums/showthread.php?t=31

    sinon, une classe, c'est la définition d'un objet que tu instancies autant de fois que tu veux, exemple:

    .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
     
    class Tarte             //prend l'habitude de mettre des majuscule pour tes noms de classe
    {
    public:                    //tout ce qui suit est visible, donc utilisable depuis n'importe ou
     
    Tarte ();                  //constructeur par defaut (obligatoire)
    ~Tarte ();                //destructeur par defaut (obligatoire)
    Tarte (...);               //tu peux definir des constructeurs "appellant" des parametres
     
    ...                           //autre déclaration de fonction ou variables publiques
     
    private:                   //tout ce qui suit n'est utilisable que par un objet de type Tarte
     
    ...                           //idem que pour public mais sans constructeur/destructeur
     
    };                           //ne pas oublier le point virgule
    .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Tarte::Tarte ()
    {
    ...                             //initialisation à la construction (si besoin sinon rien)
    }
     
    Tarte::~Tarte()
    {
    ...                              //comportement à la destruction (souvent, liberation de la memoire)
    }
     
    ...                              //ainsi de suite (ne pas oublier le Tarte:: avant les noms de fonctions pour specifier que c'est une fonction membre de Tarte)
    enfin a l'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Tarte laTarteDeGrandMere;              //creation d'une instance de Tarte utilisant le constructeur par defaut
    Tarte laTarteDeMaman(....);              //idem avec un constructeur utilisant des parametres
     
    std::cout << laTarteDeGrandMere.estBonne () << std::endl;       //ca depend de grand-mere...

  14. #34
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    OK, merci pour ces précisions sur les classe.

    j'ai commencé a créer mes classe IP, ICMP, ...

    et dans ma classe IP je cré une fonction retournant un pointeur sur une String. Pour cela j'ai inclu dans le .h class IP

    Voici les déclaration dans le IP.h de mes fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String * getIpSource();
    	String * getIpDestination();
    	String * intToIp(int entier);
    et voici la structure de mes fonctions dans le IP.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
     
    String * IP::getIpSource()
    {
    	return intToIp(this->ip_src);
    }
    String * IP::getIpDestination()
    {
    	return intToIp(this->ip_dst);
    }
    String * IP::intToIp(int entier)
    {
    	String * ip;
     
    	in_addr addr;
    	addr.S_un.S_addr = entier;
     
    	ip = inet_ntoa(addr);
    	return ip;
    }
    cependant cela me cause un grand nombre d'erreurs.

    IP.cpp
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(38) : error C2143: erreur de syntaxe : absence de ';' avant '*'
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(38) : error C2501: 'IP::String' : Spécificateurs de type ou de classe de stockage manquants
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(38) : error C2501: 'IP::getIpSource' : Spécificateurs de type ou de classe de stockage manquants
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(38) : warning C4183: 'getIpSource' : type de retour manquant ; fonction membre retournant 'int' assumée
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(39) : error C2143: erreur de syntaxe : absence de ';' avant '*'
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(39) : error C2501: 'IP::String' : Spécificateurs de type ou de classe de stockage manquants
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(39) : error C2501: 'IP::getIpDestination' : Spécificateurs de type ou de classe de stockage manquants
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(39) : warning C4183: 'getIpDestination' : type de retour manquant ; fonction membre retournant 'int' assumée
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(46) : error C2143: erreur de syntaxe : absence de ';' avant '*'
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(46) : error C2501: 'IP::String' : Spécificateurs de type ou de classe de stockage manquants
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(46) : error C2501: 'IP::intToIp' : Spécificateurs de type ou de classe de stockage manquants
    c:\Documents and Settings\Administrateur.LI-MARIGNIER\Bureau\t\forgeur paquet\packetBuilder\IP.h(46) : warning C4183: 'intToIp' : type de retour manquant ; fonction membre retournant 'int' assumée
    IP.cpp(42) : error C2143: erreur de syntaxe : absence de ';' avant '*'
    IP.cpp(42) : error C2501: 'String' : Spécificateurs de type ou de classe de stockage manquants
    IP.cpp(43) : error C2501: 'IP::getIpSource' : Spécificateurs de type ou de classe de stockage manquants
    IP.cpp(44) : error C2440: 'return' : impossible de convertir de 'int *' en 'int'
    Cette conversion requiert reinterpret_cast, un cast de style C ou un cast de style fonction
    IP.cpp(46) : error C2143: erreur de syntaxe : absence de ';' avant '*'
    IP.cpp(46) : error C2501: 'String' : Spécificateurs de type ou de classe de stockage manquants
    IP.cpp(46) : error C2086: 'int String' : redéfinition
    IP.cpp(42) : voir la déclaration de 'String'
    IP.cpp(47) : error C2501: 'IP::getIpDestination' : Spécificateurs de type ou de classe de stockage manquants
    IP.cpp(48) : error C2440: 'return' : impossible de convertir de 'int *' en 'int'
    Cette conversion requiert reinterpret_cast, un cast de style C ou un cast de style fonction
    IP.cpp(57) : error C2143: erreur de syntaxe : absence de ';' avant '*'
    IP.cpp(57) : error C2501: 'String' : Spécificateurs de type ou de classe de stockage manquants
    IP.cpp(57) : error C2086: 'int String' : redéfinition
    IP.cpp(42) : voir la déclaration de 'String'
    IP.cpp(58) : error C2501: 'IP::intToIp' : Spécificateurs de type ou de classe de stockage manquants
    IP.cpp(59) : error C2065: 'ip' : identificateur non déclaré
    IP.cpp(64) : error C3861: 'ip': identificateur introuvable, même avec une recherche qui dépend de l'argument
    IP.cpp(65) : error C3861: 'ip': identificateur introuvable, même avec une recherche qui dépend de l'argument
    Savez vous pourquoi un problème est lié avec l'utilisation des String *?

  15. #35
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    C'est du .Net, String avec une majuscule.

    Les strings obtenues avec l'en-tête <string> sont des string (sans majuscule) dans le namespace std.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #36
    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
    Que te dire sinon que par exemple string ne prend pas de majuscule... que pour le reste le compilo parle de lui meme... Sinon, c'est std::string ou alors il faut que tu annonce que tu utilise l'espace de nom std en ecrivant unsing namespace std en debut de ton .h (apres les includes) pour une portée "globale".

    Pour le reste, regarde le compilo une fois ca corriger

    EDIT: Bah voila, comme toujours, je prends un peu de temps pour repondre en prenant un café, et je me fais avoir

  17. #37
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    Encore merci de votre aide, mais le String que j'utilise est bien avec un grand S.

    il fait partie de l'espace de nom System.

    et avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using namespace System;
    tout marche parfaitement, ou du moins ca compil!!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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