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 :

Problème de taille de tableau


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut Problème de taille de tableau
    Bonjour,

    Je n'arrive pas vraiment à trouver la source du problème, je présume que le problème vient de la taille du tableau, mais aucune certitude. Ou alors une mauvaise utilisation de realloc ?

    On va prendre un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data[] = "aaa\\0zzz\\0\\0";
    La taille de data est donc bien de 12+1.

    Le but est d'obtenir tableau de telle sorte que :

    tableau[0] = a
    tableau[1] = a
    tableau[2] = a
    tableau[3] = '\0'
    tableau[4] = z
    tableau[5] = z
    tableau[6] = z
    tableau[7] = '\0'
    tableau[8] = '\0'

    Le but est donc de remplacer le \ et le 0 par '\0'. La taille de tableau est donc égale à la taille de data, caractère nul non compris, donc ici 12, moins le nombre de fois ou l'on rencontre à la suite les deux caractères \ et 0 dans la chaîne data, soit 3 ici : d'où taille de tableau = 9.

    J'ai codé la fonction suivante...

    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
       int b = -1;
                int taille = 0;
                int count = 0;
     
                char *tableau = NULL;
     
                if ((tableau = (char*)malloc(COMPTER_CH(data))) == NULL)
                {
                    printf("Erreur d'allocation mémoire !\n");
                }
     
                while (++b <= COMPTER_CH(data)-count)
                {
                    if (data[b] == '0' && data[b-1] == '\\')
                    {
                        continue;
                    }
     
                    if (data[b] == '\\' && data[b+1] =='0')
                    {
                        if ((tableau = realloc(tableau, COMPTER_CH(data)-(++count))) != NULL)
                        {
                            tableau[taille] = '\0';
                            taille += 1;
                        }
                        else
                        {
                            printf("Erreur d'allocation mémoire !\n");
                        }
                    }
                    else
                    {
                    tableau[taille] = data[b];
                    taille += 1;
                    }
                }
    Elle n'est pas bien codé... je suis preneur de conseils à ce niveau au passage.

    En testant avec des printf ça donne :

    taille de tableau = 12
    b = 0
    tableau[0] = a
    b = 1
    tableau[1] = a
    b = 2
    tableau[2] = a
    b = 3
    taille de tableau = 11
    tableau[3] = <null>
    b = 4
    b = 5
    tableau[4] = z
    b = 6
    tableau[5] = z
    b = 7
    tableau[6] = z
    b = 8
    taille de tableau = 10
    tableau[7] = <null>
    b = 9
    b = 10
    taille de tableau = 9
    tableau[8] = <null>
    Le résultat est... bon.

    Seulement, quand j'envoie tableau à RegSetValueEx, dans le registre, j'obtiens ça :

    61,00,61,00,61,00,00,00,7a,00,7a,00,7a,00,00,00,00,00,4c,00,
    41,00,54,00,46,00,4f,00

    La valeur en vert correspond à aaa<null>zzz<null><null> et l'autre à des caractères non voulus... qui viennent de je ne sais où.

    Je ne comprends pas pourquoi j'ai ici ces caractères en trop... je présume que mon tableau ne fait pas 9 en taille, mais bien plus... mais je n'arrive pas à trouver pourquoi j'obtiens un tel résultat...

    Merci par avance de votre aide.

    Je cherche depuis 2 bonnes heures, en reprenant à zéro à chaque fois, mais sans succès jusqu'à présent. J'ai dû me planter dans mes compteurs et l'incrémentation de mes variables...


  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 090
    Par défaut
    peut-on avoir le code de COMPTER_CH().

    Je ne connais pas cette fonction mais je ne crois pas qu'elle vienne d'une librairie. Si elle vient d'une librairie, de laquelle vient-elle et que specifie la doc a son propos ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Ah oui j'ai oublié de le mettre, c'est une fonction que j'ai codée ( pour m'entraîner j'ai recodé plusieurs fonctions contenues dans string.h ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int COMPTER_CH(char str[])
    {
        int x = 0;
     
        while (str[x] != '\0')
        {
            x++;
        }
        return(x);
    }

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 090
    Par défaut
    Ok, donc deja, c'est un coup de bol que ton programme marche.

    Je t'explique :

    Quant tu fais un malloc, il faut indiquer la taille de ton tableau.
    Tu fais donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    malloc(COMPTER_CH(data))
    Sauf que cette taille ne correspond pas aux nombre de case dans le tableau. La taille passer correspond au nombre d'octet que tu veux allouer.

    Or, les type primitif (int, char, long, double ...) ont un nombre d'octet different, et ce nombre peut meme varier.

    Le nombre d'octet sur lequel on peut stocker un char est generalement 1.
    pour un int et un long c'est 4 (generalement).
    Un douvle c'est 8 (souvent).

    Bref, c'est la pagaille. Alors comment dire combien d'octet on veut ?
    C'est tout simple :

    nombre d'octet a allouer = nombre de case * nombre d'octet du type désiré

    on recupere le nombre d'octet du type grace a siezof(type)

    Dans ton cas, je ne sais pas si tu savais ce que je t'ai expliqué ou si tu as consciemment supprimer le sizeof, mais il ne faut pas perdre de vue que char peut prendre un nombre d'octet different de 1.

    Donc, la "bonne" syntaxe d'un malloc est :

    pointeur = (cast du type pointeur) malloc (nombreDeCas *sizeof(typeDeLaVariablePointé);

    En gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tableau = (char*)malloc(COMPTER_CH(data));
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tableau = (char*)malloc(COMPTER_CH(data)*sizeof(char))
    Ah, certaine personne disent que le cast sur le retour de malloc n'est pas obligatoire. Je n'ai jamais pris la peine de verifier cette information.


    Pour le probleme que tu rencontre, je penche pour le while qui contient un continue, la boucle me semble tres bizarrement codé.


    Je me penche sur la question.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Dans ton cas, je ne sais pas si tu savais ce que je t'ai expliqué ou si tu as consciemment supprimer le sizeof, mais il ne faut pas perdre de vue que char peut prendre un nombre d'octet different de 1.
    Oui oui j'en étais conscient Mais ce n'est peut-être pas une bonne habitude à prendre que de simplifier ainsi quand on manipule des données de type char. Je l'ai fait car sizeof(char) ça fait un ^^

    Oui je veux bien au final, ici 9 octects, 1 par caractères. Je pars donc de COMPTER_CH(data) = 12 pour tomber à 9. A ce niveau ça me semble bon, mais j'ai pris une mauvaise habitude en raccourcissant ainsi les malloc avec char, donc je vais rectifier ça.

    Ah, certaine personne disent que le cast sur le retour de malloc n'est pas obligatoire. Je n'ai jamais pris la peine de verifier cette information.
    Ca marche si on compile en C, ce qui est mon cas, mais bon je préfère prendre la bonne habitude. A moins que ça n'en soit pas une bonne...

    J'ai testé avec un boucle for aussi, sans succès.

    Merci pour tes conseils et ton aide.



    edit :

    mais il ne faut pas perdre de vue que char peut prendre un nombre d'octet different de 1.
    Ah, je ne le savais pas... dans quel cas est-ce possible ?

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 090
    Par défaut
    Citation Envoyé par Merillym Voir le message

    mais il ne faut pas perdre de vue que char peut prendre un nombre d'octet different de 1.
    Ah, je ne le savais pas... dans quel cas est-ce possible ?
    Je n'en sais absoluement rien

    En fait, j'ai lu que les type pouvait etre coder sur un nombre different d'octet.

    J'etait quand meme intrigué, alors j'ai demandé a mon prof. Il m'a repondu que c'etait a cause des ancien codage ou quelque chose comme ca et que comme rien n'etait standart la dessus, le sizeof devait etre systematique.

    Pour tout t'avouer, j'en suis rester a ce stade, je n'ai pas chercher a approfondire.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    J'ai améliorer la lisibilité du code en essayant de l'optimiser.

    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
     
     
    int b = -1;
    int taille = 0;
    int count = 0;
     
                while (++b <= COMPTER_CH(data)-count)
                {
                    if (data[b] == '\\' && data[b+1] =='0')
                    {
                        if ((tableau = realloc(tableau, COMPTER_CH(data)-(++count))) != NULL)
                        {
                            tableau[taille] = '\0';
                            printf("tableau[%d] = %c\n", taille, tableau[taille]);
                            taille += 1;
                        }
                        else
                        {
                            printf("Erreur d'allocation mémoire !\n");
                        }
                    }
                    else if (data[b] == '0' && data[b-1] == '\\')
                    {
                    }
                    else
                    {
                        tableau[taille] = data[b];
                        printf("tableau[%d] = %c\n", taille, tableau[taille]);
                        taille += 1;
                    }
                }
    Le problème persiste cependant, mais je me demande si ce n'est pas lié à autre chose que le code de cette boucle... plus du côté de l'api quoi...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Désolé pour le double post.

    En admettant qu'au lieu de prendre le \ suivi du 0 comme délimiteur, j'ai pris le | :

    donc ici au départ j'ai data[] = "aaa|zzz";

    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
                char *tableau = NULL;
     
                if ((tableau = (char*)malloc(COMPTER_CH(data)*sizeof(char)+2)) == NULL)
                {
                    printf("Erreur d'allocation mémoire !\n");
                }
                printf("taille de tableau = %d\n", COMPTER_CH(data));
                // size of tableau = 17.
     
                for (b = 0; b < COMPTER_CH(data); b++)
                {
                    if (data[b] =='|')
                    {
                        tableau[b] = '\0';
                    }
                    else
                    {
                        tableau[b] = data[b];
                    }
                }
                tableau[b] = '\0';
                tableau[++b] = '\0';
    Ben ça marche sans souci...

    Seulement j'aimerais que le délimiteur soit le '\' suivi du '0', car ça a plus de sens pour une donnée de type REG_MULTI_SZ.


  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Je n'en sais absoluement rien

    En fait, j'ai lu que les type pouvait etre coder sur un nombre different d'octet.
    Effectivement, la norme ne spécifie que la plage minimale des types, pas la taille exacte.
    Il est donc possible d'avoir des char codé sur plus de 8 bits (par exemple sur certains processeurs anciens, mais également sur certains DSP qui ne savent adresse que 16 ou 32 bits).

    Citation Envoyé par SofEvans Voir le message
    J'etait quand meme intrigué, alors j'ai demandé a mon prof. Il m'a repondu que c'etait a cause des ancien codage ou quelque chose comme ca et que comme rien n'etait standart la dessus, le sizeof devait etre systematique.
    Par contre sizeof(char) vaut toujours 1. C'est la définition même de sizeof.
    Ce qui ne signifie pas que char soit coder sur 8 bits. sizeof ne retourne pas la taille en nombre d'octets mais en nombre de byte, sizeof(char) représentant justement l'unité de base.

  10. #10
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 090
    Par défaut
    Hello,


    Voici le code permettant de faire ce que tu veux et en ayant pour delimitateur // et 0 :


    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
        /* simple variable servant a parcourir un tableau */
        int i;
     
        /* La donnée d'entré */
        char Data[] = "aaa\\0zzz\\0\\0";
     
        /* La donnée de sortie, representant la donnée d'entré (Data)
           mais ou toutes case adjacente ayant pour code \ et 0 seront fusionner
           afin de donner '\0' */
        char *Tableau = NULL;
     
        /* Indice servant a parcourir respectivement les données d'entré et sortie.
           indiceTableau, une fois la boucle while fini, representera la taille du tableau.
           En effet, puisqu'en plein milieu du tableau on pourra avoir le symbole '\0'
           sans pour autant que celui ci annonce la fin de chaine. strlen devient donc inadapté */
        unsigned int indiceData = 0;
        int indiceTableau = 0;
     
        /* On compare les case par case adjacentes, donc on doit s'arreter a l'avant derniere */
        while (indiceData < strlen(Data)-1)
        {
            /* Ajustement du tableau */
            char *Temporaire = (char*) realloc(Tableau, (indiceTableau+1)*sizeof(char));
            if (Temporaire == NULL)
            {
                perror("Probleme lors du realloc ");
                printf("\nErreur survenue a l'indice %d.\n", indiceTableau);
                exit(EXIT_FAILURE);
            }
            else
                Tableau = Temporaire;
     
            /* Insertion de la donné de Data dans tableau */
            if (Data[indiceData] == '\\' && Data[indiceData+1] == '0')
            {
                Tableau[indiceTableau] = '\0';
                /* Si '\0' est inserer, on doit "sauter" une case de plus car '\0'
                   est composer de '\\' et '0', soit deux case */
                indiceData++;
            }
            else
                Tableau[indiceTableau] = Data[indiceData];
     
            indiceTableau++;
            indiceData++;
        }
     
        /* affichage des caractere */
        for (i=0 ; i<indiceTableau ; i++)
            printf("Tableau[%d] : %c\n", i, Tableau[i]);
     
        printf("\n\n");
     
        /* Affichage du code des caractere */
        for (i=0 ; i<indiceTableau ; i++)
            printf("Tableau[%d] : %d\n", i, Tableau[i]);
     
    }

    Juste un truc sur ton precedent codde : evite d'abuser des ++b et b++, surtout dans l'indice des tableau. Je trouve personnellement (ca n'engage donc que moi) qu'on n'y gagne rien du tout, mis a part de l'obfuscation. En effet, le ++, qu'il soit devant ou après la variable ne s'effectuera pas à la ligne. On gagne donc une ligne en risquant de faire des erreurs tres bete si on est fatigué (ou inattentif).

    Comme toujours, il s'agit d'un style et certaine personne trouverons qu'au contraire, le ++ permet de bien faire les chose. A chacun sa façon de faire.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Merci SoftEvans pour t'être à nouveau penché sur la question

    Ton code est beaucoup mieux codé que le miens. Je l'ai testé, et j'obtiens toujours le même problème... Mon bout de code marchait donc bien, même s'il était très mal codé. Je conserve donc le tiens et je vais tâcher de soigner la forme de mon code... pas toujours évident quand on apprend seul pour savoir ce qui est bien et ce qui l'est moins.

    Concernant mon problème, j'en déduis que ça vient d'un autre problème, soit de l'OS, soit de l'api. Le plus bizarre dans tout ça c'est ça marche si je prends un délimiteur qui ne fait qu'un caractère. Curieux curieux...

    J'ai une question à propos de code :

    Je voudrais être sûr de bien comprendre cette ligne : tu fais pointer tableau vers temporaire, c'est bien ça ?
    Je ne comprends pas trop cette ligne en fait, je veux bien une explication supplémentaire.

    Merci pour tous tes conseils.


  12. #12
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 090
    Par défaut
    Bonsoir,

    Je tient dabord a dire que le code donné a une legere erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
        /* Affichage du code des caractere */
        for (i=0 ; i<indiceTableau ; i++)
            printf("Tableau[%d] : %c\n", i, Tableau[i]);
    c'est %c a la place de %d.

    Bref, chez moi ce code fonction, reste a voir pourquoi chez toi cela ne fonctionne pas.


    Pour le coup de Tableau = Temporaire


    Si realloc echoue, il ne touche pas au tableau passer en argument et renvoie null, s'il reussi, il renvoie un pointeur vers le tableau (et se charge de supprimer l'ancien en interne)
    Donc, si tu fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tableau = realloc(tableau, COMPTER_CH(data)-(++count))
    Cela va marcher lorsque realloc marchera, mais si realloc echoue, tu perd definitivement tableau car realloc ne touche pas au tableau et renvoie NULL, retour que tu affecte a ton tableau encore valide.

    Donc Temporaire est juste la en cas de probleme : si realloc renvoi NULL, on est averti via Temporaire et on conserve tableau (on agit ensuite selon sa guise), sinon, Temporaire a le bon tableau et Tableau pointe vers NULL (vu que realloc a pris le soin de faire le menage. En cas de reussite, il faut donc faire

    Tableau = Temporaire;

    avec aucun free sur Temporaire.

    J'espere ne pas t'avoir embrouiller, n'hesite pas sinon.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Bref, chez moi ce code fonction, reste a voir pourquoi chez toi cela ne fonctionne pas.
    Il marche aussi chez moi... c'est quand je passe tableau à l'api que ça plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                        RegSetValueEx(hKey,
                        value,
                        0,
                        REG_MULTI_SZ,
                        tableau,
                        COMPTER_CH(data)+2);
    Le programme fonctionne bien, les données sont écrites dans le registre. Mais quand je vérifies les données binaires, j'ai systématiquement quelques caractères en plus avec les 5 zéros ( au format unicode ).

    Normalement, il ne devrait rien y avoir après les 5 zéros.

    Tu vois ce que je veux dire ?

    J'espere ne pas t'avoir embrouiller, n'hesite pas sinon.
    Non non du tout, j'apprends plein de choses au contraire.

    Par contre pour :

    Je ne vois pas bien comment tableau peut contenir les caractères qu'on lui a déjà donnés, si à chaque fois on le fait pointer sur un tableau temporaire qui est censé être vide non ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Trouvé le bug


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
              RegSetValueEx(hKey,
                        value,
                        0,
                        REG_MULTI_SZ,
                        tableau,
                        indiceTableau);
    J'avais oublié de réajuster la taille du buffer dans l'appel de l'api

  15. #15
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 090
    Par défaut
    Tout vient de là :

    Citation:
    RegSetValueEx(hKey,
    value,
    0,
    REG_MULTI_SZ,
    tableau,
    COMPTER_CH(data)+2);
    Mais faut que je code une fonction qui compte le nombre de caractère dans une chaîne, mais qui ne s'arrête pas au premier caractère null rencontré, mais lorsqu'elle en rencontre deux à la suite. Je te tiens au courant.
    Hum, tu as lu les commentaire de mon code ?
    Juste pour le plaisr de s'auto cité :

    /* Indice servant a parcourir respectivement les données d'entré et sortie.
    indiceTableau, une fois la boucle while fini, representera la taille du tableau.
    En effet, puisqu'en plein milieu du tableau on pourra avoir le symbole '\0'
    sans pour autant que celui ci annonce la fin de chaine. strlen devient donc inadapté */
    unsigned int indiceData = 0;
    int indiceTableau = 0;
    Pour en revenir a cette phrase :

    Je ne vois pas bien comment tableau peut contenir les caractères qu'on lui a déjà donnés, si à chaque fois on le fait pointer sur un tableau temporaire qui est censé être vide non ?
    Non, il n'est pas censer etre vide. Voici un petit tableau recapitulant ce que j'ai expliquer precedemment :



    Situation de depart :

    Temporaire = NULL;
    Tableau = RempliDeCaractere


    Ensuite :


    Temporaire = (char*) realloc(Tableau, (indiceTableau+1)*sizeof(char));


    Resultat :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    o----------o------------------o-----------------o
    |  realloc |   Tableau        |  Temporaire     |
    o----------o------------------o-----------------o
    |   Echec  |   ChaineDeDepart |       NULL      |
    o----------o------------------o-----------------o
    | Reussite |       NULL       |   ChaineArrivé  |  
    o----------o------------------o-----------------o

    Voila. Si je n'ai pas repondu a ta question, explique plus clairement ce que tu voulais dire.

    Bonne soiré

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Hum, tu as lu les commentaire de mon code ?
    Ouep j'ai dit une bêtise, j'ai supprimé ce message et pendant que tu postais, j'en ai postais un autre, juste au-dessus du tiens.

    Je regarde tes explications, merci

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Temporaire = (char*) realloc(Tableau, (indiceTableau+1)*sizeof(char));
    Ah, je crois avoir compris : à chaque fois que cette ligne est exécutée, tableau est copié dans temporaire et la taille de temporaire augmente de 1.

    Est-ce bien ça ?

    Encore merci.


  18. #18
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 090
    Par défaut
    Citation Envoyé par Merillym Voir le message
    Ah, je crois avoir compris : à chaque fois que cette ligne est exécutée, tableau est copié dans temporaire et la taille de temporaire augmente de 1.

    Est-ce bien ça ?

    Encore merci.

    Oui, c'est ca, mais surtout Tableau est mis a NULL, c'est pour ca qu'il faut re-affecter.

    Et c'est traître d'editer entierement un message ^^
    Tiens pour la peine :



  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Par défaut
    Oui, c'est ca, mais surtout Tableau est mis a NULL, c'est pour ca qu'il faut re-affecter.
    Compris

    Oui j'éviterai de rééditer complètement un message, promis

    Ce sujet est donc résolu, merci pour ce deuxième coup de main consécutif, j'ai encore appris pas mal de choses.


  20. #20
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 090
    Par défaut
    De rien,

    Bon courage pour la suite.

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

Discussions similaires

  1. Problème de taille de tableau sous IE 7
    Par chatlumo dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 01/08/2008, 15h22
  2. Problème avec taille de tableau et checkbox
    Par narcis60floyjo dans le forum Langage
    Réponses: 5
    Dernier message: 31/03/2008, 16h13
  3. problème de taille de tableau
    Par tromaltsec dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/12/2007, 09h29
  4. Problème de taille de tableau
    Par Beush dans le forum C
    Réponses: 4
    Dernier message: 01/11/2005, 17h41
  5. Problème de taille de tableau
    Par k-nine dans le forum C
    Réponses: 6
    Dernier message: 25/09/2005, 09h16

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