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

Pointeurs, tableaux et passage de parametres

3 réponses
Avatar
David Noyelle
Bonjour a tous,

j'ai besoin de comparer les N premiers elements d'un tableau de char avec
les N premiers elements d'un pointeur sur char. J'utilise la fonction
_fstrncpy() et j'aurai aime quelques explications sur le passage des
parametres.

le code:
-------------------------------------------------------------------------------
void _loadds far myFunction(MY_STRUCT far* myStruct, void far* pArg)
{
unsigned char far* pBuf;
unsigned char buf[6];
unsigned char buf2[6];

//myStruct->recvbuf est de type unsigned char far*
pBuf = (unsigned char far*)myStruct->recvbuf;

//initialisation de buf avec les 6 premiers elements de pBuf
_fstrncpy(buf, pBuf, 6);//Comment passer les parametres (buf est un
tableau, pBuf est un pointeur)?

//initialisation de buf2
strncpy(buf2, "abcdef", 6);

//comparaison de buf et buf2
if(strncmp(buf, buf2, 6) == 0)
printf("Match");
else
printf("No match");
}
-------------------------------------------------------------------------------
Je n'arrive pas a recuperer les 6 premiers elements de pBuf dans buf car je
ne dois pas passer les parametres correctement lors de l'appel de la
fonction _fstrncpy().

J'ai fait quelques essais (cast, passage par addresse, etc...):

_fstrncpy((unsigned char far*)buf, pBuf, 6);
_fstrncpy((unsigned char far*)&buf[0], &pBuf[0], 6);//copie de l'adresse du
premier element ?
[.....]

Si quelqu'un pouvait m'expliquer comment passer les parametres correctement
(d'une maniere generale, quand est-ce qu'il est preferable d'utiliser un
cast, l'operateur d'adresse &, etc...), cela m'aiderai beaucoup.

Merci d'avance,

--
David NOYELLE
davidnoyelle chez yahoo point fr

3 réponses

Avatar
Antoine Leca
En 41f78384$0$21758$, David Noyelle va escriure:
j'ai besoin de comparer les N premiers elements d'un tableau de
char avec les N premiers elements d'un pointeur sur char.


strncmp (ou _fstrncmp) te tend les bras...


void _loadds far myFunction(MY_STRUCT far* myStruct, void far* pArg)
^^^^^^^

Que de souvenirs...

unsigned char far* pBuf;
unsigned char buf[6], buf2[6];

//myStruct->recvbuf est de type unsigned char far*
pBuf = (unsigned char far*)myStruct->recvbuf;


Si le commentaire est correct, j'enlèverais le transtypage inutile, cela
peut masquer des messages d'avertissements intéressants.


//initialisation de buf avec les 6 premiers elements de pBuf
_fstrncpy(buf, pBuf, 6);//Comment passer les parametres (buf
est un tableau, pBuf est un pointeur)?


Aucun souci, en C un tableau est passé en paramètre comme un pointeur vers
son premier élément. Si tu as bien mis un #include correct, le prototype de
_fstrncpy va forcer la conversion nécessaire et ça roule.

printf("buf=%.6s pBuf=%.6Fsn", buf, pBuf);

peut t'apporter un éclairage intéressant à ce point de l'histoire.

//initialisation de buf2
strncpy(buf2, "abcdef", 6);


N'oublie pas que "abcdef" possède 7 caractères (il y a un caractère '' au
bout pour indiquer que rien ne vient derrière... mais toi ne le recopies
pas.
Enfin là cela n'a pas d'influence.


//comparaison de buf et buf2
if(strncmp(buf, buf2, 6) == 0)
printf("Match");
--------------------------------------------------------------------------
-----

Je n'arrive pas a recuperer les 6 premiers elements de pBuf dans
buf car je ne dois pas passer les parametres correctement lors de
l'appel de la fonction _fstrncpy().


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

Avatar
David Noyelle
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

--

davidnoyelle chez yahoo point fr

Avatar
Yves ROMAN


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.



Tes données commencent avec un '' : les fonctions strncpy(), strncmp(),
sprintf("%s") s'arrêtent donc au debut car elles sont prévues pour traiter des
'strings' qui ne contiennent de '' qu'a la fin.
Utilise plutot des memcpy() et memcmp() sur 6 octets