ghoan86
14-11-2011, 22:58
Salve a tutti,
volevo sottoporvi un problema riguardante l'utilizzo dell'aritmetica dei puntatori relativo alle matrici in C.
In pratica il mio problema è il seguente: data una matrice N*N i cui elementi sono ad esempio dei float, sfruttando la caratteristica del C di memorizzare in maniera contigua le righe di una matrice, voglio stampare a video la matrice utilizzando un unico ciclo for e l'aritmetica dei puntatori anzichè utilizzare il doppio ciclo for e la notazione matrix[i][j].
Vi riporto il codice :
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define _DIMMATRIX 4
int main (int argc, char *argv[])
{
float **matrix; // matrice
// allocazione dinamica della matrice
matrix=(float **)malloc(_DIMMATRIX*sizeof(float *)); // alloco il vettore delle righe, ogni elemento dei questo vettore e' un puntatore
float offset=0;
int i,j;
for(i=0; i<_DIMMATRIX; i++) { // per ogni riga alloco le colonne
matrix[i]=(float *)malloc(_DIMMATRIX*sizeof(float));
for(j=0; j<_DIMMATRIX; j++){ // inizializzo la matrice
matrix[i][j]= offset;
offset++;
}
}
//Stampa a video
int t;
for (t=0; t < (_DIMMATRIX * _DIMMATRIX); t++) {
printf("%f\t", *(&matrix[0][0] + t ) );
printf("\n");
}
//deallocazione matrice
for(i=0; i<_DIMMATRIX; i++) // dealloco prima le colonne
free(matrix[i]);
free(matrix); // dealloco il vettore delle righe
return 0;
}
So che il codice risulterà banalissimo ma il risultato che esce fuori per (N=4) è il seguente:
0.000000
1.000000
2.000000
3.000000
0.000000
0.000000
4.000000
5.000000
6.000000
7.000000
0.000000
0.000000
8.000000
9.000000
10.000000
11.000000
Perché invece allocando staticamente la matrice il risultato risulta essere corretto? :muro:
Sperando di essere stato chiaro, ringrazio in anticipo tutti coloro che vorranno darmi una mano :) .
PS: Ovviamente per agevolare la comprensione del problema ho usato dei valori interi, il problema richiede di utilizzare i float.
volevo sottoporvi un problema riguardante l'utilizzo dell'aritmetica dei puntatori relativo alle matrici in C.
In pratica il mio problema è il seguente: data una matrice N*N i cui elementi sono ad esempio dei float, sfruttando la caratteristica del C di memorizzare in maniera contigua le righe di una matrice, voglio stampare a video la matrice utilizzando un unico ciclo for e l'aritmetica dei puntatori anzichè utilizzare il doppio ciclo for e la notazione matrix[i][j].
Vi riporto il codice :
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define _DIMMATRIX 4
int main (int argc, char *argv[])
{
float **matrix; // matrice
// allocazione dinamica della matrice
matrix=(float **)malloc(_DIMMATRIX*sizeof(float *)); // alloco il vettore delle righe, ogni elemento dei questo vettore e' un puntatore
float offset=0;
int i,j;
for(i=0; i<_DIMMATRIX; i++) { // per ogni riga alloco le colonne
matrix[i]=(float *)malloc(_DIMMATRIX*sizeof(float));
for(j=0; j<_DIMMATRIX; j++){ // inizializzo la matrice
matrix[i][j]= offset;
offset++;
}
}
//Stampa a video
int t;
for (t=0; t < (_DIMMATRIX * _DIMMATRIX); t++) {
printf("%f\t", *(&matrix[0][0] + t ) );
printf("\n");
}
//deallocazione matrice
for(i=0; i<_DIMMATRIX; i++) // dealloco prima le colonne
free(matrix[i]);
free(matrix); // dealloco il vettore delle righe
return 0;
}
So che il codice risulterà banalissimo ma il risultato che esce fuori per (N=4) è il seguente:
0.000000
1.000000
2.000000
3.000000
0.000000
0.000000
4.000000
5.000000
6.000000
7.000000
0.000000
0.000000
8.000000
9.000000
10.000000
11.000000
Perché invece allocando staticamente la matrice il risultato risulta essere corretto? :muro:
Sperando di essere stato chiaro, ringrazio in anticipo tutti coloro che vorranno darmi una mano :) .
PS: Ovviamente per agevolare la comprensione del problema ho usato dei valori interi, il problema richiede di utilizzare i float.