Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

allocation dynamique

0 views
Skip to first unread message

programmation

unread,
Nov 26, 2009, 2:35:44 AM11/26/09
to
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):

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

Bertrand Lenoir-Welter

unread,
Nov 26, 2009, 3:22:03 AM11/26/09
to
> - Comment d�clarer et allouer un tableau T de chaines de caract�res de
> N cases ?

Ca devient un peu loufoque, mais bon...

N cases, c'est la taille maxi de chaque cha�ne ou le nombre de cha�nes
dans le tableau ?


> - 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 ?

Vous faites ce que vous voulez tant que vous ne d�bordez pas de
l'ensemble. L'espace m�moire allou� est � vous.


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

Soyez plus explicite. Vous connaissez d'avance les dimensions maxi, ou
il faut allouer de fa�on dynamique ?


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

#define N ...
int T[N];


> - Combien la valeur maximale d'un entier ?

MAX_INT


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

Euh, c'est quoi, la valeur d'une cha�ne de caract�res ?


> - si on a T un tableau de chaines de caract�res(10 cases) et ch est
> une chaine de caract�re(de taille 10):


> char ch[10];
> char T[10];

> Si cette d�claration est juste alors quelle est la diff�rence entre T
> et ch ?

Cette d�claration est juste, et la seule diff�rence entre T et ch est
qu'ils ne sont pas � la m�me adresse, outre leur contenu.


> - Si on veut utiliser un pointeur sur un tableau de chaines de

> caract�res de taille alors comment on alloue ce tableau ?

Avec malloc(). Et si vous devez lui changer sa taille, realloc(). Ne pas
oublier le free() en sortant.


> - Dans quel cas, on utilise un simple tableau T de chaines de

> caract�res ou un pointeur sur ce tableau ?

On utilise une allocation dynamique quand on ne sait pas � l'avance
quelle taille la donn�e va prendre dans la m�moire. Si l'on est s�r que
N ne peut pas d�passer une valeur d�finie, on peut faire une simple
d�claration avec N dimensions.

programmation

unread,
Nov 26, 2009, 11:13:34 AM11/26/09
to
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:

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 :

/** 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:

/** 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.

programmation

unread,
Nov 27, 2009, 1:40:51 AM11/27/09
to
J'ai mis le code et mon idée mais pas d'aide ou de proposition ???

marc

unread,
Nov 27, 2009, 11:18:15 AM11/27/09
to
On 27 nov, 07:40, programmation <bouali.a...@gmail.com> wrote:
> J'ai mis le code et mon idée mais pas d'aide ou de proposition ???

On t'a donné toutes les billes, à toi de faire le nécessaire
On ne peut pas refaire le code à ta place...

programmation

unread,
Nov 28, 2009, 2:15:57 PM11/28/09
to

> On t'a donné toutes les billes, à toi de faire le nécessaire
> On ne peut pas refaire le code à ta place...

Qu'est ce que vous me donnez ?

0 new messages