Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

allocation dynamique

5 réponses
Avatar
programmation
Bonjour,

- Comment d=E9clarer et allouer un tableau T de chaines de caract=E8res de
N cases ?
- Dans le tableau T, est ce que il y a une taille limit=E9e =E0 ne pas
d=E9passer dans la case? si oui combien cette taille ?

- Comment d=E9clarer et allouer un tableau T de deux dimension de
chaines de caract=E8res de N cases ?


- Comment d=E9clarer 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=E8re ?

- si on a T un tableau de chaines de caract=E8res(10 cases) et ch est
une chaine de caract=E8re(de taille 10):

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


Si cette d=E9claration est juste alors quelle est la diff=E9rence entre T
et ch ?


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

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

Merci

5 réponses

Avatar
Bertrand Lenoir-Welter
> - 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.
Avatar
programmation
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 == '' */
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 != '') */
{
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ête r
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.
Avatar
programmation
J'ai mis le code et mon idée mais pas d'aide ou de proposition ???
Avatar
marc
On 27 nov, 07:40, programmation 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...
Avatar
programmation
> 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 ?