Pb de pointeur

Résolu
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012 - 3 mai 2006 à 11:58
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012 - 3 mai 2006 à 15:41
Bonjour,

J'ai un problème avec un pointeur...
Contexte : j'envoie une trame à un periphérique connecté sur port série, le périphérique répond.

Mon problème se situe à la réception de la réponse.
Dans mon main j'appel une fonction "recevoir" qui va lire le buffer via une fonction lireBuffer après un WaitCommEvent (le port série ne me pose pas de problèmes). Lorsque je lis le buffer récupéré via ReadFile dans la fonction 'lireBuffer" ca marche, mais dans "recevoir" j'ai une erreur deboguage / envoyer le rapport d'erreur / ne pas envoyer).

// Permet de lire les octets dans le buffer du port série
int LiaisonSerie::lireBuffer(void * telBuffer)
{
    if(handleCom == NULL)
    { // si la connexion n'est pas établie
         messageErreur(Err_Connexion);
         return Err_Connexion;
    }


    //Pour connaitre le nombre d'octets dans le buffer d'entrée
    COMSTAT stat;
    DWORD errors;
    ClearCommError(handleCom,&errors,&stat); 
    
// nb de caracteres dans le buffer
int nbCarALire = stat.cbInQue;
   
    if(nbCarALire==0)
    { // si le buffer est vide
         messageErreur(Err_Buffer_Vide);
         return Err_Buffer_Vide;
    }
   
    telBuffer = new char(nbCarALire);
       
    //On effectue la lecture si il y a des caractères présents
    unsigned long nbCarLus = 0; 
    if(ReadFile(handleCom,telBuffer,nbCarALire,&nbCarLus,NULL)==0)
    { // Echec
        messageErreur(Err_Reception);
        return Err_Reception;
    }
   
    cout<<"nb caracteres a lire : "<<nbCarALire<<endl;
    cout<<"contenu buffer lu : "<<(char*)telBuffer<<"  taille : "<<strlen((char*)telBuffer)<<endl;
    cout<<"nb caracteres lus : "<<nbCarLus<<endl;
 
    return EXIT_SUCCESS; // la reception est finie
}// lireBuffer


//##############################################################################


// Permet de recevoir des octets sur le liaison série, si les données ne sont pas encore arrivée, on les attend telNbSecAttente secondes
int LiaisonSerie::recevoir(void * telBuffer)
{
    int nbCarALire = 0;
    int leRetour = Err_Buffer_Vide;
    while(leRetour == Err_Buffer_Vide)
    {
        if(!WaitCommEvent(handleCom, &commMask, NULL))
        {
            messageErreur(Err_WaitCommEvent);
            return Err_WaitCommEvent;
        }


        leRetour = lireBuffer(&telBuffer);
    }
   
    if(leRetour==Err_Reception)
        return Err_Reception;
       
              
//########### PROBLEME ###########
// Je n'arrive pas à affichier le contenu de telBuffer
// Dans la fonction lireBuffer ca marche, mais pas là. -> Message d'erreur (deboguage / envoyer le rapport d'erreur / ne pas envoyer)
    cout<<"(recevoir) telBuffer : "<<(char*)telBuffer<<endl;


    return EXIT_SUCCESS;
}// recevoir

int main()
{
 ....
 LiaisonSerie * comMoteur = new LiaisonSerie();.
 ...
 char * TrameRecueMoteur;
 comMoteur->recevoir(TrameRecueMoteur);
 ...
}

Note : mon main est OK le problème c'est mon buffer

Auriez-vous une idée ??

Merci pour votre aide

++

17 réponses

dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
3 mai 2006 à 13:54
celui-là marche, mais je me demande si il n'existerai pas une écriture plus propre ?

#include
#include <string.h>
using namespace std;


int test(void * &buf)
{
    buf = new char[5];
    memset(buf,'\0',5);
    strcpy((char*)buf,"test");
    cout<<"test : "<<(char*)buf<<endl;
    return 0;
}


int main()
{
    char * leBuf;
    test((void*&)leBuf);
    cout<<"main : "<<leBuf<<endl;
    delete(leBuf);
    system("PAUSE");
    return 0;
}

Merci
3
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
3 mai 2006 à 12:09
C'est bizarre tes allocations mémoire
new char(nbCarALire);

moi j'aurais fait comme ça new char[nbCarALire+1]; pour le \0 qui ne faut pas oublié.
Ensuite un memset(telBuffer, 0, nbCarALire+1);

Voilà
if(!Meilleur("Joky")) return ERREUR;<
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
3 mai 2006 à 12:26
new char(nbCarALire);
alloue en effet un seul caractère et l'initialise à la valeur nbCarALire
new char[nbCarALire];
alloue le tableau
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
3 mai 2006 à 12:28
Ah j'savais pas qu'il y avait ce genre de constructeur pour les char enfin constructeur c'est vite dit mais bon
Ca se rapproche de ce concept quand même

if(!Meilleur("Joky")) return ERREUR;<
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
3 mai 2006 à 13:16
ok,

j'ai essayer new char[nbCarALire], char[nbCarALire+1], char(nbCarALire+1), avec un memset(telBuffer,0,nbCarALire) ou memset(telBuffer,0,nbCarALire+1), mais toujours le même résultat.

Voilà ce qui s'affiche :

nb caracteres a lire : 1
contenu buffer lu : r  taille : 1
nb caracteres lus : 1
(recevoir) telBuffer :

Message d'erreur (deboguage / envoyer le rapport d'erreur / ne pas envoyer).

C'est un problème de pointeur... pas d'allocation

merci quand même

++
0
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
3 mai 2006 à 13:29
voilà un petit programme qui isole juste mon problème :

#include
#include <string.h>
using namespace std;


int test(void * buf)
{
    buf = new char(5);
    memset(buf,'\0',5);
    strcpy((char*)buf,"test");
    cout<<"test : "<<(char*)buf<<endl;
    return 0;
}


int main()
{
    char * leBuf;
    test(leBuf);
    cout<<"main : "<<leBuf<<endl;
    delete(leBuf);
    return 0;
}

Merci pour votre aide

a+
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
3 mai 2006 à 13:33
C'est l'allocation dans la fonction qui pose problème
Fait le hors de la fonction.

if(!Meilleur("Joky")) return ERREUR;<
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
3 mai 2006 à 13:34
et on ne fait pas new char(5)
mais new char[5];

comme expliqué ci-dessus

if(!Meilleur("Joky")) return ERREUR;<
0
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
3 mai 2006 à 13:36
je vais réessayer avec tes [], tu y tiens tant :)

en attendant vla un programme qui donne le résultat souhaité, mais je préfererai que l'ancien marche :

#include
#include <string.h>
using namespace std;


void * test(void * buf)
{
    buf = new char(5);
    memset(buf,'\0',5);
    strcpy((char*)buf,"test");
    cout<<"test : "<<(char*)buf<<endl;
    return buf;
}


int main()
{
    char * leBuf;
    leBuf = (char*)test(leBuf);
    cout<<"main : "<<leBuf<<endl;
    delete(leBuf);
    system("PAUSE");
    return 0;
}

merci

a+
0
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
3 mai 2006 à 13:38
new char[5] ça marche pas non plus...
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
3 mai 2006 à 13:40
Bé c'est pour toi qu'on dit ça sur les [] parce que new char( ... ) ça te construit un seul caractère et pas le nombre que tu veux donc forcément
après si tu veux écrire 5 caractères dedans pas possible...

if(!Meilleur("Joky")) return ERREUR;<
0
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
3 mai 2006 à 13:45
ok. En attendant je peux écrire 5 caractères dedans, essaye tu verras, et c'est avec mes pointeur le problème pas avec l'allocation.

Merci
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
3 mai 2006 à 14:31
salut.
tu peux peut etre faire comme ca :
char * test()
{
    char *buf = new char[5];
    memset(buf,'\0',5);
    strcpy((char*)buf,"test");
    cout<<"test : "<<(char*)buf<<endl;
    return buf;
}

int main()
{
    char * leBuf;
    leBuf = test();
    cout<<"main : "<<leBuf<<endl;
    delete(leBuf);
    system("PAUSE");
    return 0;
}
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
3 mai 2006 à 14:34
char* test()
{
    char* buf = new char[5];
    memset(buf,'\0',5);
    strcpy(buf,"test");
    cout<<"test : "<<buf<<endl;
    return buf;
}


int main()
{
    char * leBuf = test();
    cout<<"main : "<<leBuf<<endl;
    delete[] leBuf;
    system("PAUSE");
    return 0;
}
0
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
3 mai 2006 à 14:40
euhhh, je voulais une écriture plus propre pour :

#include
#include <string.h>
using namespace std;


int test(void * &buf)
{
    buf = new char[5];
    memset(buf,'\0',5);
    strcpy((char*)buf,"test");
    cout<<"test : "<<(char*)buf<<endl;
    return 0;
}


int main()
{
    char * leBuf;
    test((void*&)leBuf);
    cout<<"main : "<<leBuf<<endl;
    delete(leBuf);
    system("PAUSE");
    return 0;
}

je voudrais que test retourne toujours un entier, c'est pour les erreurs... je dois laisser les void*& ? pas d'autre écriture ?

Merci
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
3 mai 2006 à 14:43
si tu veux que test renvoi un entier et alloue la mémoire, il faut qu'un des 2 soit passé en référence...
Le mieux c'est quand même d'allouer le buffer avant d'appeler la fct, de le passer en paramètre ainsi que la taille
ton code d'erreur pourra alors renvoyer si des octets sonyt encore à lire parceque le buffer était trop petit
0
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
3 mai 2006 à 15:41
ok, merci.
0
Rejoignez-nous