Tableau aléatoire en C

Fermé
tp&vpei - 13 oct. 2009 à 14:10
 llama - 13 oct. 2009 à 15:12
Bonjour,

j'ai un petit soucis concernant une génération d'entiers aléatoires.
Je souhaite donc générer une suite de tableaux (1 dimension) binaires aléatoires. Ou un tableau binaire aléatoire à deux dimensions.


voilà le code:

#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*));
while(i++ < k)
{
a[i] = (int *)malloc(128 * sizeof(int));
}

int b[128];

srand (time(NULL));
for(i=0;i<k;i++)
{
for (j=0;j<128;j++)
{
b[j]=rand()%2;
}
a[i]=b;
}

}



Le code renvoie donc une suite aléatoire pour les b[j], mais les a[i] sont tous identiques.
Si vous avez une petite idée qui pourrait dépanner, merci d'avance.

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;
}

}

1
Ha autre chose, la variable "k" n'est pas initialisée et la variable "n" n'est pas utilisée (moin genant).
0
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.
1
tp&amp;vpei
13 oct. 2009 à 15:01
Ah si, je comprends l'erreur. C'était pourtant bien expliqué...

Merci encore!
0
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.
1
Ha, j'ai répondu trop tard, pas grave.
1