[Tech] C che stress!!!!

Sergio Ballestrero sballestrero@interfree.it
Mer 4 Apr 2001 22:28:08 CEST


On Wed, 4 Apr 2001, Marco Ermini wrote:

> Sergio Ballestrero wrote:
> >
> [...]
> >
> > // Soluzione C++
> [...]
> >  Ma ho un dubbio io, adesso: come cavolo passo a[][] ad una funzione,
> > senza forzare un cast a (char *) ??
>
> Come dice giustamente Bagnoli, in C un array e' sempre un puntatore, qualsiasi
> dimensione abbia.

 Quindi, non c'e' un modo di passare a[][] senza specificare almeno la
seconda lunghezza. Adesso che non ho troppo sonno, la risposta e' facile.

 per spiegarmi bene:

pippo(char a[][]){
  char c=a[0][0];
}

main(){
  char a[10][20];
  pippo(a);
}

 Non esiste un modo di dicharare pippo() che permetta di scrivere in pippo
char c=a[0][0], senza imporre al momento della compilazione almeno la
seconda dimensione.

> Vorrei soltanto farti notare che in C++ non si usa piu' molto la libreria
> stdio (e' considerata - a ragione - antiquata) e che avresti dovuto piu'
> proficuamente usare le STL (http://www.sgi.com/Technology/STL).

 Grazie Marco, conosco e adoro la STL, ma stavo parlando di veri array,
non di una classe "matrice".
 Per quanto riguarda le stream, francamente le detesto. Appena uno vuole
una formattazione decente, quello che era una riga di printf diventa 6
righe di stream. Magari sara' piu' leggibile (non per me), ma che palle..
fanno quasi rimpiangere le format dell'F77. Ad esempio, dimmi: come fai a
mettere dei separatori fra elementi in
 copy(list1.begin(), list1.end(), out);

> Qui mostro un piccolo esempio di come si farebbe "realmente" in C++:
> qui creo un array come list di list (non e' il metodo piu' proficuo e
> pulito, probabilmente andrebbe implementato un container "matrix";
> pero' posso avere delle righe di lunghezza diversa volendo. Si puo'
> usare anche "vector" invece di "list").

 Ugh. Se vuoi tempi di accesso ragionevoli, una matrice DEVE essere fatta
di vettori di vettori. Le list hanno tempi di accesso random O(N) - lo
Stroustrup lo spiega in dettaglio.

> Noterai che cosi' e' moooolto piu' elegante, molto piu' facilmente
> maneggiabile, non ci sono problemi di stack, si usano funzioni di output molto
> piu' evolute :-) ecc. ecc. Insomma un conto e' il C++ come "C evoluto", un
> altro il C++ con le STL

 Le STL sono favolose (e certe implementazioni, vedi GNU, hanno anche bug
favolosi :-/) e le uso spesso e volentieri, ma non e' obbligatorio usarle
- un iteratore non e' sempre piu' elegante, leggibile e efficiente di un
loop; se hai un array di dimensioni statiche, magari pure di elementi
semplici, non c'e' ragione di usare un container. Poi, certo, questione di
gusti.
 Io (assumendo che per questa matrice servano efficienza e accesso random,
e che sia dimensionata staticamente all'inizio), avrei scritto
semplicemente

template<class T> class FastMatrix  {
  T *m;
  int ni,nj;
public:
  FastMatrix(int ni_,int nj_) {ni=ni_;nj=nj_;m=new T[ni*nj];};
  ~FastMatrix() {delete m;};
  T & at(int i,int j){return m[i*nj+j];};
};

 (e comunque non volevo confondere troppo le idee a qualcuno che
evidentemente ha da poco cominciato con il C :-)

 Ciao,
  Sergio

-- 
--------------------------------------------------------------------------
 Things will get better despite             Sergio Ballestrero
our efforts to improve them.                       S.Ballestrero@iname.com
	-- Will Rogers







Maggiori informazioni sulla lista flug-tech