Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-05-2006, 00:36   #1
white05
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
white05 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2006, 01:18   #2
mostec
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);
}
questa è una visuale un po' vaga se ti servono particolari informazioni anche su dynamic matrix (quindi tutto il modo per allocare e preparare la matrice allocata dinamicametne), chiedi pure....


Ciao.
__________________
Linux + xBox360 + iPod.
Ognuno al suo posto.

Ultima modifica di mostec : 20-05-2006 alle 01:23.
mostec è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2006, 09:04   #3
dnarod
Senior Member
 
L'Avatar di dnarod
 
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|
dnarod è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2006, 11:17   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da mostec
es: float** funzione(float matrix[][])
È bene precisare alcune cose:

(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));
In questo modo la matrice, come dimensionalità, è sicuramente a 2 dimensioni ma non è un array nel senso stretto del "C".
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2006, 12:22   #5
white05
Member
 
Iscritto dal: May 2005
Messaggi: 249
Senti poiché non posso usare malloc esiste un altro metodo??
GRAZIE MILLE
white05 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2006, 12:47   #6
mostec
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.
mostec è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2006, 12:55   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da white05
Senti poiché non posso usare malloc esiste un altro metodo??
GRAZIE MILLE
Per quale motivo, se posso chiedere, non puoi usare la malloc? Non puoi usare in modo specifico la malloc o in generale non puoi usare alcun tipo di allocazione dinamica???

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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2006, 13:40   #8
white05
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
white05 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2006, 13:51   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da white05
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
Non necessariamente devi "far ritornare" una matrice. Questo andrebbe bene se nella funzione allochi dinamicamente una nuova matrice, ovviamente quindi da restituire in qualche modo al chiamante!

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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2006, 08:31   #10
Gandalf_BD
Senior Member
 
L'Avatar di Gandalf_BD
 
Iscritto dal: Jun 2004
Messaggi: 760
Un altro modo (non molto bello e nemmeno consigliato, a dir la verità ) è quello di dichiarare la matrice come variabile globale...
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"
Gandalf_BD è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2006, 09:07   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Gandalf_BD
Un altro modo (non molto bello e nemmeno consigliato, a dir la verità ) è quello di dichiarare la matrice come variabile globale...
in questo modo non devi passare nessun parametro alla tua funzione...
cmq, come già detto, è una soluzione che è meglio evitare...
giusto?
Beh secondo me ... dipende! Una cosa non necessariamente è sempre giusta o sempre sbagliata.
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2006, 09:14   #12
Gandalf_BD
Senior Member
 
L'Avatar di Gandalf_BD
 
Iscritto dal: Jun 2004
Messaggi: 760
Quote:
Originariamente inviato da andbin
In questo caso renderla globale solo per risparmiare 1 parametro ... mi sembra una stupidata. (imho, ovviamente)
beh, chiaro...
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"
Gandalf_BD è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
Il Dipartimento dell'Energia USA cancell...
MSI è pronta per le DDR5 cinesi a...
La sonda spaziale JAXA Hayabusa2 ha sorv...
L'Università di Sydney e IBM scop...
Credono di parlare con Microsoft e l'FTC...
Microsoft vede grandi profitti nella con...
Niente 'scatola vuota': ecco perch&eacut...
Microsoft annuncia 4800 licenziamenti: X...
Sky acquisisce la divisione media di ITV...
Chi studia con ChatGPT poi dimentica qua...
Nikon avrebbe due piani per la prossima ...
Falla in YouTube Studio: un commento e i...
In Italia sono già 200 i data center att...
SIHOO B100 torna in offerta a 169€ su Am...
C'è un modem router portatile 4G su Amaz...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v