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 :

Malloc par une fonction


Sujet :

C

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut Malloc par une fonction
    Bonjour,

    J'ai un petit soucis avec une fonction que j'ecris,

    Elle fonctionne un peu comme Explode de php, c'est à dire qu'elle segmente une chaine selon un separateur.

    Elle est specifique à mon soft car les chaines qu'elle doit segmenter sont formater de façon à avoir toujours un separateur final :
    ex : test;Toto;paul;

    Ma fonction :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    void strExplode(const char* sChaine, const char separator, int iLnOfExpMax, char **sOutExp, int *iOutNExp){
        int i,
            iDeb = 0,               // Marque le debut d'une nouvelle chaine
            iIndice =  0,           // OffSet de parcours dans le tableau de chaine
            ln = strlen(sChaine);   // Longueur totale de la chaine
            
        (*iOutNExp) = 0; // nombre de separateur trouve
        
        // Nombre d'occurence du separateur dans la chaine
        for(i=0; i<ln; i++){
            if (sChaine[i] == separator){
                (*iOutNExp)++;
            }
        }
        
        // Allocation de la  mémoire
        sOutExp = (char **) malloc ( (*iOutNExp) * sizeof (char *) ); // allocation d'un tableau de pointeur sur "iOutNExp" chaines
        for(i=0; i<(*iOutNExp);i++){
            *(sOutExp+i) = (char *) malloc ( iLnOfExpMax * sizeof (char) ); // allocation d'une chaine de longueur "iLnOfExpMax"
        }
        
        for(i=0; i<ln; i++){
            if (sChaine[i] == separator){
                strncpy(*(sOutExp+iIndice), sChaine + iDeb, i-iDeb);    // copie du segment selectionne
                *( *(sOutExp+iIndice) + i - iDeb) = 0;                  // caractere de fin de chaine
                iIndice++;
                iDeb = i+1; // Repositionnement de l'OffSet
            }
        }
        
        /*
        for (i=0; i<(*iOutNExp); i++){
            gotoxy(0,4+i);
            printf("%s", sOutExp[i]);
        }
        
        // Libération de la memoire
        for(i=0; i<(*iOutNExp);i++){
            free( *(sOutExp+i) );
        }
        free(sOutExp);
        /**/
    }
    Quand je la debug avec le code qui est commenté, tout va bien,
    je recupere bien mes chaines de caracteres

    Seulement, quand jeveux l'utiliser apres, ca plante (nb: je developpe en embarqué, mon plantage est en fait : l'ecran video est remplis de caractere illisible et le soft est figé)

    Voila comment je tente de l'utiliser :
    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
     
    int iNbrTarif;
    char  **tarif;
     
     
    strExplode("test;Toto;paul;", ';', 36, tarif, &iNbrTarif);
     for (i=0; i<iNbrTarif; i++){
        gotoxy(0,4+i);
        printf("%s", tarif[i]);
    }
     
    // Libération de la memoire
    for(i=0; i<iNbrTarif;i++){
        free( *(tarif+i) );
    }
    free(tarif);
    A votre avis, cela peut venir d'ou ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    c'est parce que tu passes le pointeur sOutExp et non pas son adresse, (problème habituel )
    Regarde ce thread :http://www.developpez.net/forums/sho...d.php?t=144682
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par firejocker
    Seulement, quand jeveux l'utiliser apres, ca plante (nb: je developpe en embarqué, mon plantage est en fait : l'ecran video est remplis de caractere illisible et le soft est figé)
    Logique, faut que tu rendes la zone mémoire que tu viens d'allouer ou alors que tu l'écrives en passant l'adresse d'une variable de type char *.

    Toi tu passes un char**.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char  **tarif;
     
    strExplode("test;Toto;paul;", ';', 36, tarif, &iNbrTarif);
    Tous les paramétres en C sont passés par valeur, aucun paramètre ne peut être changé par la fonction (d'un point de vue plus global, cela veut dire que si tu changes la valeur DANS la fonction appelée, la fonction appelante ne verra aucun changement). Donc tarif ne pourra pas être changé par la fonction. Si elle vaut 1234 avant, elle vaudra 1234 après.

    Ceci est vrai pour les pointeur aussi. L'adresse donnée par le pointeur ne change pas c'est la donnée dans la zone pointée qui change.

    Donc il faut que tu passes l'adresse d'un char** pour que ton code fonctionne. Donc ta fonction doit prendre un char*** ou rendre un char**.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char  **tarif;
     
     strExplode("test;Toto;paul;", ';', 36, &tarif, &iNbrTarif);

    Et modifier ton code, car ce que tu dois faire est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *sOutExp = (char **) malloc ( (*iOutNExp) * sizeof (char *) );
    Jc

    [EDIT]
    Devancé par TrapD , ça m'apprendra d'aller chercher à boire...
    [/EDIT]

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    650
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 650
    Points : 546
    Points
    546
    Par défaut Argh !
    Quelle tache !

    Jongler avectous ces pointeurs et planter sur un truc aussi evident !!

    merci.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par fearyourself
    [EDIT]
    Devancé par TrapD , ça m'apprendra d'aller chercher à boire...
    [/EDIT]
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA]Affectation d'une valeur à une cellule par une fonction
    Par lallougri dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 27/02/2006, 14h24
  2. retourner un vector a 2 dimensions par une fonction
    Par Psykotik dans le forum SL & STL
    Réponses: 7
    Dernier message: 18/11/2005, 17h45
  3. Réponses: 11
    Dernier message: 31/10/2005, 17h59
  4. [LG]résultat renvoyé par une fonction
    Par le 27 dans le forum Langage
    Réponses: 3
    Dernier message: 10/12/2003, 10h31
  5. tableau javascript ecrit par une fonction asp
    Par LineLe dans le forum ASP
    Réponses: 4
    Dernier message: 03/11/2003, 08h38

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