PDA

View Full Version : inizializzare un array con valori casuali [C]


bambi1999
24-05-2016, 17:47
Buonasera,
mi si chiede di creare una funzione, di cui mi viene già dato il prototipo, che mi inserisca in un array (che è stato allocato con la malloc con un'altra funzione) dei numeri casuali compresi tra due valori a,b.
Il prototipo della funzione che mi viene passato è il seguente:
int iinizializzare (double ** mat, unsigned n, unsigned m, double a, double b)
dove **mat è il puntatore alla matrice
n è il numero di righe della matrice
m è il numero di colonne
a estremo superiore (per generare i numeri casuali)
b estremo inferiore.
(il return deve essere 0 se tutto va bene, -1 se avvengono errori)

Non mi è particolarmente chiaro il primo parametro della funzione: ho provato a esplicitare meglio scrivendo nel corpo della funzione

double *c[n][m];
*mat= &c[0][0];
e dopo con i soliti due cicli for ho usato la funzione rand.
Il problema è che in fase di compilazioni mi da warning e non riesco a capire come poter meglio utilizzare il puntatore alla matrice.

Buona serata alla buon anima che mi aiuterà

Valjean
25-05-2016, 19:11
Nella funzione inizializzare() devi assegnare i valori alla matrice semplicemente con mat[r][c] = valore;

Come allochi la memoria per la matrice?

cenarius_88
25-05-2016, 19:39
Esattamente nella funzione di inizializzazione che penso farai con due cicli for che iterano su due variabili i e j dovrai fare
mat[i] [j] = valore
Il valore randomico compreso tra a e b potresti farlo con la funzione rand() magari usando la srand(time()) prima per rendere un po' più causali i valori...
Quindi avresti
srand(time())
for su i
for su j
mat [i] [j] = b + (rand() % (a - b))

È un idea... Non ho modo di testare ma dovrebbe funzionare

Inviato dal mio ALE-L21 utilizzando Tapatalk

Valjean
25-05-2016, 20:05
mat [i] [j] = b + (rand() % (a - b))


La rand() ritorna degli interi.
Dovrebbe usare una funziona così:
double rand_double(double a, double b)
{
double r = (double)rand() / RAND_MAX;

return (a + r * (b - a));
}

Mentre per l'allocazione della matrice:
double **mat;
const unsigned N = 3;
const unsigned M = 5;
unsigned c, r;

if ((mat = (double **)malloc(N * sizeof(double *))) == NULL) {
printf("malloc() failed!\n");
return 1;
}

for (r = 0; r < N; r++) {
if ((mat[r] = (double *)malloc(M * sizeof(double))) == NULL) {
printf("malloc() failed!\n");
return 1;
}
}

cenarius_88
25-05-2016, 20:33
Ok hai ragione non avevo considerato il fatto che la matrice fosse di double.


Inviato dal mio ALE-L21 utilizzando Tapatalk