Web service gsoap [Résolu]

Messages postés
4
Date d'inscription
mardi 6 octobre 2009
Dernière intervention
25 juillet 2013
- 24 juil. 2013 à 17:01 - Dernière réponse :
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 novembre 2018
- 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
Messages postés
4
Date d'inscription
mardi 6 octobre 2009
Dernière intervention
25 juillet 2013
- 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é 86 internautes ce mois-ci

Commenter la réponse de yopman21
Meilleure réponse
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 novembre 2018
- 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é 86 internautes ce mois-ci

Commenter la réponse de CptPingu
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 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
Messages postés
4
Date d'inscription
mardi 6 octobre 2009
Dernière intervention
25 juillet 2013
- 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
Messages postés
4
Date d'inscription
mardi 6 octobre 2009
Dernière intervention
25 juillet 2013
- 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.