 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Michael Guest
|
Posted: Tue Oct 03, 2006 10:33 pm Post subject: void* en string |
|
|
Bonsoir à tous,
je suis en train de créer une classe permettant de communiquer avec un port
COM, et je me heurte à un petit souci.
Voici la fonction permettant de récupérer les données du port COM:
//-------------------------------------------------------------------------
--
void COM_IO::GetData(std::string & data)
{
char * d = new char[data.length()];
DWORD o;
if (!ReadFile(hPortCOM, d, data.length(), &o , 0))
throw Exception("Impossible d'envoyer la séquence au port COM");
data = d;
delete[] d;
}
En fait, ce que j'aimerais éviter, c'est une fonction de ce type:
void COM_IO::GetData(char * data, unsigned int dataSize)
{
}
L'utilisateur utilisera la classe comme suit:
std::string p;
p.resize(17);
COM_IO * c = new COM_IO(1);
c->InitForRead();
while (1)
{
c->GetData(p);
if (stop)
break;
}
Mais actuellement, la string p retournée n'est absolument pas bonne...
Où est-ce que ça cloche à votre avis?
Merci d'avance
Mike |
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Tue Oct 03, 2006 10:43 pm Post subject: Re: void* en string |
|
|
On 03 Oct 2006 17:33:32 GMT, Michael <michael.at.gmail.dot.com>:
| Quote: | void COM_IO::GetData(std::string & data)
{
char * d = new char[data.length()];
DWORD o;
if (!ReadFile(hPortCOM, d, data.length(), &o , 0))
throw Exception("Impossible d'envoyer la séquence au port COM");
data = d;
|
Et s'il y a un '\0' qui traîne là-dedans, il coupera la chaîne.
Je verrais plutôt un truc de ce goût-là :
std::string GetData (size_t taille)
{
std::vector<char> buf (taille);
if (!ReadFile(hPortCOM, d, data.length(), &o , 0))
throw Exception("Impossible d'envoyer la séquence au port COM");
// T'es sûr que c'est le bon message ?
return std::string (buf.begin(), buf.end());
}
Si tu veux vraiment garder la même convention d'appel (bancale AMHA,
m'enfin bon...) :
void GetData (std::string& dest) // bof...
{
size_t const taille= buf.size();
std::vector<char> buf (taille);
if (!ReadFile(hPortCOM, d, data.length(), &o , 0))
throw Exception("Impossible d'envoyer la séquence au port COM");
// T'es sûr que c'est le bon message ?
dest= std::string (buf.begin(), buf.end());
} |
|
| Back to top |
|
 |
loufoque Guest
|
Posted: Wed Oct 04, 2006 12:58 am Post subject: Re: void* en string |
|
|
Michael a écrit :
reserve n'a aucune influence sur length |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Wed Oct 04, 2006 1:00 am Post subject: Re: void* en string |
|
|
Fabien LE LEZ wrote:
| Quote: | On 03 Oct 2006 17:33:32 GMT, Michael <michael.at.gmail.dot.com>:
void COM_IO::GetData(std::string & data)
{
char * d = new char[data.length()];
DWORD o;
if (!ReadFile(hPortCOM, d, data.length(), &o , 0))
throw Exception("Impossible d'envoyer la séquence au port COM");
data = d;
Et s'il y a un '\0' qui traîne là-dedans, il coupera la chaîne.
|
Et s'il n'y en a pas, ça risque d'être encore plus amusant, non ?
(Pense à comment std::string cherche la longueur quand tu ne lui
donne pas explicitement.)
Je ne connais pas la fonction ReadFile, mais il doit bien être
possible d'en récouperer la longueur lue quelque part. Puis :
data.assign( d, longueurLue ) ;
| Quote: | Je verrais plutôt un truc de ce goût-là :
std::string GetData (size_t taille)
{
std::vector<char> buf (taille);
if (!ReadFile(hPortCOM, d, data.length(), &o , 0))
|
C'est quoi, d ?
Pendant que j'y suis, je ne vois pas de o ni de data non plus.
L'idée d'utiliser un std::vector< char > me semble bonne, mais
il y a encore des choses à faire. (Sous Unix, j'aurais écrit :
std::vector< char > buf( taille ) ;
ssize_t lu = read( hPortCOM, &buf[ 0 ], buf.size() ) ;
if ( lu == -1 ) {
throw Exception( "Erreur de lecture" ) ;
}
return std::string( buf.begin(), buf.begin() + lu ) ;
.. Convertir le read en ReadFile, et ça doit faire l'affaire sous
Windows aussi.)
| Quote: | throw Exception("Impossible d'envoyer la séquence au port COM");
// T'es sûr que c'est le bon message ?
return std::string (buf.begin(), buf.end());
}
Si tu veux vraiment garder la même convention d'appel (bancale AMHA,
m'enfin bon...) :
|
Je doute que ce soit le cas ici, mais ça m'est déjà arrivé de
passer un Container& plutôt que de renvoyer un Container pour
des motifs de performance. (Dans mon cas, le Container, c'était
un pré-STL équivalent à std::list. Avec en moyen 60.000
entrées.)
| Quote: | void GetData (std::string& dest) // bof...
{
size_t const taille= buf.size();
std::vector<char> buf (taille);
|
J'adore . On démande à l'objet qui n'existe pas sa taille
pour qu'on puisse lui dire d'avoir cette taille.
(Manifestement, il te manque du sommeil, ou du café, ou quelque
chose. Mais il faut avouer, le résultat ici pose une question
métaphysique assez intéressante.)
| Quote: | if (!ReadFile(hPortCOM, d, data.length(), &o , 0))
|
Et on continue. Ayant soigneusement construit le buf avec la
taille qu'il a dit qu'il a, on ne s'en sert plus, lui préférant
des symboles jamais vus avant. (Je suis en train de supposer que
hPortCOM est une variable globale, vue que Michael ne l'a pas
déclarée non plus. Et je suis sûr qu'avec un peu plus de
sommeil, tu lui aurais indiqué que ce n'est pas une bonne idée
non plus.)
| Quote: | throw Exception("Impossible d'envoyer la séquence au port COM");
// T'es sûr que c'est le bon message ?
dest= std::string (buf.begin(), buf.end());
|
Au moins on sait ce que la chaîne va contenir : que des char()
(c-à-d des '\0') . (Et je suppose que c'est le sommeil aussi
qui t'a fait utiliser l'opérateur d'affectation, plutôt que la
fonction membre assign().)
> } |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Wed Oct 04, 2006 1:06 am Post subject: Re: void* en string |
|
|
Fabien LE LEZ wrote:
| Quote: | On 03 Oct 2006 17:33:32 GMT, Michael <michael.at.gmail.dot.com>:
void COM_IO::GetData(std::string & data)
{
char * d = new char[data.length()];
DWORD o;
if (!ReadFile(hPortCOM, d, data.length(), &o , 0))
throw Exception("Impossible d'envoyer la séquence au port COM");
data = d;
Et s'il y a un '\0' qui traîne là-dedans, il coupera la chaîne.
|
Et s'il n'y en a pas, ça risque d'être encore plus amusant, non ?
(Pense à comment std::string cherche la longueur quand tu ne lui
donne pas explicitement.)
Je ne connais pas la fonction ReadFile, mais il doit bien être
possible d'en récouperer la longueur lue quelque part. Puis :
data.assign( d, longueurLue ) ;
| Quote: | Je verrais plutôt un truc de ce goût-là :
std::string GetData (size_t taille)
{
std::vector<char> buf (taille);
if (!ReadFile(hPortCOM, d, data.length(), &o , 0))
|
C'est quoi, d ?
Pendant que j'y suis, je ne vois pas de o ni de data non plus.
L'idée d'utiliser un std::vector< char > me semble bonne, mais
il y a encore des choses à faire. (Sous Unix, j'aurais écrit :
std::vector< char > buf( taille ) ;
ssize_t lu = read( hPortCOM, &buf[ 0 ], buf.size() ) ;
if ( lu == -1 ) {
throw Exception( "Erreur de lecture" ) ;
}
return std::string( buf.begin(), buf.begin() + lu ) ;
.. Convertir le read en ReadFile, et ça doit faire l'affaire sous
Windows aussi.)
| Quote: | throw Exception("Impossible d'envoyer la séquence au port COM");
// T'es sûr que c'est le bon message ?
return std::string (buf.begin(), buf.end());
}
Si tu veux vraiment garder la même convention d'appel (bancale AMHA,
m'enfin bon...) :
|
Je doute que ce soit le cas ici, mais ça m'est déjà arrivé de
passer un Container& plutôt que de renvoyer un Container pour
des motifs de performance. (Dans mon cas, le Container, c'était
un pré-STL équivalent à std::list. Avec en moyen 60.000
entrées.)
| Quote: | void GetData (std::string& dest) // bof...
{
size_t const taille= buf.size();
std::vector<char> buf (taille);
|
J'adore . On démande à l'objet qui n'existe pas sa taille
pour qu'on puisse lui dire d'avoir cette taille.
(Manifestement, il te manque du sommeil, ou du café, ou quelque
chose. Mais il faut avouer, le résultat ici pose une question
métaphysique assez intéressante.)
| Quote: | if (!ReadFile(hPortCOM, d, data.length(), &o , 0))
|
Et on continue. Ayant soigneusement construit le buf avec la
taille qu'il a dit qu'il a, on ne s'en sert plus, lui préférant
des symboles jamais vus avant. (Je suis en train de supposer que
hPortCOM est une variable globale, vue que Michael ne l'a pas
déclarée non plus. Et je suis sûr qu'avec un peu plus de
sommeil, tu lui aurais indiqué que ce n'est pas une bonne idée
non plus.)
| Quote: | throw Exception("Impossible d'envoyer la séquence au port COM");
// T'es sûr que c'est le bon message ?
dest= std::string (buf.begin(), buf.end());
|
Au moins on sait ce que la chaîne va contenir : que des char()
(c-à-d des '\0') . (Et je suppose que c'est le sommeil aussi
qui t'a fait utiliser l'opérateur d'affectation, plutôt que la
fonction membre assign().)
> } |
|
| Back to top |
|
 |
Franck Branjonneau Guest
|
Posted: Wed Oct 04, 2006 1:20 am Post subject: Re: void* en string |
|
|
loufoque <loufoque (AT) remove (DOT) gmail.com> écrivait:
| Quote: | Michael a écrit :
p.resize(17);
reserve n'a aucune influence sur length
|
Et resize ?
--
Franck Branjonneau |
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Oct 04, 2006 1:57 am Post subject: Re: void* en string |
|
|
On 3 Oct 2006 13:00:58 -0700, "James Kanze" <kanze.james (AT) neuf (DOT) fr>:
| Quote: | (Manifestement, il te manque du sommeil, ou du café, ou quelque
chose.
|
Yep. Depuis hier matin, j'évite au maximum de faire quoi que ce soit
d'important, car je ne fais que des conneries  |
|
| Back to top |
|
 |
loufoque Guest
|
Posted: Wed Oct 04, 2006 2:20 am Post subject: Re: void* en string |
|
|
Franck Branjonneau a écrit :
La lecture trop rapide a beaucoup de mauvaises influences. |
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Oct 04, 2006 2:32 am Post subject: Re: void* en string |
|
|
On 3 Oct 2006 13:06:42 -0700, "James Kanze" <kanze.james (AT) neuf (DOT) fr>:
| Quote: | (Manifestement, il te manque du sommeil,
|
C'est plutôt l'inverse : j'ai dormi dix-huit heures de rang, et
depuis, je n'arrive pas à me réveiller.
| Quote: | ou du café, ou quelque chose.
|
J'en suis arrivé à voir double : je vois le même message deux fois
(<news:1159906002.589567.216450 (AT) m7g2000cwm (DOT) googlegroups.com> et
<news:1159905658.909990.183150 (AT) i42g2000cwa (DOT) googlegroups.com>). |
|
| Back to top |
|
 |
Michael Guest
|
Posted: Wed Oct 04, 2006 2:37 am Post subject: Re: void* en string |
|
|
Et bien, merci à tous les deux  |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|