PDA

View Full Version : Creare n matrici


Manuel.j
08-01-2013, 16:56
Salve a tutti!
Vi scrivo perchè ho un problema con un programma in C.
In pratica il testo mi chiede di creare n Matrici e poi di creare n processi figli, ognuno dei quali calcola il massimo della diagonale principale della propria matrice. Il problema principale è che non ho capito come creare queste n matrici senza dichiararle dall'inizio! Vi scrivo il testo dell'esercizio così sarà più chiaro:

Dato un insieme di n matrici di dimensione 3x3, calcolare il massimo tra i valori contenuti sulle diagonali principali di ciascuna matrice. Il calcolo deve essere effettuato secondo la seguente modalità: sono creati n processi figli ognuno dei quali si preoccupa di calcolare il massimo sulla propria diagonale (i-esimo processo, i-esima diagonale). Ogni processo figlio, calcolato il massimo, lo comunica al padre tramite pipe. Il processo padre provvede a calcolare il massimo tra i massimi a lui inviati dagli n figli.

Ecco. Il mio problema principale è: come si fanno a creare 3 - 5 oppure 10 matrici senza prima dichiararle? Naturalmente si deve sviluppare il ambiante Unix, quindi usa le funzioni fork() (per creare i figli) e pipe() (per creare le pipe). Attendo una vostra risposta...
Grazie!

gugoXX
08-01-2013, 17:04
istanzi una collezione (ad esempio un array) di matrici, che poi riempirai con N matrici prima di far partire gli N processi.
In C o C++ si tratta di mettere un * in piu' da qualche parte nella dichiarazione di variabile.

Vincenzo1968
08-01-2013, 18:17
Io programmo in C e volentieri ti darei una mano. Purtroppo l'esercizio richiede di usare api *nix(fork, p. es) e io da poco mi sono avvicinato al mondo Linux. Potrei fare un esempio per Windows ma poi dovresti convertirlo per Linux.

clockover
08-01-2013, 21:02
Ecco. Il mio problema principale è: come si fanno a creare 3 - 5 oppure 10 matrici senza prima dichiararle? Naturalmente si deve sviluppare il ambiante Unix, quindi usa le funzioni fork() (per creare i figli) e pipe() (per creare le pipe). Attendo una vostra risposta...
Grazie!

Io penso che a te questa cosa non importi. Tu devi semplicemente creare una logica per la soluzione del problema e poi implementarla praticamente. Ad esempio

int main(){
for i = 0 to n
forki e per ogni figlio chiami la funzione problema
for i = 0 to n
come processo padre leggi tutti i valori
Poi il processo padre farà quello che deve
}

problema(long ** matrice, int dimensione){
calcoli quello che devi calcolare sulla matrice....
scrivi sulla pipe al processo padre
fine della storia
}

molto semplicemente... Una volta fatto questo puoi crearti un paio di matrici e fare delle prove per vedere se funziona. Il problema non ti chiede di creare delle matrici... fatti furbo :D

Manuel.j
08-01-2013, 21:15
Io penso che a te questa cosa non importi. Tu devi semplicemente creare una logica per la soluzione del problema e poi implementarla praticamente. Ad esempio

int main(){
for i = 0 to n
forki e per ogni figlio chiami la funzione problema
for i = 0 to n
come processo padre leggi tutti i valori
Poi il processo padre farà quello che deve
}

problema(long ** matrice, int dimensione){
calcoli quello che devi calcolare sulla matrice....
scrivi sulla pipe al processo padre
fine della storia
}

molto semplicemente... Una volta fatto questo puoi crearti un paio di matrici e fare delle prove per vedere se funziona. Il problema non ti chiede di creare delle matrici... fatti furbo :D

Si ma io l'esercizio in se sono in grado di farlo... il problema non è implementare la fork o la pipe, ma creare queste n matrici... esempio: l'esercizio dovrebbe iniziare così:
Inserire il numero di matrici: es. 5
crea 5 matrici e poi vai avanti con il programma...

Manuel.j
08-01-2013, 21:19
istanzi una collezione (ad esempio un array) di matrici, che poi riempirai con N matrici prima di far partire gli N processi.
In C o C++ si tratta di mettere un * in piu' da qualche parte nella dichiarazione di variabile.

Mi potresti fare un esempio di dichiarazione di collezione di matrici in c? Grazie...

matteo micanti
08-01-2013, 23:16
Puoi allocare memoria dinamicamente attraverso malloc() (http://www.cplusplus.com/reference/cstdlib/malloc/).

In questo caso puoi realizzare l'allocazione in diversi modi, anche in modo da poter usare le canoniche parentesi quadre per accedere agli elementi, ma secondo me una strada decisamente più semplice è quella di usare un solo array con una funzione per mapparci tutti i dati (che poi altro non è che quello che succede realmente a basso livello, quando dichiari una matrice).

Assumiamo che il tipo dei dati da inserire nelle matrici sia int, ed n sia l'intero preso in input dall'utente che rappresenta il numero di matrici.


int * data = malloc(n * 9 * sizeof(int));


In questo modo alloco un array di int di n * 3 * 3 elementi, che sarà puntato da data.
Adesso, definendo:

unsigned int index ( unsigned int matrix, unsigned int x, unsigned int y ) {
return matrix * 9 + x * 3 + y;
}

si ha che data[index(k, i, j)] è l'elemento (i, j) della matrice k-esima.

Poichè la malloc alloca nell'heap, ricorda di liberare esplicitamente la memoria quando non serve più, con la free() (http://www.cplusplus.com/reference/cstdlib/free/).

Saluti!

Manuel.j
09-01-2013, 14:20
Grazie! Proverò a svoglerlo in questo modo... Saluti

Manuel.j
09-01-2013, 14:21
Grazie! Proverò a svoglerlo in questo modo... Saluti