C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

void* en string

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Michael
Guest





PostPosted: Tue Oct 03, 2006 10:33 pm    Post subject: void* en string Reply with quote



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





PostPosted: Tue Oct 03, 2006 10:43 pm    Post subject: Re: void* en string Reply with quote



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





PostPosted: Wed Oct 04, 2006 12:58 am    Post subject: Re: void* en string Reply with quote



Michael a écrit :

Quote:
p.resize(17);

reserve n'a aucune influence sur length
Back to top
James Kanze
Guest





PostPosted: Wed Oct 04, 2006 1:00 am    Post subject: Re: void* en string Reply with quote

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 Smile?
(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 Smile. 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') Smile. (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





PostPosted: Wed Oct 04, 2006 1:06 am    Post subject: Re: void* en string Reply with quote

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 Smile?
(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 Smile. 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') Smile. (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





PostPosted: Wed Oct 04, 2006 1:20 am    Post subject: Re: void* en string Reply with quote

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





PostPosted: Wed Oct 04, 2006 1:57 am    Post subject: Re: void* en string Reply with quote

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 Sad
Back to top
loufoque
Guest





PostPosted: Wed Oct 04, 2006 2:20 am    Post subject: Re: void* en string Reply with quote

Franck Branjonneau a écrit :

Quote:
Et resize ?

La lecture trop rapide a beaucoup de mauvaises influences.
Back to top
Fabien LE LEZ
Guest





PostPosted: Wed Oct 04, 2006 2:32 am    Post subject: Re: void* en string Reply with quote

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





PostPosted: Wed Oct 04, 2006 2:37 am    Post subject: Re: void* en string Reply with quote

Et bien, merci à tous les deux Wink
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.