[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