Web service gsoap [Résolu]

yopman21 4 Messages postés mardi 6 octobre 2009Date d'inscription 25 juillet 2013 Dernière intervention - 24 juil. 2013 à 17:01 - Dernière réponse : CptPingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 10 juin 2018 Dernière intervention
- 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,
Afficher la suite 

Votre réponse

5 réponses

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

Merci yopman21 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de yopman21
Meilleure réponse
CptPingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 10 juin 2018 Dernière intervention - 25 juil. 2013 à 10:58
3
Merci
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

Merci CptPingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de CptPingu
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 24 juil. 2013 à 21:46
0
Merci
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...
Commenter la réponse de yann_lo_san
yopman21 4 Messages postés mardi 6 octobre 2009Date d'inscription 25 juillet 2013 Dernière intervention - 25 juil. 2013 à 09:46
0
Merci
Oui j'ai essayé en enlevant le free(DR.__ptr); mais j'obtiens le même résultat.
Commenter la réponse de yopman21
yopman21 4 Messages postés mardi 6 octobre 2009Date d'inscription 25 juillet 2013 Dernière intervention - 25 juil. 2013 à 10:02
0
Merci
... enfin incrémenter*
Commenter la réponse de yopman21

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.