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 :

conversion to non-scalar type requested


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut conversion to non-scalar type requested
    Bonjour à tous,

    J'ai un petit soucis lors du cast d'une structure, je ne vois pas comment faire

    En fait je tente de faire un serveur multi-clients, le client.c s'occupe de "declarer" un nouveau client au serveur...
    Ces codes ne concernent que le serveur.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /*main.c*/
           for(;;)
            {
                argc = Serveur(SERVEUR_LISTEN, 0);
                Serveur(SERVEUR_ACCEPT, &argc);
            }
    //argc recupere (int)Clients[Id];
    //voir client.c
    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
     
     
     
    /*serveur.c*/
     
    int Serveur(int sc, int pa)
    {
        switch(sc)
        {
        case SERVEUR_ACCEPT:
            //La fonction accepte la connection d'un socket clients sur le socket serveur
            if((((t_Clients)&pa).ClientSock = accept(serveur.ServeurSock, (SOCKADDR *)&((t_Clients)pa).ClientsSin, &((t_Clients)pa).SinSize)) == INVALID_SOCKET)
            {
                Fin("Echec de la connection du clients.\n");
            }
            else
            {
                printf("\nNouvelle connexion : %s se connecte.\n", inet_ntoa(((t_Clients)pa).ClientsSin.sin_addr));
                strcpy(*Buff, "-- Bienvenue sur le serveur");
                send(((t_Clients)pa).ClientsSock, *Buff, (int)strlen(*Buff), 0);
            }
            break;
    }
    }
    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
     
    t_Clients *Clients;
     
    /*client.c*/
    int Client(int sc, int pa)
    {
        switch(sc)
        {
        case CLIENT_NEW:
            puts("Creation d'un nouveau client.");
            Id++;
            Clients[Id].SinSize = sizeof(Clients[Id].ClientSin);
            return (int)Clients[Id];
            break;
    }
    }
    Mon problème se pose au niveau du serveur.c, notamment ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if((((t_Clients)&pa).ClientSock

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    J'ai l'impression que le type de pa n'est pas ce qu'il devrait être...
    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.

  3. #3
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    En fait je cast Clients[Id] en int pour ensuite le recaster en (t_clients).
    Je ne vois pas en quoi d'autre il devrait etre !

  4. #4
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serveur(SERVEUR_ACCEPT, &argc);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int Serveur(int sc, int pa)
    {
    Ce n'est pas très cohérent tout ça....

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Citation Envoyé par jbarreau-mainson Voir le message
    En fait je cast Clients[Id] en int pour ensuite le recaster en (t_clients).
    Je ne vois pas en quoi d'autre il devrait etre !
    Pourquoi pas en t_clients ou t_Clients*?

    Ou bien, à défaut, en intptr_t minimum. On vit à l'ère du 64 bits maintenant, et rien ne garantit qu'un int soit assez grand pour contenir un pointeur.
    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.

  6. #6
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    Pourquoi pas en t_clients ou t_Clients*?
    c'est déjà en t_clients.
    Si je met en t_clients * j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: request for member `ClientSock' in something not a structure or union|
    On vit à l'ère du 64 bits maintenant, et rien ne garantit qu'un int soit assez grand pour contenir un pointeur.
    La plateforme est 32bits.

    Ce n'est pas très cohérent tout ça....
    J'ai enlevé le "&".

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Et si tu faisais tout simplement ceci?
    Code C : 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
    int Serveur(int sc, clients_t *pa)
    {
    	switch(sc)
    	{
    	case SERVEUR_ACCEPT:
    		/*La fonction accepte la connection d'un socket clients sur le socket serveur*/
    		pa->ClientSock = accept(serveur.ServeurSock, (SOCKADDR *)&(pa->ClientsSin), &(pa->SinSize));
    		if(pa->ClientSock == INVALID_SOCKET)
    		{
    			Fin("Echec de la connection du clients.\n");
    		}
    		else
    		{
    			printf("\nNouvelle connexion : %s se connecte.\n", inet_ntoa(pa->ClientsSin.sin_addr));
    			strcpy(*Buff, "-- Bienvenue sur le serveur");
    			send(pa->ClientsSock, *Buff, (int)strlen(*Buff), 0);
    		}
    		break;
    	}
    }
    PS: Buff est un pointeur de pointeur?
    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.

Discussions similaires

  1. Request member non-class type… C++
    Par sarahjayneburrell11 dans le forum Langage
    Réponses: 7
    Dernier message: 23/12/2011, 19h47
  2. Réponses: 29
    Dernier message: 23/08/2010, 09h24
  3. conversion to non-scalar type requested !
    Par gilouu dans le forum C++
    Réponses: 8
    Dernier message: 19/11/2009, 21h07
  4. erreur conversion from to non scalar requested
    Par annesophiedecar dans le forum Langage
    Réponses: 2
    Dernier message: 15/10/2009, 23h16
  5. Conversion de chaîne "" en type Double non valide
    Par vérokit dans le forum VB.NET
    Réponses: 2
    Dernier message: 10/04/2008, 08h14

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