|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Sep 2009
Messaggi: 6
|
[C] Aritmetica dei puntatori con le matrici
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 : 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;
}
Codice:
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 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. Ultima modifica di ghoan86 : 15-11-2011 alle 00:18. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2005
Messaggi: 309
|
Se vuoi tutti gli elementi contigui fai così:
Codice:
float **R;
int Nrighe;
int Ncolonne;
R = (float **)calloc(Nrighe, sizeof (float *));
R[0] = (float *)calloc(Ncolonne * Nrighe , sizeof (float));
for (k = 1; k < Nrighe; k++) {
R[k] = R[0] + k * Ncolonne;
}
Per disallocare basta fare (senza bisogno di cicli): Codice:
free(R[0]); free(R); Codice:
float *R1D;
R1D=R[0];
for(r=0;r<Nrighe;r++){
for(c=0;c<Ncolonne;c++){
R1D[r*Ncolonne+c]=1.0;
}
}
|
|
|
|
|
|
#3 | |
|
Junior Member
Iscritto dal: Sep 2009
Messaggi: 6
|
Si Cait Sith effettivamente l'errore che facevo era che dichiarando la matrice come vettore di puntatori a vettore, l'allocazione avveniva sull'heap in blocchi non contigui. Effettivamente la seconda soluzione mi permette di evitare l'allocazione di ulteriori puntatori , visto che posso ottenere lo stesso risultato con un vettore di 1D.
Ti ringrazio!! Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:08.



















