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

C++ Discussion :

Récupération de données


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Récupération de données
    Bonjour,
    J'ai un petit problèmes pour récupérer des données dans une variable.
    Dans le code source que je modifie j'ai un variable :
    unsigned char *tab[450];

    Moi je veux récupérer les caractères tab[42] à tab[46] par exemple, (mais le caractère final peut être à la position 48, donc je ne peux pas utilisé de code en fixe)

    et ma variable de stockage est
    gchar *MaVariable;

    Petit exemple pour vous aider à comprendre ce que j'ai essayé de vous expliquer;

    tab[42] = A;
    tab[43] = B;
    tab[44] = C;
    tab[45] = E;
    tab[46] = F;

    et je veux
    MaVariable = 'ABCDEF'

    Je vous remercie pour votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Points : 85
    Points
    85
    Par défaut
    Ton problème n'est pas très clair.
    En tous cas, le code de peut pas deviner la variable manquante par magie, il faut que tu lui impose un algorithme selon tes besoins.

  3. #3
    Membre actif
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Points : 213
    Points
    213
    Par défaut
    tu veux créer une chaine ?
    -> std::copy + std::back_inserter ( sauf erreur ) .

    'ABCD' ne veux rien dire. C'est "ABCD" que tu cherches ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 16
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 65
    Points
    65
    Par défaut
    autant utiliser strcpy:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncpy(MaVariable, & (tab[42]), 6);
    Au passaga, il faudra d'abord allouer MaVariable et au lieu de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *tab[450];
    Ne serait-ce pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char tab[450];
    ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Points : 148
    Points
    148
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        char string[] = "Hello world !!!";
        char tmpString[1024];
        memset(tmpString, 0, strlen(tmpString));
        memcpy(tmpString, &string[6],5);
    tmpString = "world".

    Je pense que c'est ça que tu cherches, mais ce n'est pas trop du C++...
    Et en C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char string[] = "Hello world !!!";
        char tmpString[1024];
        std::fill(&tmpString[0], &tmpString[1024], 0);
        std::memcpy(&tmpString[0],&string[6],5);
    Bien que les chaines de char soit plutôt C, je pense que ce code peut-être compris comme du C++.

  6. #6
    Membre régulier Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par yamashi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        char string[] = "Hello world !!!";
        char tmpString[1024];
        memset(tmpString, 0, strlen(tmpString));
        memcpy(tmpString, &string[6],5);
    tmpString = "world".
    Non... tmpString = "worldIU_çèsdyvhsdçi_çèvysiceh_z_çey"

    Si le contenu "aléatoire" de tmpString commençait avec un '\000', le memset ferait rien parce que strlen(tmpString) == 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        char string[] = "Hello world !!!";
        char tmpString[1024];
        memset(tmpString, 0, sizeof(tmpString));
        memcpy(tmpString, &string[6],5);
    ça sera mieux.

    Ou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        std::string helloWorld = "Hello world !!!";
        std::string tmpString = helloWorld.substr(6,5);

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::memcpy(&tmpString[0],&string[6],5);
    Pas de memcpy pour copier des chaînes de caractères !!!

    Le jour où tu migreras vers l'unicode, ce seront de longues prises de têtes pour faire la différence entre les copies de chaîne et les copies d'objets...

    Il faut utiliser strncpy, qui elle est faite pour travailler sur des chaînes de caractères .

  8. #8
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je vous remercie pour vos réponses, je vais faire quelques tests et je vous ferai un retour, si ça marche et si ça marche pas aussi.

    Sinon pour le *tab[450], je modifie du code source, et cette variable est déclaré avec *

    Et oui c'est bien "ABCD" que je veux et non 'ABCD'

    En tout cas merci pour les conseils

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 16
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 65
    Points
    65
    Par défaut
    Salut,

    Dans ce cas tab un pointeur sur tableau, les codes ci-dessus ne marcheront pas.

    Il faudrait voir comment il est géré dans le programme pour savoir quoi faire.

  10. #10
    Membre actif Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Points : 237
    Points
    237
    Par défaut
    Citation Envoyé par Dreambeliever Voir le message
    Salut,

    Dans ce cas tab un pointeur sur tableau, les codes ci-dessus ne marcheront pas.

    Il faudrait voir comment il est géré dans le programme pour savoir quoi faire.
    Non c'est un tableau de char*.

  11. #11
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bon voila ce que j'ai fait,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    gchar		*MaVariable;
     
    tempo = malloc(sizeof(gchar));
    strncpy(MaVariable , &(tab[42]), 4);
    Mais il me reste un problème,
    les 4 premier caractère de MaVariable sont les bons mais en revanche, j'ai des caractères non désiré par la suis :
    tab[42] == "6";
    tab[42] == "4";
    tab[42] == "0";
    tab[42] == "3";
    MaVariable : "6403«««««þîþîþîþ"

    Il me semble qu'ils sont ajouté au moment de l'allocation, mais je ne sais pas comment les ôter.

    En tout cas je vous remercie pour votre aide

  12. #12
    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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    c'est quoi gchar, si c'est un alias pour char, ton problème s'explique car tu alloues que 4 octets : malloc(sizeof(gchar))
    Tu n'as donc pas le droit d'aller jardiner après
    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
    .

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut
    Pourquoi se prendre la tête avec des char* et des strncopy quand on est en C++ alors que la STL nous tend les bras :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Ton tableau de char représenté par une std::string
    std::string tab;
     
    // Ton index de départ (unsigned int)
    size_t index = 42;
     
    // Nombre de caractères à récupérer
    size_t nbr = 4;
     
    // Stockage du résultat dans une std::string
    std::string result = tab.substr(index, nbr);
    Ensuite tu peut récupérer tes caractères avec l'opérateur [].

    Plus de renseignements sur la doc de la STL : ici

  14. #14
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    strncpy ne rajoute pas le 0 terminal, c'est ça qu'il te manque à la fin de ta chaîne (les joies de gérer les chaînes avec la libc...).

    Je plussoie pour une solutions basée sur la stl.

  15. #15
    Membre régulier Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    c'est quoi gchar, si c'est un alias pour char, ton problème s'explique car tu alloues que 4 octets : malloc(sizeof(gchar))
    Tu n'as donc pas le droit d'aller jardiner après
    gchar est vraiment un alias pour char, et donc il alloue qu'une seule unité de memoire (c-a-d un octet pour les systèmes modernes)... Eh bien, c'est bien vrai qu'on ne doit pas aller jardiner après...

  16. #16
    Membre régulier Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    strncpy ne rajoute pas le 0 terminal, c'est ça qu'il te manque à la fin de ta chaîne (les joies de gérer les chaînes avec la libc...).

    Je plussoie pour une solutions basée sur la stl.
    strncpy rajoute le 0 terminal s'il y a assez d'éspace pour le faire.

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/04/2004, 10h09
  2. Réponses: 2
    Dernier message: 20/02/2004, 08h47
  3. [ DB2] => [ORACLE] Récupération de données
    Par LeDid dans le forum DB2
    Réponses: 3
    Dernier message: 25/06/2003, 17h10
  4. Réponses: 13
    Dernier message: 20/03/2003, 08h11
  5. [XMLRAD] récupération de donnée
    Par Mitch79 dans le forum XMLRAD
    Réponses: 7
    Dernier message: 30/01/2003, 15h36

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