[Tech] problema con il C

Franco Bagnoli franco.bagnoli@unifi.it
Mer 17 Mar 2004 12:34:31 CET


On Wed, 17 Mar 2004, Valerio Montagnani wrote:

> On Wed, 17 Mar 2004 11:30:02 +0100 (CET)
> Leonardo Boselli <leo@dicea.unifi.it> wrote:
> 
> Ciao Leonardo, grazie per la risposta.
> 
> > float Max(float transp[12][], .... 
> 
> Così non funziona, mentre la compilazione non dà errori se dichiaro:
> 
> float Max(float transp[12][12], ....

il programma ha bisogno di sapere almeno quanto è grande una riga (non una 
colonna, come suggerito da Leonardo), perché essenzialmente con questa 
sintassi (del cavolo, con tutto il rispetto per Richtie) con trasp[y][x]
stai accedendo a transp[y*lunghezza_riga+x] ovvero a 
*(trasp+y*lunghezza_riga+x)

Purtroppo la sintassi è uguale se invece transp è un vettore di puntatori 
a vettori, nel qual caso trasp[y][x] diventa *(*(trasp+y)+x)
che è abbastanza diverso. tutto dipende da come l'hai dichiarato. 

Io ti consiglio di non usare mai la sintassi trasp[y][x] se sono veramente 
matrici, ma di implementarti i metodi (funzioni) necessarie per fare la 
manipolazione, magari mantenendo le informazioni sulle righe e colonne in 
una struttura

struct _matrix {
	double * data;
	int lx;
        int ly;
};

typedef struct _matrix * matrix;

matrix m_new(int lx, int ly) {
	matrix tmp;
	tmp = (matrix *) malloc(sizeof(struct _matrix));
	tmp->data = (double *) malloc(lx*ly*sizeof(double));
	tmp->lx = lx;
	tmp->ly = ly;
	return tmp;
}

matrix m_clone (matrix source) {
	matrix tmp;
	tmp = m_new(source->lx, source->ly);
	memcpy(tmp->data, source->data, lx*ly*sizeof(double));
	return tmp;
}


matrix transpose(matrix source) {
	matrix tmp;
	int i, j;
	int lx = source->lx;
	int ly = source->ly;
        tmp = m_new(ly, lx);
        for (j=0; j<ly; j++) {
		for (i=0; i<lx; i++) {
			tmp->data[j*ly+i] = source->data[i*lx+j];
		}
	}
	return tmp;
}

ecc. ecc. 

oppure passa al C++ (a me sembra un po' troppo pesante per fini 
scientifici, ma c'è un buon libro "C++ for scientific programmers" 
che non è male). 

-- 
Franco Bagnoli (franchino) <franco.bagnoli@unifi.it> (bagnoli@dma.unifi.it)
virtual location: Dipartimento di Energetica "S. Stecco"
ultra-virtual affiliation: Centro Dinamiche Complesse (CSDC-Firenze)
real location: Dip. Matematica Applicata "G. Sansone", Universita' Firenze,
Via S. Marta, 3 I-50139 Firenze, Italy. Tel. +39 0554796422, fax: +39 055471787




Maggiori informazioni sulla lista flug-tech