IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

probleme avec les malloc snprintf


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 30
    Par défaut probleme avec les malloc snprintf
    Bonjour a tous, j'ai un petit soucis concernant la fonction malloc et snprintf:
    Voila le sequencement de mon programme:
    1. lecture des donnees dans un pipe (ex de donnees lues: 0xFDOO1F4142..... c'est du texte code en ASCII ne depassant pas 100 caracteres)
    2. allocation dynamique de memoire de la taille des donnees lues dans le pipe
    3. ecriture du message recu dans le pipe dans un ficher texte


    Voici le code isole effectuant ces operations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    char *pMessageToSend;
    int i;
    char messageToReceive[1024];
     
    fileRead  = ReadFile(
                      gphAutomaticTestTool_HandlePipe,
                      messageToReceive,
                      1024,
                      &bytesRead,
                      NULL);
     
    pMessageToSend = malloc(bytesRead);
     
    for(i = 0; i < bytesRead; i++)
                            {
                            snprintf(&pMessageToSend[i],
    			sizeof(pMessageToSend),
    			"%c",
    			messageToReceive[i]);
                            }
     
    written = fwrite(pMessageToSend,
                            1,
                            strlen(pMessageToSend),
                            gpphAutomaticTestTool_ErrorFile);
     
    free(pMessageToSend);
    Le probleme que je rencontre est: The memory at "0x79c...." could not be read ou un probleme de socket error 10055.

    J'ai probablement mal utilise snprintf ou le malloc. Merci de votre lumiere.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je pense que c'est la séquence "strlen(pMessageToSend" lors du fwrite() qui va pas.

    En effet, la chaine que tu écris n'est pas terminée par la caractère 0, donc, le strlen va foirer (strlen() se base sur ce caractère pour calculer la longuer de la chaine)

    Question 1:
    pourquoi tu ne remplace pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for(i = 0; i < bytesRead; i++)
    {
       snprintf(&pMessageToSend[i],
    			sizeof(pMessageToSend),
    			"%c",
    			messageToReceive[i]);
    }
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    memcpy(pMessageToSend, messageToReceive, bytesRead);
    Question 2:
    Pourquoi fais tu une copie intermédiaire avant l'appel à fwrite(), tu pourrais faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    fileRead  = ReadFile(
                      gphAutomaticTestTool_HandlePipe,
                      messageToReceive,
                      1024,
                      &bytesRead,
                      NULL);
    written = fwrite(messageToReceive,
                            1,
                            bytesRead,
                            gpphAutomaticTestTool_ErrorFile);
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 30
    Par défaut Probleme avec les malloc et snprintf
    Merci de ta reponse et voila la reponse a tes questions:
    Oui j'ai oublie des etapes dans ma sequence d'operations

    Question1: je veux recuperer les valeur code en ASCII et les convertir pour lesenregistrer dans le fichier en caractere

    Question2: elle decoule de la question 1. je formatte ma chaine a enregistrer. En gros je lis les caracteres ASCII dans le pipe et les transforme en texte pour les enregistrer dans un fichier


    Voila merci. Par contre concernant le "strlen" lors du fwrite() il faudrait le remplacer par une autre fonction du genre sizeof(pMessageToSend) ???

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    D'abord, tu lis des caractères dans "messageToReceive" à l'aide de la focntion ReadFile()

    Ensuite tu dupliques la chaine recue

    Ensuite tu transmets cette chaine dupliquée à l'aide de fwrite()

    Pour info, ta duplication est fausse car sizeof(pMessageToSend) va toujours te donner 4 (taille d'un pointeur) et non 1 (taille d'un caractère comme je pense que tu souhaites). La variable pMessageToSend est un pointeur, par contre sizeof(*pMessageToSend) va te donner 1 (taille de l'objet pointé par pMessageToSend)

    Autre chose, je simplifie et schématise ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char carac = 'a';
    char autre_carac;
    snprintf(&autre_carac, sizeof(new_carac), "%c", carac)
    c'est ce que tu fais dans ta boucle for(i = 0; i < bytesRead; i++) c'est exactement la même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char carac = 'a';
    char autre_carac;
    autre_carac = carac;
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 30
    Par défaut Probleme avec les malloc et snprintf
    Ok c'est juste ce que tu me dis.
    le hic c'est que la boucle for sert a convertir les donnees en ASCII du pipe en texte dans la variable tampon "pMessaToSend".
    C'est du texte que je veux ecrire dans le ficher et pas le code ASCII.

    Sinon le sizeof est correct car j'affiche bien les caracteres souhaite. Si je passe le sizeof(*pMessaToSend) j'ai des caracteres indesire a la fin.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    OK, je commence à comprendre,

    tu reçois une chaine de caractères "414243" et tu veux écrire "ABC"

    Quel est le format de la chaine de caractères que tu reçois ?

    C'est de l'héxadecimal tout le temps (donc un caractère en sortie utilise 2 caractère en entrée) ?

    Est ce que le début de la chaine en entrée commence par "0x" ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  2. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  3. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32
  4. Problem avec les *.AVI sur les panels
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/08/2003, 22h50
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo