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.
//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.
//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
En 41f78384$0$21758$626a14ce@news.free.fr, 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)
^^^^^^^
//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é ?
//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
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",
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
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",
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().
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",
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
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",
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
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",
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
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",
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