Web service gsoap

Résolu
yopman21 Messages postés 4 Date d'inscription mardi 6 octobre 2009 Statut Membre Dernière intervention 25 juillet 2013 - 24 juil. 2013 à 17:01
 Utilisateur anonyme - 25 juil. 2013 à 10:58
Bonjour tout le monde.

Je travaille sur un web service à généré par Gsoap.
J'expose mon problème.
J'ai un tableau de float à envoyer.
J'utilise l'exemple de Gsoap du One-Dimensional Dynamic SOAP Arrays qui utilise un pointeur et la taille du tableau.
struct some_name 
{ 
   Type *__ptr; // pointer to array of elements in memory
   int __size; // number of elements pointed to 
   [[static const] int __offset [= ...];] // optional SOAP 1.1 array offset 
   ... // anything that follows here will be ignored 
};


Dans mon cas :
int ns__gpioAnalogRead(int Channel, int nSample, struct Data_Read{float* __ptr; int __size;} &DR);


Le tableau est rempli :
int ns__gpioAnalogRead(struct soap* soapPRM,int Channel,int nSample, struct Data_Read &DR)
{
        int i=0;
DR.__ptr=(float*)malloc(nSample*sizeof(float));
DR.__size=nSample;
for(i=0;i<nSample;i++)
{
*DR.__ptr=5.0000;
DR.__ptr=DR.__ptr+sizeof(float);
}
DR.__ptr=DR.__ptr-(sizeof(float)*nSample);
return SOAP_OK;
free(DR.__ptr);
}

En affichant dans la console les valeurs contenues dans DR.__ptr, j'ai bien la valeur 5 partout.

Ensuite je capture à l'aide de Wireshark le paquet contenant le fichier XML et mon tableau et la surprise, les données qu'il contient sont fausses.

<?xml version="1.0" encoding="UTF-8"?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:rpiGpio">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ns:gpioAnalogReadResponse>
<DR SOAP-ENC:arrayType="xsd:float[25]" xsi:type="SOAP-ENC:Array">
<item>5</item><item>0</item><item>-0.346070766</item><item>0</item><item>5</item><item>1.40129846E-45</item><item>5</item><item>0</item><item>5</item><item>0</item><item>5</item><item>0</item><item>5</item><item>0</item><item>5</item><item>0</item><item>5</item><item>0</item><item>5</item><item>0</item><item>5</item><item>0</item><item>5</item><item>0</item><item>5</item>
</DR>
</ns:gpioAnalogReadResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

On remarque une suite de 5 et de 0 avec des valeurs intercalées.
Si quelqu'un a un début d’explication je suis preneur.
Merci,
Damien,

5 réponses

yopman21 Messages postés 4 Date d'inscription mardi 6 octobre 2009 Statut Membre Dernière intervention 25 juillet 2013
25 juil. 2013 à 10:00
Solution trouvée :
Il faut juste incrémenté le pointeur de +1 et non pas de la taille du float.
3
Utilisateur anonyme
25 juil. 2013 à 10:58
Bonjour.

J'arrive après la bataille, désolé :)

Ceci:
DR.__ptr=DR.__ptr+sizeof(float);

est effectivement faux.

En effet, lorsque l'on fait "+ 1" sur un pointeur, c'est toujours traduit en "+ 1 unité" ou "avancer d'une case".
En d'autre terme: "ptr + 1" équivaut déjà à "ptr + 1 * sizeof (*ptr)".
Ton écriture provoquait un: "ptr + sizeof (*ptr) * sizeof (*ptr)".

Tu as surement le même souci sur la ligne: "DR.__ptr=DR.__ptr-(sizeof(float)*nSample);".

J'écrirais à ta place, ceci (non testé):
int ns__gpioAnalogRead(struct soap* soapPRM, int Channel, int nSample, struct Data_Read &DR)
{
DR.__ptr = (float*) malloc(nSample * sizeof(float));
DR.__size = nSample;
for(int i = 0; i < nSample; ++i, ++DR.__ptr)
            *DR.__ptr = 5.0000;

return SOAP_OK;
}


J'ai du mal à comprendre pourquoi tu écris dans "__ptr", si tu libères la mémoire derrière. Mais plutôt que de faire des calculs, il te suffit simplement de "retenir la tête". Ça donnerait ça:
int ns__gpioAnalogRead(struct soap* soapPRM, int Channel, int nSample, struct Data_Read &DR)
{
DR.__ptr = (float*) malloc(nSample * sizeof(float));
DR.__size = nSample;
        float* head = DR.__ptr;
for(int i = 0; i < nSample; ++i, ++DR.__ptr)
            *DR.__ptr = 5.0000;
        free(head);

return SOAP_OK;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
24 juil. 2013 à 21:46
Salut,

tu alloues un tableau de float sur le heap, tu y affectes des valeurs puis tu libères le pointeur.
A partir de là, les données contenues dans cet espace mémoire sont aléatoires.

As tu essayé d'enlever le free(DR.__ptr); ?

bye...
0
yopman21 Messages postés 4 Date d'inscription mardi 6 octobre 2009 Statut Membre Dernière intervention 25 juillet 2013
25 juil. 2013 à 09:46
Oui j'ai essayé en enlevant le free(DR.__ptr); mais j'obtiens le même résultat.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yopman21 Messages postés 4 Date d'inscription mardi 6 octobre 2009 Statut Membre Dernière intervention 25 juillet 2013
25 juil. 2013 à 10:02
... enfin incrémenter*
0
Rejoignez-nous