Comment Recupérer Variables d'une fonction ?

Résolu
baptchr55 Messages postés 34 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 6 avril 2011 - 11 févr. 2011 à 09:26
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);

}

2 réponses

pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 10
11 févr. 2011 à 22:26
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
3
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, 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.
0