Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-08-2010, 13:30   #1
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
[C]Matrici trasposte

Sto facendo un programma in grado di stampare la trasposta di una matrice data in input. Viene effettuata un'allocazione dinamica per le righe e le colonne, tuttavia al momento dell'inserimento dei numeri, il programma viene terminato inaspettatamente:
Codice:
#include <stdio.h>
#include <stdlib.h>

void allocate_memory ( int **matrix, int row, int col);
void load_matrix ( int **matrix, int row, int col );
void make_transpose ( int **matrix, int **transpose, int row, int col);
void print_matrix ( int **matrix, int row, int col );

int main (void) {
	
	int **matrix, **transpose; //Matrices
	int row=0, column=0;
	
	printf("How many rows for the matrix?\n");
	scanf("%d", &row);
	printf("How many columns for the matrix?\n");
	scanf("%d", &column);
	allocate_memory( matrix, row, column);
	load_matrix( matrix, row, column);
	make_transpose( matrix, transpose, row, column);
	print_matrix( matrix, row, column);
	print_matrix(transpose, row, column);
    return 0;
}
void allocate_memory( int **matrix, int row, int col)
{
	int r;
	
	if ((matrix= calloc(row, sizeof(int *)))== NULL) //Memory rows allocation
	{
		printf("Row allocation error, QUIT");
		exit(1);
	}
	else
	{
		for (r=0; r < row; r++) //Memory columns allocation
			if ((matrix[r]= calloc(col, sizeof(int)))==NULL)
			{
				printf("Column allocation error, QUIT");
				exit(1);
			}
	}	
	
}

void load_matrix ( int **matrix, int row, int col )
{
	int r, c;
	
	for ( r=0; r < row; r++)
		for ( c=0; c < col; c++)
		{	
			printf("Insert element %d.%d: ", r, c);
			scanf("%d", &matrix[r][c]);
		}
}

void make_transpose	( int **matrix, int **transpose, int row, int col)
{
	int r, c;
	for ( r=0; r < row; r++)
		for ( c = 0; c < col; c++)
			transpose[r][c] = matrix[c][r];
	
}


void print_matrix ( int **matrix, int row, int col )
{
	int r, c;
	
	for ( r=0; r < row; r++)
	{	
		for ( c =0; c < col; c++)
			printf("%d\t", matrix[r][c]);
		printf("\n");
	}
}
Finchè l'allocazione della memoria era nel main, tutto funzionava perfettamente. Ho optato per metterla in una funzione così anche per la matrice trasposta posso utilizzare la stessa funzione. Tuttavia così facendo allo scanf per caricare i valori dentro la matrice, il programma esce inaspettatamente... Non riesco a venirne a capo...
L'allocazione mi pare sia corretta...
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2010, 13:43   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2789
La matrice qui è indirizzata tramite un doppio puntatore, se vuoi allocarla in una funzione diversa devi passare l'indirizzo del doppio puntatore, altrimenti le modifiche effettuate su di esso non saranno visibili all'esterno (per via del passaggio di parametri per copia), quindi nella funzione lavorerai con un triplo puntatore.

Codice:
int **matrix;
allocaMatrice(&matrix);
...

void allocaMatrice(int ***mat){
*mat=(int**)calloc...
...
}
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2010, 13:51   #3
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
oppure più semplicemente invece di ritornare un int **

tipo:

int** allocate_memory(int rows, int cols);

poi non hai allocato nemmeno la trasposta (e mancano tutte le free)
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2010, 09:37   #4
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
La matrice qui è indirizzata tramite un doppio puntatore, se vuoi allocarla in una funzione diversa devi passare l'indirizzo del doppio puntatore, altrimenti le modifiche effettuate su di esso non saranno visibili all'esterno (per via del passaggio di parametri per copia), quindi nella funzione lavorerai con un triplo puntatore.

Codice:
int **matrix;
allocaMatrice(&matrix);
...

void allocaMatrice(int ***mat){
*mat=(int**)calloc...
...
}
Ma c'è modo di allocarla in modo differente? Perchè nell'esempio dell'esercizio la matrice viene allocata con un doppio puntatore ma dentro il main...

Quote:
Originariamente inviato da tuccio` Guarda i messaggi
oppure più semplicemente invece di ritornare un int **

tipo:

int** allocate_memory(int rows, int cols);

poi non hai allocato nemmeno la trasposta (e mancano tutte le free)
Non mi è mai stato spiegato come si usano i puntatori a funzione, che è quello che mi sembra tu abbia fatto
Comunque si lo so che mancano un paio di cose, ma i dettagli li aggiungo quando il programma almeno termina l'esecuzione correttamente.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2010, 15:22   #5
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da kwb Guarda i messaggi
Ma c'è modo di allocarla in modo differente? Perchè nell'esempio dell'esercizio la matrice viene allocata con un doppio puntatore ma dentro il main...


Non mi è mai stato spiegato come si usano i puntatori a funzione, che è quello che mi sembra tu abbia fatto
Comunque si lo so che mancano un paio di cose, ma i dettagli li aggiungo quando il programma almeno termina l'esecuzione correttamente.
E inoltre non ho nemmeno idea di come si faccia l'allocazione con un triplo puntatore...
Perchè se con due faccio così:
Codice:
int r;
	
	if ((matrix= calloc(row, sizeof(int *)))== NULL) //Memory rows allocation
	{
		printf("Row allocation error, QUIT");
		exit(1);
	}
	else
	{
		for (r=0; r < row; r++) //Memory columns allocation
			if ((matrix[r]= calloc(col, sizeof(int)))==NULL)
			{
				printf("Column allocation error, QUIT");
				exit(1);
			}
	}
Con 3 faccio così??
Codice:
int r;
	
	if ((*matrix= calloc(row, sizeof(int **)))== NULL) //Memory rows allocation
	{
		printf("Row allocation error, QUIT");
		exit(1);
	}
	else
	{
		for (r=0; r < row; r++) //Memory columns allocation
			if ((*matrix[r]= calloc(col, sizeof(int *)))==NULL)
			{
				printf("Column allocation error, QUIT");
				exit(1);
			}
	}
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 15-08-2010, 16:08   #6
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Quote:
Originariamente inviato da kwb Guarda i messaggi
Ma c'è modo di allocarla in modo differente? Perchè nell'esempio dell'esercizio la matrice viene allocata con un doppio puntatore ma dentro il main...


Non mi è mai stato spiegato come si usano i puntatori a funzione, che è quello che mi sembra tu abbia fatto
Comunque si lo so che mancano un paio di cose, ma i dettagli li aggiungo quando il programma almeno termina l'esecuzione correttamente.
no no, non c'entrano nulla i puntatori a funzione, quello che dico è che puoi fare una funzione che ritorna un int ** invece che un void, in cui quello che fai è allocare la matrice esattamente come lo fai nella tua funzione, ma alla fine ritorni il valore del puntatore alla matrice.. tipo

Codice:
int** allocaMatrice(int r, int c) {
   int **matrix = malloc(sizeof(int*) * r);
   if (matrix) {
      int i;
      for (i = 0; i < r; i++) {
         matrix[i] = malloc(sizeof(int) * c);
         if (!matrix[i]) {
            int j;
            for (j = 0; j < i; j++)
               free(matrix[j]);
            free(matrix);
            return NULL;
         }
      }
   }
   return matrix;
}
così nel main ti basta fare

int **matrix = allocaMatrice(r, c);

e chiaramente controllare che non abbia ritornato NULL per gestire l'errore.. in pratica puoi riutilizzare la tua funzione, solo cambiare il valore di ritorno e togliere il parametro matrix che passi che risulta inutile

inoltre nel codice che hai scritto

Codice:
if ((*matrix= calloc(row, sizeof(int **)))== NULL)
[...]
if ((*matrix[r]= calloc(col, sizeof(int *)))==NULL)
devi allocare un array di dimensione row di int* (non di int**), e per ogni riga un array di int (non di int*) di dimensione col, questo non cambia
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2010, 09:05   #7
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
no no, non c'entrano nulla i puntatori a funzione, quello che dico è che puoi fare una funzione che ritorna un int ** invece che un void, in cui quello che fai è allocare la matrice esattamente come lo fai nella tua funzione, ma alla fine ritorni il valore del puntatore alla matrice.. tipo

Codice:
int** allocaMatrice(int r, int c) {
   int **matrix = malloc(sizeof(int*) * r);
   if (matrix) {
      int i;
      for (i = 0; i < r; i++) {
         matrix[i] = malloc(sizeof(int) * c);
         if (!matrix[i]) {
            int j;
            for (j = 0; j < i; j++)
               free(matrix[j]);
            free(matrix);
            return NULL;
         }
      }
   }
   return matrix;
}
così nel main ti basta fare

int **matrix = allocaMatrice(r, c);

e chiaramente controllare che non abbia ritornato NULL per gestire l'errore.. in pratica puoi riutilizzare la tua funzione, solo cambiare il valore di ritorno e togliere il parametro matrix che passi che risulta inutile
Ah, non sapevo si potessero ritornare puntatori... Non mi era mai stato detto
Poi quando inserisci:
Codice:
if(matrix)
Oppure
Codice:
if (!matrix[i])
Che significa? inserire il nome della sola variabile fa controllare che questa sia TRUE? ( in questo caso che non sia vuota? )
{ Ovviamente con ! fa il NOT, questo lo so }

Per il resto, provo e ti faccio sapere.

Quote:
Originariamente inviato da tuccio` Guarda i messaggi
inoltre nel codice che hai scritto

Codice:
if ((*matrix= calloc(row, sizeof(int **)))== NULL)
[...]
if ((*matrix[r]= calloc(col, sizeof(int *)))==NULL)
devi allocare un array di dimensione row di int* (non di int**), e per ogni riga un array di int (non di int*) di dimensione col, questo non cambia
Eh ma li ho aggiunti perchè pensavo che aggiungendo un puntatore agli altri due, si dovesse aggiungere un asterisco anche ad ognuno degli int


EDIT: Ci sono riuscito!! Però non capisco questa parte di codice che hai scritto tu:
Codice:
if (!matrix[i]) {
            int j;
            for (j = 0; j < i; j++)
               free(matrix[j]);
            free(matrix);
            return NULL;
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505

Ultima modifica di kwb : 16-08-2010 alle 09:23.
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 16-08-2010, 13:45   #8
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
metti caso che riesca ad allocare il vettore di int* (vale a dire le righe) e poi magari anche qualche colonna, ma poi malloc cominci a restituire NULL, devi deallocare tutto quello che hai allocato prima di restituire NULL, sennò hai un memory leak
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2010, 09:14   #9
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Dovresti allocare memoria anche per transpose, cosi' da evitare crash
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2010, 09:50   #10
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
metti caso che riesca ad allocare il vettore di int* (vale a dire le righe) e poi magari anche qualche colonna, ma poi malloc cominci a restituire NULL, devi deallocare tutto quello che hai allocato prima di restituire NULL, sennò hai un memory leak
Ah, ho capito... Da come aveva spiegato il professore, avevo capito che malloc ( o calloc ) controlla prima se c'è ( nel totale ) memoria sufficiente per allocare ciò che gli serve, se si inizia l'allocazione, se no restituisce NULL. Non avevo capito che questo controllo viene fatto in corso d'opera, ovvero:
Controllo
Alloco
Controllo
Alloco

ecc...

Quote:
Originariamente inviato da sottovento Guarda i messaggi
Dovresti allocare memoria anche per transpose, cosi' da evitare crash
Si bhe, ho fatto una funzione a parte proprio per non dover scrivere lo stesso codice due volte!

Per la deallocazione ho fatto così, è corretto? Non mi restituisce errori e il programma funziona correttamente, però non sono certo sia giusto perchè ho pensato si possa presentare lo stesso problema che avevo durante il tentativo di fare una funzione solo per l'allocazione:

Il prototipo:
Codice:
void deallocate_memory ( int **matrix, int **transpose, int row, int col);
Nel main.c:
Codice:
deallocate_memory(matrix, transpose, row, column);
Dentro la funzione deallocate_memory:
Codice:
void deallocate_memory ( int **matrix, int **transpose, int row, int col)
{
	int r;
	for ( r=0; r < row; r++)
	{	
		free(matrix[r]);
		free(transpose[r]);
	}
	
	free(matrix);
	free(transpose);
}
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2010, 10:40   #11
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
Quote:
Originariamente inviato da kwb Guarda i messaggi
Poi quando inserisci:
Codice:
if(matrix)
Oppure
Codice:
if (!matrix[i])
Che significa? inserire il nome della sola variabile fa controllare che questa sia TRUE? ( in questo caso che non sia vuota? )
{ Ovviamente con ! fa il NOT, questo lo so }
Viene valutata l'espressione all'interno delle parentesi,la quale è FALSE se l'espressione restituisce 0, TRUE per ogni altro numero. Questa regola però non è detto che valga per tutti i linguaggi di programmazione.

Per il resto la tua deallocazione è corretta.
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2010, 12:08   #12
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da kwb Guarda i messaggi
Codice:
void deallocate_memory ( int **matrix, int **transpose, int row, int col)
{
	int r;
	for ( r=0; r < row; r++)
	{	
		free(matrix[r]);
		free(transpose[r]);
	}
	
	free(matrix);
	free(transpose);
}
E' corretta, ma non molto conveniente. Se infatti deallocassi una sola matrice alla volta, avresti un'implementazione piu' semplice (si lo so, e' un esempio e la semplicita' e' solo questione di due righe) e la potresti usare dappertutto, anche nel caso che nel tuo programma ci sia una terza matrice contenente la somma ed una quarta contenente la differenza, ed una quinta....
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2010, 13:44   #13
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
Osservazione giustissima... Ho fatto inoltre caso al fatto che in quel modo c'è un errore nel caso in cui la matrice non sia quadrata, dato che le righe della matrice sono in realtà le colonne della trasposta, quindi non puoi operare nello stesso ciclo...
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2010, 14:26   #14
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Quote:
Ah, ho capito... Da come aveva spiegato il professore, avevo capito che malloc ( o calloc ) controlla prima se c'è ( nel totale ) memoria sufficiente per allocare ciò che gli serve, se si inizia l'allocazione, se no restituisce NULL. Non avevo capito che questo controllo viene fatto in corso d'opera, ovvero:
Controllo
Alloco
Controllo
Alloco

ecc...
certo che è così, ma quando fai la prima malloc in quella funzione nessuno ha idea del fatto che hai intenzione di allocare anche le colonne.. lì non c'è una malloc, ma un numero variabile.. una qualsiasi di queste malloc potrebbe fallire

ps

(!matrix[i]) equivale a (matrix[i] == 0) cioè a (matrix[i] == NULL) visto che NULL è definito come 0x0
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2010, 16:22   #15
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da oNaSsIs Guarda i messaggi
Viene valutata l'espressione all'interno delle parentesi,la quale è FALSE se l'espressione restituisce 0, TRUE per ogni altro numero. Questa regola però non è detto che valga per tutti i linguaggi di programmazione.
Chiaro, grazie! Per ora mi concentro sul C che ne ho da imparare

Quote:
Originariamente inviato da sottovento Guarda i messaggi
E' corretta, ma non molto conveniente. Se infatti deallocassi una sola matrice alla volta, avresti un'implementazione piu' semplice (si lo so, e' un esempio e la semplicita' e' solo questione di due righe) e la potresti usare dappertutto, anche nel caso che nel tuo programma ci sia una terza matrice contenente la somma ed una quarta contenente la differenza, ed una quinta....
Si lo so che dal punto di vista funzionale sarebbe stato meglio avere una funzione che deallochi una singola matrice, così da poterla riutilizzare, però non mi serviva in questo programma...

Quote:
Originariamente inviato da oNaSsIs Guarda i messaggi
Osservazione giustissima... Ho fatto inoltre caso al fatto che in quel modo c'è un errore nel caso in cui la matrice non sia quadrata, dato che le righe della matrice sono in realtà le colonne della trasposta, quindi non puoi operare nello stesso ciclo...
Si, non ci avevo pensato... Infatti ho provato ora e da errore...

Quote:
Originariamente inviato da tuccio` Guarda i messaggi
certo che è così, ma quando fai la prima malloc in quella funzione nessuno ha idea del fatto che hai intenzione di allocare anche le colonne.. lì non c'è una malloc, ma un numero variabile.. una qualsiasi di queste malloc potrebbe fallire
Ok, capito!

Quote:
Originariamente inviato da tuccio` Guarda i messaggi
ps

(!matrix[i]) equivale a (matrix[i] == 0) cioè a (matrix[i] == NULL) visto che NULL è definito come 0x0
Bene!
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
Old 17-08-2010, 19:31   #16
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
Quote:
Originariamente inviato da kwb Guarda i messaggi
Si lo so che dal punto di vista funzionale sarebbe stato meglio avere una funzione che deallochi una singola matrice, così da poterla riutilizzare, però non mi serviva in questo programma...
Come non ti serve, è proprio la soluzione al tuo problema (quello delle matrici rettangolari) invece...
Codice:
void deallocate_memory ( int **matrix, int **transpose, int row, int col)
{
	deallocate_matrix(matrix,row);
	deallocate_matrix(transpose,col);
}

void deallocate_matrix(int **matrix, int row)
{
	int r;
	for ( r=0; r < row; r++)
	{
		free(matrix[r]);
	}
	free(matrix);
}
E' un codice scritto così su due piedi quindi potrebbe essermi sfuggito qualcosa, però logicamente è così che si potrebbe risolvere il problema...
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
Old 18-08-2010, 09:36   #17
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Quote:
Originariamente inviato da oNaSsIs Guarda i messaggi
Come non ti serve, è proprio la soluzione al tuo problema (quello delle matrici rettangolari) invece...
Codice:
void deallocate_memory ( int **matrix, int **transpose, int row, int col)
{
	deallocate_matrix(matrix,row);
	deallocate_matrix(transpose,col);
}

void deallocate_matrix(int **matrix, int row)
{
	int r;
	for ( r=0; r < row; r++)
	{
		free(matrix[r]);
	}
	free(matrix);
}
E' un codice scritto così su due piedi quindi potrebbe essermi sfuggito qualcosa, però logicamente è così che si potrebbe risolvere il problema...
Si si hai ragione. Ho poi ricontrollato bene e testato il programma e in effetti dava dei problemi ( crash e vari ), questo perchè mi ero scordato che se si fa la trasposta, la grandezza della riga di questa corrisponde alla lunghezza della matrice originale.. Io invece nel programma passavo sempre righe e colonne senza invertirle. Infatti poi con matrici non quadrate venivano fuori dei casini.
Poi anche per la deallocazione era necessario fare una funzione generica così da poter invertire righe e colonne per la trasposta.
Devo dire che sto esercizio è servito come il pane per capire bene come funzionano ste matrici allocate dinamicamente.
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
kwb è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
Spento lo strumento LECP della sonda spa...
Voyager Technologies ha siglato un accor...
GoPro annuncia la linea MISSION 1 con tr...
Alcune varianti dei futuri Samsung Galax...
Il ridimensionamento di OnePlus in Europ...
Il cofondatore di Netflix ha lasciato l'...
ASUS porta in Italia il nuovo Zenbook Du...
Assassin's Creed: Black Flag Resynced, s...
Xbox Game Pass cambierà: tra le n...
I nuovi Surface Pro e Laptop sono vicini...
OnePlus ci riprova con la fascia bassa: ...
La Top 10 delle offerte Amazon del weeke...
XGIMI MoGo 2 Pro a 339€: Google TV con N...
Forum IT & Intelligence 2026: dall'A...
iPhone 16e per la prima volta a meno di ...
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: 06:14.


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