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 :

allocation dynamique et pointeur


Sujet :

C

  1. #1
    Débutant
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Points : 35
    Points
    35
    Par défaut allocation dynamique et pointeur
    Bonjour,

    - Comment déclarer et allouer un tableau T de chaines de caractères de N cases ?
    - Dans le tableau T, est ce que il y a une taille limitée à ne pas dépasser dans la case? si oui combien cette taille ?

    - Comment déclarer et allouer un tableau T de deux dimension de chaines de caractères de N cases ?


    - Comment déclarer et allouer un tableau T d'entiers de N cases ?

    - Combien la valeur maximale d'un entier ?

    - Combien la valeur maximale d'une chaine de caractère ?

    - si on a T un tableau de chaines de caractères(10 cases) et ch est une chaine de caractère(de taille 10):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char ch[10];
    char T[10];
    Si cette déclaration est juste alors quelle est la différence entre T et ch ?


    - Si on veut utiliser un pointeur sur un tableau de chaines de caractères de taille alors comment on alloue ce tableau ?

    - Dans quel cas, on utilise un simple tableau T de chaines de caractères ou un pointeur sur ce tableau ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Bonjour,
    1. Ça dépend de ce que "chaîne de caractères" désigne. Pour des chaînes dont le tableau n'a pas à gérer la durée de vie (par exemple, des chaînes littérales), tu peux le déclarer char const *T[N];.
    2. On ne peut pas vraiment savoir la taille limite. Pour un tableau sur la pile, il ne faut évidemment pas en sortir. Sous Windows, la pile fait 1Mo (par défaut). D'une manière générale, tant que c'est petit, pas de problème, sinon il vaut mieux utiliser l'allocation dynamique.
    3. Sur le même exemple qu'avant, on peut faire char const* T[N][N];.
    4. INT_MAX, définie dans <limits.h>. Garantie être supérieure ou égale à 32767.
    5. Une chaîne de caractère n'a pas de "valeur". Tu veux dire sa longueur? Je suppose que c'est limité par la mémoire ou quelque chose, j'ignore si la norme en parle. Regarde peut-être la doc de ton compilo.
    6. La déclaration est incorrecte.
    7. Tu veux dire pointeur sur le premier élément du tableau ou pointeur sur le tableau lui-même? La syntaxe est très différente entre les deux.
    8. On utilise un pointeur dès qu'on passe le tableau à une fonction, pour bien montrer le fait que le tableau n'est pas passé par valeur (un "gotcha" bien connu du C). Aussi, si on ne connait pas la taille à la compilation, il faut passer par de l'allocation dynamique.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Débutant
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Voici mon propre code. Je voulais modifiez la solution ou lieu de faire *** rets(tableau de tableau) alors on fait **rets un simple tableau de chaine de caractères car je vais faire une seule comparaison entre deux tableaux.
    Que proposez vous comme solution et modification à faire dans l'appel de fonction de comparaison et l'allocation de 'rets' et dans la fonction de comparaison de telle sorte que 'rets' soit un simple tableau de chaines de caractères ?


    Voici l'appel de cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char ***rets = NULL;
    rets = malloc (nbre * sizeof(char**));
    rets[0] = compare_files(tab_comb,nb_comb,tab_con,nb_con);
    Voici la fonction de comparaison :

    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
    /** Compare deux fichiers er renvoie le résultat de la comparaison */
     
    char ** compare_files(char **tab_comb,int nb_comb,char ***tab_con,int nb_con)
    {
     
     
    	int i,a, retsize = 0,index,p;
        char **ret = NULL,result[1024];
    	int size1;
     
    	for(i=0;i<nb_comb;i++)
    	     {
     
                a = 0;
     
          for (p=0; p <nb_con; p++)
    		{
     
    			if (is_same(tab_comb[i], tab_con[0][p], 0))
                    {
     
                        a = 1;
                        break;
                    }
     
    		} 
     
           if (!a)
                {
                    ret = xrealloc(ret, (++retsize) * sizeof(char*)); /* On alloue une case de plus au tableau de string, puis on ajoute la chaine à la fin du tableau */
                  	ret[retsize-1] = mstrndup(tab_comb[i], strlen(tab_comb[i]));
     
                }
    		}   
     
     
            ret = xrealloc(ret, (++retsize) * sizeof(char*)); /* On ajoute un dernier pointeur sur NULL pour savoir quand le tableau se termine */
            ret[retsize-1] = NULL;
     
     
     
        return ret;
    }

    Voici les autres fonctions utilisant par le code au dessus:

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    /** Teste le retour de realloc et quitte le programme si besoin */
    void * xrealloc(void * prec, size_t len)
    {
        void *ret = realloc(prec, len);
        if(!ret) /* Equivaut à if(ret == NULL) */
            exit(0);
        return ret;
    }
     
    /** Copie n caractère de str dans une nouvelle chaine alloué dynamiquement, et renvoie cette chaine */
    char * mstrndup(const char *str, size_t n)
    {
        char *ret = malloc((n+1) * sizeof(char));
     
        if (!ret)
            exit(0);
     
        strncpy(ret, str, n); /* Copie n caractère de str dans n */
        ret[n] = 0; /* 0 == '\0' */
        return ret;
    }
     
    /** Compte le nombre de mot dans str (un mot correspond à une suite de lettre et s'arrête dès qu'un caractère autre est rencontré */
    size_t count_word(const char *str)
    {
        size_t n = 0;
        int a;
     
        while (*str) /* Equivaut à while(*str != '\0') */
        {
            a = 0; /* Cette variable sert à indiquer si au moins une lettre a été trouvé (pour éviter les lignes vides) */
     
        while (!isspace((unsigned char) *str) && *str) str++, a = 1;
        if (a) n++;
    	while (isspace((unsigned char) *str) && *str) str++;
    	}
        return n;
    }
     
    /** copie les mots de la chaine str dans le tableau de chaine de caractère tab */
    void get_word(char **tab, const char *str)
    {
        const char* p = str;
        int a, i = 0;
        /* Le fonctionnement est le même que pour la fonction count_word mais ici on enregistre la chaien dans un tableau. On pourrait le faire en une seule
        fonction mais il faudrai à chaque fois réallouer de la mémoire et ce n'est pas très propre */
        while (*str)
        {
            a = 0;
            while (!isspace((unsigned char) *p) && *p) p++, a = 1;
            if (a)
                tab[i++] = mstrndup(str, p-str); /* Si on a trouvé un mot, on met dans tab[i] le mot (la suite de lettre trouvé) et on incrémente i.
                p-str correspond à la taille du mot, c'est l'adresse du caractère suivant le dernier caractère moins l'adresse du premier caractère */
     
    		 while (isspace((unsigned char) *p) && *p) p++;
            str = p;
        }
    }
     
    /** Compare deux tableaux de mots, renvoie 1 si ces tableaux sont identiques sans tenir compte de l'ordre ni du nombre de mot, 0 sinon (En fait, il renvoie 1
        si chaque ligne de t1 existe dans t2) */
    int compareline(char **t1, size_t size1, char **t2, size_t size2)
    {
        int ret = 1;
        size_t i, j;
        int a;
     
        /* Pour chaque ligne de t1, on compare avec chaque ligne de t2. Si à un moment on ne trouve pas la ligne, alors les tableaux ne sont pas identiques */
        for (i = 0; i < size1; i++)
        {
            a = 0;
            for (j = 0; j < size2; j++)
                if (!strcmp(t1[i], t2[j]))
                {
                    a = 1;
                    break; /* Dès que la ligne est trouvé, on peux arrêter de comparer pour cette valeur du tableau */
                }
     
            if (!a)
            {
                ret = 0;
                break; /* Dès qu'une ligne manque, on peux arrêter la comparaison */
            }
        }
        return ret;
    }
     
    /** Compare deux chaines de caractère, si comparesize vaut 1 alors la première doit contenir la seconde, et renvoie 1 si elles sont identiques sans tenir
        compte de l'ordre des mots */
    int is_same(const char *s1, const char *s2, int comparesize)
    {
        char **t1, **t2;
        size_t size1 = count_word(s1), size2 = count_word(s2);
     
        int ret = 0;
     
        if (!comparesize || (size1 > size2)) /* Si comparesize vaut 0, on ne compare pas la taille, si comparesize vaut 1 alors il faut que size1 > size 2 */
        {
            t1 = malloc(size1 * sizeof(char*));
            t2 = malloc(size2 * sizeof(char*));
     
            if (t1 && t2)
            {
                get_word(t1, s1);
                get_word(t2, s2);
     
                ret = comparesize? compareline(t2, size2, t1, size1) : compareline(t1, size1, t2, size2);
     
                free_tab(t1, size1), free_tab(t2, size2);
            }
            else
                exit(0);
        }
        return ret;
    }
    Je souhaite que vous m'aidez.

    Merci.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je ne sais pas si je peux vous aider, vu que je trouve qu'il y a trop d'étoile dans les tableaux pour arrivé à dire si c'est juste ou pas ( je m'y perd un peu ).

    Par contre, avez vous un problème précis ? car si vous n'avez pas de problème, y a pas besoin d'aide, et si vous avez un problème dites le précisément, comme ça on pourra vous aider.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. allocation dynamique d'un tableau de pointeurs
    Par Dilettante dans le forum C++
    Réponses: 9
    Dernier message: 29/06/2007, 23h41
  2. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  3. Réponses: 6
    Dernier message: 04/01/2007, 01h30
  4. Réponses: 13
    Dernier message: 01/10/2006, 00h25
  5. allocation dynamique et tableaux de pointeurs
    Par gbardy dans le forum 4D
    Réponses: 3
    Dernier message: 06/07/2006, 11h08

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