A voir également:
- Tableau aléatoire en C
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Tableau de combinaison loto 5/90 - Forum Excel
- Tableau coefficient marge ✓ - Forum Excel
4 réponses
La le problème c'est que, avec ton "a[i] = b", tu copie un pointeur sur un tableau que tu va réutiliser quand "i" aura été incrémenté.
Il y a (au moin) deux solutions pour résoudre ce problème:
->Déclarer "b" en temps que "int *b" et faire un "b = malloc(sizeof(*b) * 128)" à chaque tour dans ton premier for. Dans ce cas, ta boucle "while" devient innutile car la mémoire est allouée pour le "b", et comme tu copie l'adresse de "b", tu peut refaire un malloc dessu, ça ne te fera aps perdre l'adresse.
->Autre solution moin performante, chaque case de b dans a[i] avec une autre boucle. C'est beaucoup plus lent et moin propre.
En résumé, le programme devrai donner ça (non verifier):
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
main()
{
int i,j,k,n;
int ** a;
a = (int **)malloc(k * sizeof(int*));
int *b;
srand (time(NULL));
for(i=0;i<k;i++)
{
b = (int *)malloc(128 * sizeof(int));
for (j=0;j<128;j++)
{
b[j]=rand()%2;
}
a[i]=b;
}
}
Il y a (au moin) deux solutions pour résoudre ce problème:
->Déclarer "b" en temps que "int *b" et faire un "b = malloc(sizeof(*b) * 128)" à chaque tour dans ton premier for. Dans ce cas, ta boucle "while" devient innutile car la mémoire est allouée pour le "b", et comme tu copie l'adresse de "b", tu peut refaire un malloc dessu, ça ne te fera aps perdre l'adresse.
->Autre solution moin performante, chaque case de b dans a[i] avec une autre boucle. C'est beaucoup plus lent et moin propre.
En résumé, le programme devrai donner ça (non verifier):
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
main()
{
int i,j,k,n;
int ** a;
a = (int **)malloc(k * sizeof(int*));
int *b;
srand (time(NULL));
for(i=0;i<k;i++)
{
b = (int *)malloc(128 * sizeof(int));
for (j=0;j<128;j++)
{
b[j]=rand()%2;
}
a[i]=b;
}
}
Merci beaucoup pour cette réponse rapide et précise!
Cela fonctionne effectivement.
Je ne comprends pourtant pas pourquoi à chaque nouveau passage dans la première boucle for, la suite aléatoire générée par srand était reprise depuis le début...
Pour ce qui est des variables k et n, toutes mes excuses, ce code fait partie d'un programme (beaucoup) plus long dont j'ai extrait les parties nécessaires.
Cela fonctionne effectivement.
Je ne comprends pourtant pas pourquoi à chaque nouveau passage dans la première boucle for, la suite aléatoire générée par srand était reprise depuis le début...
Pour ce qui est des variables k et n, toutes mes excuses, ce code fait partie d'un programme (beaucoup) plus long dont j'ai extrait les parties nécessaires.
Le pourquoi est simple (pour peut que les pointeurs soient bien maitrisés), en faisant "a[i] = b", tu ne copie pas le contenu de "b" dans "a[i]" mais l'adresse de "b" dans "a[i]". Hors, avec ta methode, l'adresse de "b" ne change pas, à chaque passage dans la première boucle, tu remplissait donc le même tableau (en effaçant les valeurs précédantes) puis tu en copiais l'adresse dans "a[i]". Tous les "a[i]" de ton tableau etaient donc identiques et c'est ce qui avait été mis au dernier passage dans la boucle qui y était.
13 oct. 2009 à 14:42