Comment Recupérer Variables d'une fonction ? [Résolu]

Messages postés
34
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
6 avril 2011
- - Dernière réponse : baptchr55
Messages postés
34
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
6 avril 2011
- 15 févr. 2011 à 13:03
Bonjour à tous. Voilà, j'ai un problème, je cherche à récupèrer mes valeurs x,y,z dans le main... je ne sais pas comment faire...

Quelqu'un peut-il m'aider ??

Merci par avance.



******************** Socket.cpp *******************

#include
#include <netdb.h>
#include <netinet/in.h>
#include
#include
#include <cstdlib>
#include <cstring>
#include "Socket.h"
#include "Deplacement.h"

#define MAX_MSG 100 //longeur max de la trame
#define MSG_ARRAY_SIZE (MAX_MSG+3)// 3 caractères pour les codes ASCII 'cr', 'lf' et '\0'
using namespace std;

int listenSocket, i;
//unsigned short int listenPort=1501, msgLength;
socklen_t clientAddressLength;
struct sockaddr_in clientAddress, serverAddress;
char msg[MSG_ARRAY_SIZE];


float Ouverture_Socket()
{


unsigned short int listenPort=1501, msgLength;
//socklen_t clientAddressLength;
//struct sockaddr_in clientAddress, serverAddress;
//char msg[MSG_ARRAY_SIZE];
memset(msg, 0x0, MSG_ARRAY_SIZE); // Mise à zéro du tampon

listenSocket = socket(AF_INET, SOCK_DGRAM, 0);// Création de socket en écoute et attente des requêtes des clients

if (listenSocket < 0)
{
cerr << "Impossible de créer le socket en écoute\n";
exit(1);
}

// On relie le socket au port en écoute.

serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddress.sin_port = htons(listenPort);

if (bind(listenSocket,(struct sockaddr *) &serverAddress,sizeof(serverAddress)) < 0)
{
cerr << "Impossible de lier le socket en écoute\n";
exit(1);
}


//*********** Attente des requêtes des clients *************

listen(listenSocket, 5);
cout << "Attente de requête sur le port " << listenPort << "\n";
}

float Reception_Trame()
{

clientAddressLength = sizeof(clientAddress);
memset(msg, 0x0, MSG_ARRAY_SIZE);// Mise à zéro du tampon de façon à connaître le délimiteur de fin de chaîne.

if (recvfrom(listenSocket, msg, MSG_ARRAY_SIZE, 0,(struct sockaddr *) &clientAddress,&clientAddressLength) < 0)
{
cerr << " Problème de réception du messsage\n";
exit(1);
}

//cout << " Depuis " << inet_ntoa(clientAddress.sin_addr);// Affichage de l'adresse IP du client.
//cout << ":" << ntohs(clientAddress.sin_port) << "\n";// Affichage du numéro de port du client.
cout << " Message recu : " << msg << "de "<<&clientAddress<<"\n";// Affichage de la ligne reçue

//***************** Recup Trame Cmd Manuelle ********************

char ASCIIx[3]={msg[0],msg[1]};
char ASCIIy[3]={msg[2],msg[3]};
char ASCIIz[3]={msg[4],msg[5]};
char ASCIIbroche[2]={msg[6],msg[7]};

float x,y,z;
float *dx,*dy,*dz;
x=atof(ASCIIx);
dx=&x;
cout<<"x: "<<x<<endl;

y=atof(ASCIIy);
dy=&y;
cout<<"y: "<<y<<endl;

z=atof(ASCIIz);
dz=&z;
cout<<"z: "<<z<<endl;
// Deplacement(x,y);
// AxeZ(&z);

return(*dx);

}
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
4
3
Merci
S'il est possible de modifier la fonction Reception_Trame() :

Solution 1 : Par pointeur

exemple :
#include 

void f(float *dx,float  *dy,float *dz);

int main()
{

    float Dx, Dy, Dz;

    f(&Dx, &Dy, &Dz);

    std::cout << Dx << "\n" << Dy << "\n" << Dz << "\n\n";
    // Affiche 5 6 7


    return 0;
}


void  f(float *dx,float  *dy,float  *dz)
{

*dx = 5;
*dy = 6;
*dz = 7;

}


Solution 2 : par référence

exemple :
#include 

void f(float &dx ,float  &dy,float &dz);

int main()
{

    float Dx, Dy, Dz;

    f(Dx, Dy, Dz);

    std::cout << Dx << "\n" << Dy << "\n" << Dz << "\n\n";
    // Affiche 5 6 7

    return 0;
}


void f(float &dx ,float  &dy,float &dz)
{

dx = 5;
dy = 6;
dz = 7;

}


Solution 3 : par conteneur

exemple :
#include 
#include <vector>

std::vector<float>  f();

int main()
{

    std::vector <float> Dn;

    Dn = f();

    std::cout << Dn[0]<< "\n" << Dn[1]<< "\n" << Dn[2] << "\n\n";
    // Affiche 5 6 7

    return 0;
}


std::vector<float>  f()
{
float dx 5, dy 6, dz= 7;

std::vector<float> retour;

retour.push_back(dx);
retour.push_back(dy);
retour.push_back(dz);


return retour;
}



C++dialement

Pop70

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 197 internautes nous ont dit merci ce mois-ci

Commenter la réponse de pop70
Messages postés
34
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
6 avril 2011
0
Merci
Bonjour, merci de ton attention et surtout de la réponse apportée. En effet ta méthode par pointeurs ou référence me plait beaucoup et je vais m'en servir. Par contre la dernière n'est absolument pas à ma portée. je ne maitrise pas ce point.

J'ai avant ta réponse pu réussir en contournant la difficulté (mais en trichant un peut) j'ai retourné via la fonction, la variable "msg" pour ne la traiter que par la suite dans le main.

Ceci dit les pointeurs semblent quand même beaucoup plus professionnel ;-)

encore merci.
Cordialement.
Commenter la réponse de baptchr55