Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto
Samsung rinnova la serie pieghevole di punta con Galaxy Z Fold8 Ultra: pannello interno da 8 pollici quasi senza piega, cerniera Flex Titanium, Snapdragon 8 Elite Gen 5 for Galaxy e batteria finalmente da 5.000 mAh. Prezzo italiano da 2.299 a 2.899 euro. Tra colorimetro, benchmark reali e giorni di uso quotidiano, ecco dove questo pieghevole convince e dove il nome Ultra fatica ancora a trovare piena giustificazione
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing"
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing"
La nuova Insta360 X6 introduce sensori Sony da 1/1.1" e un SoC Triple AI a 4nm. Analizziamo le riprese 8K, il primo Dolby Vision nativo a 10-bit nel settore sferico e l'innovativo flusso di lavoro diretto sulla futura versione 22 di DaVinci Resolve.
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli
Dopo due settimane trascorse al volante della Dacia Spring 2026 possiamo raccontarvi tutto, dalle novità di motore e batteria, fino ai consumi in tutti le situazioni, compresa l'autonomia reale ad alta velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-02-2011, 09:54   #1
-Slash
Senior Member
 
L'Avatar di -Slash
 
Iscritto dal: Mar 2006
Messaggi: 2516
[C] Passare sottomatrice ad una funzione

Salve ragazzi.

Ho una funzione che prende in ingresso un float**, rappresentante una matrice allocata con malloc, e la dimensione n della matrice stessa . Questa funzione dovrebbe richiamare due volte se stessa su una matrici di dimensioni n/2: la prima volta sulla sottomatrice in alto a sinistra (formata dalle prime n/2 righe e le prime n/2 colonne) e la seconda volta sulla sottomatrice in basso a destra (formata dalle ultime n/2 righe e le ultime n/2 colonne).

Non penso francamente di dover effettuare una copia in altre due matrici per fare questo.. Ho pensato di passare un intero relativo alla posizione iniziale (0 nel primo caso, n/2 nel secondo) ma mi complicherebbe le cose visto che l'algoritmo è abbastanza complesso ed in questo modo so già che farei un casino di errori

C'è modo di passare direttamente un puntatore alla sottomatrice, come se fosse una normale matrice?

Vi ringrazio per la pazienza
-Slash è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2011, 00:29   #2
-Slash
Senior Member
 
L'Avatar di -Slash
 
Iscritto dal: Mar 2006
Messaggi: 2516
Up ragazzi. Anche un semplice "no, non è possibile", così mi metto l'anima in pace e inizio a correggere le varie funzioni che ho fatto passando gli indici

Ho provato a passare alla funzione tipo &x[2][2], ed ho provato ad utilizzare questo come se fosse una matrice, ma ovviamente non funziona, immagino perchè &x[2][2] è un puntatore ad intero mentre una matrice è rappresentabile come un puntatore doppio!
-Slash è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2011, 01:27   #3
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Te lo dico subito... non lo so e non ci avevo mai pensato prima, ma siccome mi sono incuriosito ho fatto delle prove con una matrice 2x2
Codice:
printf("%d\n", &tmp[0][0]);
printf("%d\n", &tmp[0][1]);
printf("%d\n", &tmp[1][0]);
printf("%d\n", &tmp[1][1]);
risultati
Codice:
1606417088
1606417092
1606417096
1606417100
quindi se io volessi puntare direttamente al valore contenuto nella cella tmp[1][0] posso utilizzare l'indirizzo di memoria 1606417096

l'elemento successivo ovviamente è semplice, basta incrementare di 4 bytes. Ma se dobbiamo cambiare riga, cioè supponiamo che abbiamo anche la riga 2, non basta più incrementare di 4 bytes, ma di 8 (in questo semplice caso)

Quindi la regola dovrebbe essere
1) mantenere memorizzata la dimensione originale della matrice
2) incrementare di X bytes (a seconda del puntatore) per scorrere la colonna
3) incrementare di X*dimensione originale per cambiare la riga

a tutto il resto ci si pensa domani dato che mi sono appena sbranato un piatto di pasta e una birrozza

Ps
ho supposto la matrice quadrata e fatto le prove con int
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2011, 02:16   #4
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da -Slash Guarda i messaggi
Salve ragazzi.

Ho una funzione che prende in ingresso un float**, rappresentante una matrice allocata con malloc, e la dimensione n della matrice stessa . Questa funzione dovrebbe richiamare due volte se stessa su una matrici di dimensioni n/2: la prima volta sulla sottomatrice in alto a sinistra (formata dalle prime n/2 righe e le prime n/2 colonne) e la seconda volta sulla sottomatrice in basso a destra (formata dalle ultime n/2 righe e le ultime n/2 colonne).

Non penso francamente di dover effettuare una copia in altre due matrici per fare questo.. Ho pensato di passare un intero relativo alla posizione iniziale (0 nel primo caso, n/2 nel secondo) ma mi complicherebbe le cose visto che l'algoritmo è abbastanza complesso ed in questo modo so già che farei un casino di errori

C'è modo di passare direttamente un puntatore alla sottomatrice, come se fosse una normale matrice?

Vi ringrazio per la pazienza
Presupposto che la funzione che vuoi creare ha un header del tipo
Codice:
<qualcosa> funzione (float **matrice, int dimensione)
se la matrice è quadrata, altrimenti le dimensioni da passare sono due

Allora, quel float** indica che la matrice è allocata come un array di array.
Più o meno:
Codice:
 _      _____________
|0| -> |_____________|
|1| -> |_____________|
|2| -> |_____________|
|3| -> |_____________|
 ^
 |
|matrice|
La variabile matrice contiene l'indirizzo dell'array verticale di sinistra, che contiene gli indirizzi dei quattro array orizzontali di destra, ciascuno dei quali contiene quattro variabili float. Con l'aritmetica dei puntatori si possono fare parecchie belle cose, ma per il tuo caso servirà qualcosa di più potente.

Richiamare funzione sul quadrante alto/sx è piuttosto semplice:
Codice:
funzione(matrice, n/2);
L'indirizzo di partenza è lo stesso della matrice più grande, ma il numero di righe e il numero di colonne è dimezzato.
L'altro caso è più complicato, perché tramite i puntatori puoi passare ad una funzione una matrice escludendo le prime n righe usando l'operatore +, ma non puoi "tagliare" un certo numero di colonne a sinistra (per tagliarle a destra basta diminuire la dimensione).

Secondo me il metodo più "facile" per fare quello che vuoi fare tu è allocare un array... vabbè te lo scrivo in C che forse risulta più chiaro:
Codice:
<qualcosa> funzione (float **m, int n) {
	funzione(m, n/2);
	
	float **t = (float**) malloc(n / 2 * sizeof(float*));
	for (int i = 0; i < n/2; i++) {
		t[i] = m[n/2 + i] + n/2;
	}
	funzione(t, n/2);
	free(t);
}
Un esempio: matrice 4x4, la struttura è uguale al disegnino postato prima.
Io non faccio altro che allocare un array di puntatori di dimensione 2, chiamato "t".

t[0] = m[2] + 2
t[1] = m[3] + 2
o anche
t[0] = &m[2][2]
t[1] = &m[3][2]

m[2][2] e m[3][2] sono le celle sulla prima colonna della sotto-matrice in basso a destra. In questo modo, passando t sarà come passare (per indirizzo) il quarto quadrante della matrice grande.

A tua disposizione se hai dubbi

edit: ah, dimenticavo, esiste un metodo che sarebbe anche migliore del papiro che ti ho scritto sopra, ovvero aggiungere un terzo argomento a funzione che specifica da quale riga/colonna partire:
Codice:
<qualcosa> funzione (float **m, int offset, int dim) {
	funzione(m, offset, dim/2);
	funzione(m, offset + dim/2, dim/2);
}
__________________

Ultima modifica di malocchio : 22-02-2011 alle 02:20.
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2011, 12:02   #5
-Slash
Senior Member
 
L'Avatar di -Slash
 
Iscritto dal: Mar 2006
Messaggi: 2516
Vi ringrazio per le risposte

Vabbè dunque mi sembra di capire che non ci siano modi banali per fare quello che avevo in mente... Entrambi i metodi postati complicherebbero comunque le cose, quindi alla fine ho riscritto il codice con delle variabili di offset come evidenziato da malocchio (era quello che avevo in mente di fare ). Stranamente non ho fatto errori di distrazioni ed il tutto ha funzionato ancora non ci credo

Vi ringrazio per l'aiuto, siete stati gentilissimi
-Slash è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2011, 22:30   #6
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da -Slash Guarda i messaggi
Stranamente non ho fatto errori di distrazioni ed il tutto ha funzionato ancora non ci credo
Con la ricorsione il codice da scrivere è così poco che se è sbagliato te ne accorgi subito .
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto Recensione Samsung Galaxy Z Fold8 Ultra: il pieg...
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing" Insta360 X6: Dolby Vision, 8K e montaggio "...
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli Due settimane con Dacia Spring 2026: novit&agrav...
AORUS GeForce RTX 5080 INFINITY WOOD 16G: una scheda video diversa dalle altre AORUS GeForce RTX 5080 INFINITY WOOD 16G: una sc...
Hyundai Ioniq 9: dopo due settimane di test non avremmo voluto restituirla Hyundai Ioniq 9: dopo due settimane di test non ...
Il nuovo iPhone Ultra si farà attendere:...
POCO F9 Pro e F9 Ultra in arrivo in Euro...
Anthropic spiega come funziona il waterm...
Lutnick dice no alle memorie cinesi, ma ...
AGCOM ha introdotto un nuovo modo per id...
Oltre 2.000 robotaxi Pony.ai in Europa, ...
Continua la guerra silenziosa nello Spaz...
Blue Origin: inizia la costruzione del s...
Per Isaacman è stato giusto cance...
iPhone 18, un report conferma l'incremen...
Sonos ha in programma il lancio delle Ac...
Debutta Grok Bot, l'IA agentica diventa ...
iPhone Ultra, un accessorio conferma un'...
AstroRad funziona: superato il test luna...
Apple dichiara iPhone X obsoleto: stop d...
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: 20:32.


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