Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[SUITE] Pointeurs, tableaux et passage de parametres

3 réponses
Avatar
widax
> Bon, on dirait que j'ai loupé le bogue...
>
> Compilateur, modèle utilisé (large/medium etc) ?
> Que dit le printf que je te proposes ?
>
> Et bien sûr la question du million : as-tu bien recopié le code ? est-ce que
> en entrée de myFunction la structure est bien remplie avec les bonnes
> valeurs ? Autrement, est-ce que le bogue n'est pas dans ce qui n'est pas
> présenté ?
>
>
> Antoine
>

Merci pour la reponse,

il s'agit d'un code embarqué (firmware) et le compilateur est MSVC
1.5, modèle large(memory model).

Pour l'affichage, je n'utilise donc pas de printf mais un sprintf qui
écrit dans un buffer, ce buffer est envoyé sur le reseau par le
firmware, et affiché sur mon PC...Il s'agit en fait de comparer 2
addresses MAC.

Apres <_fstrncpy(bufMACAddress, pBufReceive, 6);>
-----------------------------------------
Resultat de l'affichage avec <sprintf(bufTrace, "bufMACAddress=%6s,
pBufReceive=%6Fs", bufMACAddress, pBufReceive);>:
bufMACAddress= , pBufReceive=

Resultat de l'affichage avec <sprintf(bufTrace,
"bufMACAddress=%X.%X.%X.%X.%X.%X, pBufReceive=%X.%X.%X.%X.%X.%X",
bufMACAddress[0], bufMACAddress[1], bufMACAddress[2],
bufMACAddress[3], bufMACAddress[4], bufMACAddress[5],
pBufReceive[0], pBufReceive[1], pBufReceive[2], pBufReceive[3],
pBufReceive[4], pBufReceive[5]);>:
bufMACAddress=0.0.0.0.0.0, pBufReceive=0.60.E9.0.8F.D4
-----------------------------------------

Le pointeur pBufReceive contient donc bien les données, mais la copie
dans bufMACAddress ne fonctionne apparement pas.


le code un peu plus en détail:
-----------------------------------------
void _loadds far myFunction(CMDBLK far* cb, void far* arg)
{
//to store the received pointer
unsigned char far* pBufReceive;
//local MAC address
unsigned char bufLocalMACAddress[6];
//reveived MAC address
unsigned char bufMACAddress[6];
int nRet;
//buffer sent over the network, from Firmware to PC
char bufTrace[100];

//----- check receive success or not
if(cb->retcode != SUCCESS )
{
Trace("myFunction - Failed");
return;
}
Trace("Receiving NETWORK_CONFIG_REQUEST");

//----- process receive data here
pBufReceive = cb->recvbuf;

//get local MAC address
if (nRet = GetLocalEthAddr(bufLocalMACAddress) != SUCCESS) {return;}

//fill bufMACAddress
_fstrncpy(bufMACAddress, pBufReceive, 6);

//Trace 1
sprintf(bufTrace, "bufMACAddress=%6s, pBufReceive=%6Fs",
bufMACAddress, pBufReceive);
Trace(bufTrace);
//Trace 2
sprintf(bufTrace, "bufMACAddress=%X.%X.%X.%X.%X.%X,
pBufReceive=%X.%X.%X.%X.%X.%X",
bufMACAddress[0], bufMACAddress[1], bufMACAddress[2],
bufMACAddress[3], bufMACAddress[4], bufMACAddress[5],
pBufReceive[0], pBufReceive[1], pBufReceive[2], pBufReceive[3],
pBufReceive[4], pBufReceive[5]);
Trace(bufTrace);

//Compare bufMACAddress and bufLocalMACAddress
if (_fstrncmp(bufMACAddress, bufLocalMACAddress, 6) == 0)//Match
sprintf(bufTrace, "Match");
else//No match
sprintf(bufTrace, "No match");

//Trace 3
Trace(bufTrace);

//----- request to receive next data
if (udp_receive(nHandleUDPNetworkConfig, (unsigned char
far*)pBufReceive, DEF_MSS, myFunction, NULL_ARG) != SUCCESS)
{
Trace("myFunction - udp_receive() Failed");
return;
}
}
-----------------------------------------

Vu que la structure en entrée CMDBLK est remplie avec les bonnes
valeurs, je devrais pouvoir copier les 6 premiers caractères dans
bufMACAddress, c est pour cela que je me demandai si je passait
correctement les paramètres à _fstrncpy().

Si vous avez une idée, n'hésitez pas ! Merci

David Noyelle

davidnoyelle chez yahoo point fr

3 réponses

Avatar
Antoine Leca
En , DavenRave va escriure:
Il s'agit en fait de comparer 2 addresses MAC.
bufMACAddress=0.0.0.0.0.0, pBufReceive=0.60.E9.0.8F.D4
^


Utilise donc _fmemcpy à la place de _fstrncpy (ou bien change de fournisseur
de cartes Ethernet, et encore ;-))


Antoine

Avatar
David Noyelle
"Antoine Leca" wrote in message
news:ct8jml$o8j$
En , DavenRave va escriure:
Il s'agit en fait de comparer 2 addresses MAC.
bufMACAddress=0.0.0.0.0.0, pBufReceive=0.60.E9.0.8F.D4
^


Utilise donc _fmemcpy à la place de _fstrncpy (ou bien change de
fournisseur
de cartes Ethernet, et encore ;-))


Antoine



Bonjour,

effectivement, _fstrcpy() et _fstrcmp() n'ont pas l'air d'aimer
l'environnement embarqué alors que _fmemcpy() et _fmemcmp() fonctionnent
sans problème.

Merci !

David


Avatar
Charlie Gordon
"David Noyelle" wrote in message
news:41f8b44b$0$9764$

"Antoine Leca" wrote in message
news:ct8jml$o8j$
En , DavenRave va escriure:
Il s'agit en fait de comparer 2 addresses MAC.
bufMACAddress=0.0.0.0.0.0, pBufReceive=0.60.E9.0.8F.D4
^


Utilise donc _fmemcpy à la place de _fstrncpy (ou bien change de
fournisseur
de cartes Ethernet, et encore ;-))


Antoine



Bonjour,

effectivement, _fstrcpy() et _fstrcmp() n'ont pas l'air d'aimer
l'environnement embarqué alors que _fmemcpy() et _fmemcmp() fonctionnent
sans problème.


C'est de l'humour ?

strcpy et strcmp et leurs variantes infames strn* s'utilisent sur des chaines,
elles s'arretent sur le caractere ' '.
Tes adresses MAC sont des donnees binaires de 6 octets, qui commencent toutes
les 2 par 0x00 : strncpy ne recopie rien et remplit les buffers avec des ,
strncmp les trouvent identiques, mais n'en compare reellement que le premier
octet... t'as tout faux.
C'est pourquoi il faut utiliser memcpy et memcmp.

De plus en modele large tu peux laisser tomber les microsaletés comme far et les
prefixes _f...

Chqrlie.

PS: NE JAMAIS UTILISER STRNCPY !