|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: May 2005
Messaggi: 249
|
passaggio di matrici in C
Dunque il mio problema è questo. Spero di spiegarmi bene.
Ho un main che ha una matrice [n][n] .... la matrice deve essere passata ad una function che ne estrae solo dei valori e li mette su un'altra matrice di tipo [3][n] Fin qui tutto bene. Il mio problema è... come faccio a ripassare la nuova matrice generata nella function al main per farla poi stampare? esempio... main(){ .... .... nuovamatrice (matrix); //gli passo la matrice for(i=0;i<3;i++){ for(j=0;j<n;j++){ printf("%f", newmatrix[i][j]); /*dove newmatrix dovrebbe essere la matrice generata dalla function*/ } } void nuovamatrice(float a[n][n]){ /*faccio lo scambio degli elementi e li metto in una matrice che per esempio chiamo m*/ for...... m[i][j+1]=a[i][j]; //è solo un esempio } come passo m al main per farlo stampare come newmatrix? Grazie |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jan 2001
Città: Rimini
Messaggi: 197
|
la fai restituire dalla funzione come doppio puntatore al tipo di dato della matrice..
es: float** funzione(float matrix[][]) dentro questa funzione allochi DINAMICAMENTE(quindi con malloc ecc.) la matrice, elabori quello che devi fare, e restituisci il doppio puntatore che punta alla matrice con return.. es: Codice:
float **funzione (float matrix[][])
{
float **matriceNUOVA;
// ALLOCHI E ELABORI I DATI
return matriceNUOVA
}
void main()
{
float matrice[BOH?][BOH?];
float **risultato;
risultato=funzione(matrice);
}
Ciao.
__________________
Linux + xBox360 + iPod. Ognuno al suo posto. Ultima modifica di mostec : 20-05-2006 alle 02:23. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 4329
|
per curiosita interessa anche a me, mi basta un input sull allocazione (malloc)
__________________
|18k+|slk800|a7n8x|1Gb/ddr400|Gf4mx440|Pio108|WD 160Gb|Case|Uni|Album|AnimeClick|OneManga| |ClassicThrash!|BNR Metal|TrueMetal|Dime|Chuck| |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
(1) È perfettamente possibile avere una matrice bidimensionale dichiarata come float**. Bisogna però far notare che non è un vero e proprio array come inteso dal "C". In "C" un array è "una collezione di elementi del medesimo tipo organizzata in memoria in modo contiguo". Dichiarando float** è possibile avere una matrice bidimensionale solo per il fatto che si avrà alla fine "un array di array". Cioè punterà ad un array in cui ogni elemento è un puntatore ad un altro array. Per allocare un array bidimensionale di questo tipo si fa in questo modo (ometto i controlli di errore, per brevità): Codice:
int dimensione1 = 4;
int dimensione2 = 6;
float **matrice;
int i;
matrice = (float**) malloc (dimensione1 * sizeof (float*));
for (i = 0; i < dimensione1; i++)
matrice[i] = (float*) malloc (dimensione2 * sizeof (float));
Questo metodo, tra l'altro, consente di creare matrici bidimensionali non rettangolari, dette anche "jagged" array (proprio come in Java, per esempio). Naturalmente, alla fine dell'utilizzo, bisogna poi deallocare ogni singolo sotto-array e anche l'array principale. (2) Per passare ad una funzione un "vero" array bidimensionale (es. funzione(float matrice[][])), è necessario e obbligatorio specificare almeno la seconda dimensione. Esempio: float** funzione(float matrice[][6]) Questo comporta il fatto che non si può passare ad una funzione un "vero" array bidimensionale in maniera generica, cioè con qualunque dimensione n x m. Se n'era già parlato, tra l'altro, in questo thread.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: May 2005
Messaggi: 249
|
Senti poiché non posso usare malloc esiste un altro metodo??
GRAZIE MILLE |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Jan 2001
Città: Rimini
Messaggi: 197
|
in alternativa se le dimensioni della matrice nuova le sai prima della chiamata alla funzione puoi dichiararla nel main e passarla come parametro nella funzione.
visto che array e matrici si passano sempre per riferimento alla chiusura della funzione ti troveresti la matrice nuova con i dati elaborati. altri modi senza l'uso di allocazione dinamica non te ne saprei dire..
__________________
Linux + xBox360 + iPod. Ognuno al suo posto. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Comunque senza allocazioni dinamiche (malloc e simili), non puoi fare molto per creare matrici di dimensioni "generiche" (cioè stabilite a run-time). Puoi solo creare e usare array e matrici di dimensione nota a priori (cioè conosciuta a tempo di compilazione del sorgente). Esempio: Codice:
void funzione (float matrice_input[6][6], float matrice_output[3][6])
{
....
}
int main (void)
{
float matrice_a[6][6];
float matrice_b[3][6];
....
funzione (matrice_a, matrice_b);
return 0;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: May 2005
Messaggi: 249
|
si non devo usare allocazioni dinamiche, infatti il mio problema era più che altro far ritornare la matrice... le dimensioni le ho già.. ho messo n come numero generico
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Nel sorgente che ho postato io, non viene "restituita" alcuna matrice. Nel main dichiari le 2 matrici (a e b) e poi riempi la matrice a. Nella funzione opererai sulla matrice "input" e scriverai su quella "output". Quando ritorni nel main, la matrice b contiene il risultato. Questo perché alla funzione hai passato i puntatori alle matrici.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
Un altro modo (non molto bello e nemmeno consigliato, a dir la verità
in questo modo non devi passare nessun parametro alla tua funzione... cmq, come già detto, è una soluzione che è meglio evitare... giusto?
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Dipende molto da cosa deve fare con la matrice e dal contesto della applicazione. Se la matrice deve essere gestita da molte funzioni e magari ha un "significato" globale (cioè contiene dati che servono in modo globale alla applicazione e per tutto il tempo di esecuzione), allora questa soluzione potrebbe essere accettabile. Nel caso di white05, mi sembra di capire che abbia bisogno di una semplice funzione che prende in input una matrice, la elabora e scrive il risultato su una matrice in "output". In questo caso renderla globale solo per risparmiare 1 parametro ... mi sembra una stupidata. (imho, ovviamente)
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
Quote:
io gliel'ho proposta come una delle possibli soluzioni, ma è ovviamente (come ho scritto) preferibile evitarla
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:37.



















