[Tech] C che stress!!!!

Marco Ermini markoer@markoer.org
Gio 5 Apr 2001 11:23:02 CEST


Sergio Ballestrero wrote:
> 
> 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".

Comunque esistono delle librerie di matrici fatte in STL. Io sono un fautore
dell'usare una classe "matrice" comunque: sta a te creare un iterator
veloce... comunque e' meglio lasciar stare, perche' credo che si entri in una
discussione "filosofica" 


>  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);

devi fare un banalissimo for da list1.begin() a list1.end() che mandi ad cout
<< un separatore ogni volta che stampi un elemento. Ecche' c'e' vo'? di sicuro
non e' *piu'* brutta della tua versione in C!

for {
    printf("%i - ", elemento[j][k]);
}

for {
    cout << elemento[j][k] << ' - ';
}


> > 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.

Come ho detto non e' ottimale. Puoi fare benissimo una classe matrix composta
di array. Puoi per esempio fare un template partendo da array o da vector. Nel
mio esempio sei lento ma puoi definire righe di lunghezza diversa (l'avevo
detto mi pare), non essendo una feature che ti serve, puoi invece bene dare
come hai fatto poi tu sotto


> > 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 :-/) 

Anche se sempre meno. In particolare il nefasto compilatore di RedHat 7, che
non compila il kernel, ha una implementazione decente pero' dei namespaces


> 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.

Sono d'accordo. Anche se, come dicevo, si cade in discussioni filoofiche da
cui non si esce piu' ;-)


> 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 :-)

Bell'esempio... potevi anche farci l'iterator visto che c'eri :-) (e non
volendo renderla di dimensioni statiche in fase di inizializzazione, come
dicevo puoi partire da array o vector). Io l'ho fatto notare piu' a te che a
lui, visto che avevi tirato in ballo il C++ (punto su cui sono mooolto
sensibile! :-)

Comunque, bell'esempio davvero, come sempre, ottima prova!


ciao ciao ciao

-- 
Marco Ermini
http://www.markoer.org - ICQ # 50825709
There are two major products that come out of Berkeley: LSD and UNIX.
We don't believe this to be a coincidence.      -- Jeremy S. Anderson




Maggiori informazioni sulla lista flug-tech