Newsgroup: it.faq
Titolo: FAQ del gruppo it.comp.lang.c++, rev. 1.3 - 12/09/2000

========================================================================
                  F.A.Q. UFFICIALI DI IT.COMP.LANG.C++
                      revisione 1.3  -  12/09/2000
           a cura di diversi partecipanti di it.comp.lang.c++
========================================================================
Indice delle domande:
0) Vorrei imparare il C++, e` necessario conoscere prima qualche altro
   linguaggio oppure posso imparare direttamente questo?
1) Che differenza esiste tra C++, Visual C++, Borland C++ Builder...?
2) Che differenza c'e` tra C e C++?
3) Dove posso trovare un compilatore C++ freeware?
4) Quale editor posso utilizzare per scrivere i miei programmi?
5) Dove posso trovare della documentazione sul C++ e lo standard?
6) Quali libri mi consigliate per imparare il C++ o perfezionare le
   mie conoscenze?
7) Che cosa e` la memoria dinamica? Come si usa?
8) Come posso allocare dinamicamente una matrice a piu` dimensioni e 
   utilizzare la notazione M[i][j]?
9) Che cosa e` un header? Come si creano e come si usano?
10) Se separo le definizioni di un template dalla sua dichiarazione
    ponendole in file separati (.h e .cpp) non riesco ad istanziarlo.
    Come posso risolvere il problema?
11) Come si passa un array ad una funzione in C++?
12) Come posso generare numeri casuali?
13) Come mai ottengo sempre la stessa sequenza di numeri casuali?
14) La sequenza generata da rand() non e` molto buona, dove posso
    trovare generatori di numeri casuali piu` validi?
15) Che differenza c'e` tra STL e la libreria standard del C++?
16) Lavorando con i numeri in virgola mobile, non riesco ad ottenere
    risultati precisi, perche`?
========================================================================
0) Vorrei imparare il C++, e` necessario conoscere prima qualche altro
   linguaggio oppure posso imparare direttamente questo?
R) Il C++ e` un linguaggio estremamente ricco e complesso, e come
   tale puo` non essere il piu` adatto da imparare come primissimo
   linguaggio di programmazione; esso e` stato progettato (come il
   suo precursore "C") per l'uso da parte di programmatori esperti e
   "scafati". Molti altri linguaggi sono stati progettati
   specificamente per insegnare ai principianti a programmare: alcuni,
   come il Pascal, guidano molto il principiante obbligandolo ad
   imparare ed applicare una rigorosa disciplina; altri, come Rexx,
   Python, e Basic, sono invece (in diversa misura e con diverse
   filosofie) "tolleranti" e "di manica larga". L'uno, l'altro, o
   entrambi questi approcci potrebbero essere piu` produttivi per
   imparare a programmare che non tuffarsi alla "nuotare o affogare"
   nel pelago del C++.
   Per chi gia` sa programmare (in qualsiasi altro linguaggio, Pascal,
   Basic o altro) il C++ e` un ottimo "secondo passo" nel mondo della
   programmazione.  In particolare non e` certo il caso di vedere come
   propedeutici al C++ altri linguaggi simili ma diversi (come Java,
   Objective C, Eiffel, Smalltalk...), se l'obbiettivo e` il C++,
   meglio allora studiare il C++.
   C'e` un diffuso e stranissimo mito che il linguaggio C sia
   propedeutico al C++, poiche` storicamente ne fu la radice. Questo
   equivale a dire che, per chi voglia imparare l'Inglese, sarebbe
   furbo cominciare con il Sassone basso-medievale [1].
   In pratica i modi di programmare in C e in C++ sono talmente
   diversi
   che e` meglio passare direttamente al C++ e non acquisire idiomi
   tipici del C e del tutto superati e/o controproducenti nel C++.
   [1] Consulenza sul Sassone basso-medievale di Alex Martelli! :-)
1) Che differenza esiste tra C++, Visual C++, Borland C++ Builder...?
R) Il C++ e` il linguaggio definito dallo standard ANSI/ISO.
   Lo standard ne definisce la sintassi e la semantica dei costrutti,
   le regole che lo governano e la libreria standard. Di questo
   linguaggio esistono poi diverse implementazioni per le varie
   piattaforme (DOS, Linux, Windows, Mac...), alcune sono freeware
   (GNU gcc, CygwinB20...) altre commerciali (Visual C++, Borland C++
   Builder). Queste implementazioni sono tutte piu` o meno aderenti
   allo standard, alcune offrono oltre al compilatore anche strumenti
quali
   debugger e profiler, e/o delle estensioni non standard o
particolare
   supporto
   ad una certa piattaforma. Ad esempio il Borland C++ Builder e`
anche uno
   strumento R.A.D.
2) Che differenza c'e` tra C e C++?
R) Spesso si dice che il C++ e` una estensione del C, ovvero un
   "C + AltraRoba". Questa affermazione e` corretta ed errata allo
   stesso tempo. La correttezza sta nel fatto che effettivamente il
   C++ da un punto di vista sintattico e` un sovrainsieme del C,
   tuttavia queste sue estensioni modificano totalmente il modo in cui
   si programma in C++, al punto che l'approccio C e` totalmente
   diverso e superato.
3) Dove posso trovare un compilatore C++ freeware?
R) In rete e` possibile reperire diversi prodotti gratuiti, molti sono
   basati sul compilatore GNU gcc. Ecco un breve elenco di
   possibilita`:
   GNU gcc   -   
http://gcc.gnu.org
   L'ottimo compilatore GNU, uno dei piu` aderenti allo standard,
   fornito di serie sui sistemi Linux e di cui esistono porting molto 
   validi per DOS e Windows. E` possibile trovare anche molti tool a
   supporto di questo compilatori, in particolare l'ottimo debugger
   GNU gdb ed il profiler GNU gprof.
   DJGPP   -   
http://www.delorie.com/djgpp
   E' il porting per MS-DOS del compilatore GNU gcc e viene aggiornato
   abbastanza frequentemente (almeno finora, ma la cosa potrebbe
   cambiare in futuro dato che l'MS-DOS tende sempre piu'
   all'obsolescenza).
   E' ottimo per imparare il C/C++ in quanto non mette troppa carne al
   fuoco (tipo programmazione Windows con finestre e bottoncini) ma
   offre compilatore e librerie con una buona aderenza allo standard.
   In piu' fornisce anche una nutrita serie di funzioni non standard,
   praticamente le stesse fornite con i compilatori Borland sempre
   per MS-DOS.
 
 
   CygWinB20   -   
http://sourceware.cygnus.com/cygwin/
   Basato su un porting dell'ottimo GNU gcc, fornisce un ambiente unix
   like su piattaforma windows. Sono compresi diversi tool utili, in
   particolare anche gdb il debugger GNU, ma manca di un editor di
   risorse.
   Altre utili informazione per questo compilatore si possono trovare
   su
 
http://www.remotepoint.com/~jordanh/personal/cygwin/cygwin.html
   Mingw   -   
http://www.xraylith.wisc.edu/~khan/software/gnu-win32/
 
ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/
   Sempre gcc per windows, anch'esso dotato tra l'altro di un
   debugger (GNU gdb) ed un profiler (GNU gprof). A differenza del
   precedente non offre un ambiente unix like.
--
URL per la gerarchia it. e il GCN: 
http://www.news.nic.it/news-it/

========================================================================
                  F.A.Q. UFFICIALI DI IT.COMP.LANG.C++

========================================================================
Indice delle domande:

















========================================================================













   DJGPP   -   
http://www.delorie.com/djgpp





R) Qualunque editor ASCII va bene, anche il semplice Edit del DOS o
   il Vi di Linux, tuttavia e` possibile trovare editor specializzati
   con syntax hilight (che usano cioe` colori diversi per i vari 
   elementi del linguaggio). Eccone una nutrita lista:
   QEdit
   E' un vecchio editor per MS-DOS molto snello ma potente e
   totalmente configurabile. Contiene anche un ricco macro-linguaggio.
Ora e'
   sostituito dal successivo.
 
   The SemWare Editor   -   
http://www.semware.com
   E' il successore di QEdit con molte caratteristiche in piu', una
   delle quali e' di utilizzare la memoria estesa per permettere
l'editing di
   files molto grossi. Esiste anche in versione Windows ma sempre con
   interfaccia a caratteri.
   WinEdit   -   
http://www.winedit.com
   E' un editor per Win32 che offre buona configurabilita' ed ottime
   caratteristiche tra le quali il WIL (Windows Interactive Language),
   un linguaggio molto ricco e potente che permette di creare
   praticamente qualsiasi comando di cui si puo' aver bisogno allo
   interno dell'editor stesso.
   UltraEdit   -   
http://www.ultraedit.com
   E' un altro editor per Win32 molto simile al precedente che manca
   pero' del linguaggio WIL, ma offre in piu' la possibilita' di
editing
   esadecimale.
   MultiEdit   -   
http://www.multiedit.com
   Un altro editor ancora per Win32 (ma esiste anche la versione per
   Win16). Rispetto ai precedenti offre in piu' la possibilita' di
   configurare perfino i bitmap della toolbar per quanto riguarda i
   pulsanti definiti dall'utente. Per il resto sembra comunque
   inferiore
   ai due precedenti in quanto non offre editing esadecimale, il
   linguaggio macro sembra meno potente del WIL e, a differenza degli
   altri due, non presenta la classica struttura con tree delle
   cartelle sulla sinistra e finestra di editing sulla destra.
   EditPlus   -   
http://www.editplus.com
   E` un ottimo editor di testo, con sistemi di high-lighting
   personalizzabili e, sul sito, ci sono i plug-in per gestire quasi
   tutti i linguaggi (alcuni sono presenti con l'installazione di
   base).
   Solo per piattaforma Win32.
 
   Texturizer   -   
http://djst.cjb.net/
   Altro ottimo editor di testo per Windows, con sistemi di code
   highlighting, anch'essi personalizzabili, per moltissimi linguaggi.
   La cosa piu` interessante e` che ha un costo molto basso al
   confronto con altri strumenti simili per Windows.
   PFE   -   
http://www.lancs.ac.uk/people/cpaap/pfe/
   Freeware per win32, con una serie notevole di personalizzazioni
   possibili (macro, file salvati in formato *unix*, cattura
dell'output
   dei comandi batch, e cosi' via). Esiste anche una vecchia versione
a
   16 bit. Manca solo la sintassi colorata per raggiungere la 
   perfezione. 
   KDevelop   -   
http://www.kdevelop.org
   Non e` un semplice editor, ma un IDE (un ambiente di sviluppo
   integrato) freeware per Linux con class tree, gestione di progetti,
   tool di sviluppo RAD per KDE, integrazione con debugger, browser
   integrato per la documentazione.
   CForge   -   
http://www.codeforge.com
   Altro IDE per Linux ed altri SO molto completo. E` disponibile in
   una versione free (no opensource) per uso personale e piccoli
   progetti e varie versioni commerciali a prezzi contenuti.
   Infine e` utile ricordare Emacs uno dei piu` potenti editor, dotato
   di mille funzionalita` e disponibile per molte piattaforme (Unix,
   Linux, Windows...). Lo si trova facilmente con una piccola ricerca
   in rete.
5) Dove posso trovare della documentazione sul C++ e lo standard?
R) Per lo standard ci sono 2 possibilita`, puoi comprarne una copia
   sotto forma di file pdf (Acrobat reader) all'indirizzo
 
http://webstore.ansi.org/product.asp?sku=ISO%2FIEC+14882%2D1998
   per soli 18 US$, oppure puoi comprare la versione cartacea
   (molto piu` costosa) all'indirizzo 
http://www.ansi.org/
   Per altra documentazione sul C++ eccoti nutrito elenco di indirizzi
   utili, la maggior parte dei quali riferisce per ovvie ragioni a
   risorse in lingua inglese: 
 
http://www.icce.rug.nl/docs/cplusplus/cplusplus.html
   C++ annotation, annotazioni per programmatori C che desiderano
   imparare il C++. In inglese.
 
http://www.cs.bham.ac.uk/~jdm/CPP/index.html
   Faq del NG comp.lang.c++. In inglese
 
 
http://www.eskimo.com/~scs/C-faq/top.html
 
   Faq del NG comp.lang.c. In inglese.
   In queste FAQ sono spiegati in dettaglio i sequence points, non
   discussi sulle FAQ di comp.lang.c++
 
http://www.programmazione.it
   E` un sito dedicato alla programmazione in generale, ma contiene
   molto materiale relativo al C++ compreso un tutorial in italiano
   che pero` richiede delle conoscenze di base in materia di
   programmazione.
 
http://www.bruceeckel.com
   A partire da questo indirizzo e` possibile scaricare liberamente la
   nuova edizione di "Thinking in C++", l'ottimo libro di Bruce Eckel.
   In inglese, molto valido.
 
http://www.programmingtutorials.com/
 
http://packetstorm.securify.com/programming-tutorials/
 
http://cs.nmhu.edu/personal/curtis/cs1htmlfiles/Cs1text.htm
 
http://www.cprogramming.com/
 
http://www.cyberdiem.com/vin/learn.html
 
   Su questi siti e` possibile trovare diversi tutorials ed altro
   sul C++ (ed anche sul C).
 
http://www.accu.org/
 
   Association of C and C++ users
 
http://www.utu.fi/~sisasa/oasis/oasis-cc++.html
 
http://www.la-online.com/cprog.htm
   link per C e C++ anche a documentazione varia
   Ecco dei link in cui si trova documentazione sulla
   libreria standard del C++ e su STL (vedere faq N. 15):
 
http://www.sgi.com/Technology/STL
 
http://www.dinkum.com/refstl.html
 
http://www.dinkum.com/htm_stl/index.html
 
http://www.cs.rpi.edu/~musser/stl.html
 
http://www.developer.com/reference/r_library.html
 
http://cgi.cs.rpi.edu/pub/stl/
   Alcuni Link sull'Object Oriented in generale:
 
http://www.cetus-links.org/
 
http://www.cpsc.ucalgary.ca/~gao/60903/paper.htm
6) Quali libri mi consigliate per imparare il C++ o perfezionare le
   mie conoscenze?
R) Tra le risposte alla precedente domanda trovi un link da cui
   scaricare l'ottimo libro di Bruce Eckel, adatto sia per i
   principianti che per quelli che gia` conoscono molti aspetti del
   C++.
   Al momento attuale (gennaio 2000) questo libro e` in fase di
   pubblicazione. Altri testi sono elencati di seguito, di alcuni di
   essi potrebbe essere disponibile la traduzione in italiano che
   pero` potrebbe non essere all'altezza dell'originale.
   Lippman e Lajoie, "C++ Primer" 3 ed. - Addison Wesley
   Ottimo libro per chi vuole imparare il C++. Esiste anche la
   traduzione in italiano, intitolata "C++ Corso di Programmazione".
   B. Stroustrup, "The C++ programming language" 3 ed. - Addison
   Wesley
   E` il libro del padre del C++, non e` molto valido per chi deve
   iniziare, ma e` sicuramente un buon reference ed un approfondimento
   per un programmatore C++ con una certa conoscenza del linguaggio.
   B. Stroustrup, "The design and evolution of C++" - Addison Wesley
   E` rivolto a chi vuole approfondire le conoscenze sul perche` delle
   scelte operate nella realizzazione del C++ e sul funzionamento di
   certi meccanismi. Non e` molto aggiornato rispetto allo standard,
   ma
   e` tuttora molto valido. Rivolto a conoscitori abbastanza esperti
   del linguaggio.
   S. Meyers, "Effective C++" 2 edizione e "More Effective C++"
   editi da Addison wesley
   Due libri disponibili anche in formato elettronico (CD) ad un
   prezzo conveniente (piu` aggiornati rispetto alle edizioni cartacee
   e con un plus di articoli dell'autore).
   Si tratta di una raccolta di consigli su cosa fare (e come) e cosa
   non fare in C++. Caldamente consigliati a chi vuole fare del C++ un
   utilizzo professionale.
   C. Pescio, "C++ manuale di stile" - Edizioni Infomedia
   L'argomento trattato e` l'importanza dell'uso di uno stile nella
   codifica in C++ e i problemi che possono sorgere quando non si
   usano dei principi precisi e razionali.
   Di facile lettura, molto valido e ad un prezzo abbordabile.
   Renato Conte (
co...@dsi.unive.it
)
   "Il Mondo degli Oggetti: Programmazione in C++"
   Edizioni Progetto - Padova
   Buon libro, adatto a chi ha conoscenza di programmazione in Basic,
   Pascal o altro e vorrebbe imparare da 0 il C++, semplice, con tanti
   esempi, chiaro e bene impaginato. Essendo lo scrittore italiano ed
   essendo disponibile l'indirizzo e-mail e' possibile contattarlo per
   chiarimenti, suggerimenti o altro.
   Nicolai Josuttis, 
   "The C++ standard library, a tutorial and a reference"
   Addison-Wesley
   Un altro ottimo testo.
 
   J.Coplien,
   "Advanced C++ Programming Styles and Idioms"
   Addison Wesley?
   Il breve commento che lo descrive sul sito di Infomedia:
   "Per approfondire le caratteristiche del linguaggio. Tra cui:
   programmazione object oriented, ereditarieta' multipla, tipi di
   dati astratti ed altro".
   In realta' sono trattati argomenti anche un po' distanti dal C++
   (o meglio concetti che derivano da altri linguaggi, come per
   esempio la Programmazione Orientata agli Accessi, tecniche di
   Reflection, ecc.).
   Purtroppo e` molto datato ma puo` essere comunque una lettura
   assai interessante.
   J.Coplien,
   "Multi-Paradigm DESIGN for C++"
 
   E` piu` un libro sul design del software che sulla programmazione,
   d'altronde pero` il design e` importante almeno tanto quanto
   la programmazione.
   E. Gamma, R. Helm, R. Johnson, J. Vlissides
   "Design Patterns, Elements of reusable Object-Oriented Software"
   Addison Wesley
   Una raccolta di pattern molto importanti e di impiego generale, non
   tratta dunque la programmazione in C++, ma ha piu` a che vedere col
   design. Non deve mancare nella libreria (e nella testa) di un
   professionista del C++.
   J. Lakos
   "Large-Scale C++ Software Design"
   Addison Wesley
   Dedicato alla progettazione di applicazioni C++ (molto) grosse!
   E` possibile trovare delle recensioni su questi ed altri libri
   sul sito 
http://www.accu.org/bookreviews/public/index.htm
7) Che cosa e` la memoria dinamica? Come si usa?
R) In C++ e` possibile allocare la memoria solo quando serve, ad
   esempio quando non si sa a priori quanta memoria serve per
   memorizzare una lista di valori di un certo tipo.
   Questa memoria la si alloca e dealloca attraverso l'uso dei
   puntatori e degli operatori new (new[]) e delete (delete[]).
   Ad esempio se vogliamo allocare memoria per una variabile di tipo
   T possiamo scrivere:
 
   T* VarPtr = new T(/* parametri costruttore */);
   Per utilizzare questa variabile basta dereferenziare VarPtr:
   cout << *VarPtr << endl;   // supponendo l'esistenza di
                              // ostream& operator<<(ostream&, T&)
   *VarPtr = NewValue         // assegnamento...
   Per allocare un intero array bisogna utilizzare invece la forma
   T* MyArray = new T[Size];
   cout << MyArray[0] << endl;
   MyArray[5] = NewValue;
 
   E` necessario ricordarsi di deallocare la memoria dinamica
   quando non serve utilizzando sempre e solo l'apposito operatore:
   delete VarPtr;     // per singoli elementi
   delete[] MyArray;  // per gli array
   In C sono poi disponibili anche le funzioni malloc e free, ma il
   loro uso e` sconsigliato in C++.
   Infine e` spesso assai piu` proficuo utilizzare le classi
   fornite dalla libreria standard del C++ che sollevano il
   programmatore dalla necessita` di tenere traccia delle
   allocazioni e delle deallocazioni semplificandone il lavoro.
   Ad esempio std::auto_ptr<> e` una classe che incapsula un
   puntatore intelligente che quando distrutto libera automaticamente
   anche la memoria.
   Un altro approccio si basa sull'uso di classi come std::vector<>
   std::vector<T> vT;
   // un T alla volta...:
   vT.push_back(T());    // con il ctor di default
   // e/o, anche, molti T alla volta...:
   vT.resize(23);           // altri 22 ctor di default
   vT.push_back(T(args));    // con altri ctor
   Questo ha tra l'altro gli stessi vantaggi di std::auto_ptr<>,
   in quanto gli oggetti contenuti in vT vengono automaticamente
   cancellati dal distruttore di vT stesso.
   Esistono anche altri contenitori standard, come std::list<>,
   std::set<>, std::map<>, ..., per esigenze particolari, ma
   std::vector<> e` di gran lunga il piu` utile e comune per
   la semplice allocazione dinamica.  Per il caso particolare,
   molto comune, di stringhe di caratteri di lunghezza dinamicamente
   variabile, std::string (e std::wstring, per usare Unicode) sono
   anche molto, molto pratiche.
   Il C++, essendo un linguaggio adatto anche a "programmazione di
   sistema" (cioe` di bassissimo livello), offre anche delle forme
   alternative di allocazione dinamica, che sono quelle che,
   internamente, strutture come std::vector possono usare per offrire
   la loro comoda ed efficiente funzionalita` (queste funzionalita`
   vanno incapsulate in un oggetto di tipo "allocatore" perche` 
   std::vector e soci possano poi usarle).
   In pratica, non si presenta mai una vera necessita` di
   accedere a queste funzionalita` di bassissimo livello
   (come new[]/delete[], malloc/free, e altre, meno portatili, come
sbrk
   su Unix, VirtualAllocEx su Win32, CoTaskMemAlloc nell'ambito di un
   utilizzo del COM o DCOM, eccetera eccetera), se non per
   compatibilita` con vecchio codice scritto con l'uso di esse, o
   interfacce di sistema di bassissimo livello; infatti, std::vector
   (e gli altri contenitori standard) fanno in pratica tutto quello
   che serve, al limite con l'aiuto di un oggetto allocatore non
   standard per esigenze peculiari.
8) Come posso allocare dinamicamente una matrice a piu` dimensioni e 
   utilizzare la notazione M[i][j]?
R) Ecco alcune possibilita`, alcune richiedono un po' di impegno,
   studiatele bene prima di porre eventuali quesiti sul NG.
   Approccio tradizionale di basso livello:
   #include <iostream>
   #include <iomanip>
   using namespace std;
   int main() {
     int** Matrice = new int* [10];
     // alloca la prima dimensione
     for(int i=0; i<10; ++i)
       Matrice[i] = new int [10];
     // allocazione della seconda dimensione
     // e inizializzazione della matrice
     for(int i=0; i<10; ++i)
       for(int j=0; j<10; ++j)
         Matrice[i][j] = (i+1) * (j+1);
     // visualizza il valore dei vari elementi
     for(int i=0; i<10; ++i) {
       for(int j=0; j<10; ++j)
         cout << setw(3) << Matrice[i][j] << " ";
        cout << endl;
      }
     // Deallocazione della matrice.
     // Notare che la deallocazione avviene in ordine
     // inverso rispetto all'allocazione
     for(int i=0; i<10; ++i)
        delete[] Matrice[i];
     delete[] Matrice;
   }
   Un approccio basato su vector:
   #include <vector>
   template<class T>
   class matrix {
       typedef std::vector<T> riga;
       std::vector<riga> body;
     public:
       void setSize(int x, int y) {
         body.resize(0);    // getta tutto
         body.resize(x);    // riparte
         for(int i=0; i<x; ++i)
           body[i].resize(y);
       }
       void getSize(int &x, int &y) {
         x = body.size();
         if(x) y=body[0].size();
         else y=0;
       }
       matrix() {}
       matrix(int x, int y) { setSize(x,y); }
       // non occorre dtor esplicito, quello di
       // default e` OK
       std::vector<T>& operator[](int i) { return body[i]; }
       const std::vector<T>& operator[](int i) const { return body[i];
}
   };
   Un altro, piu` a basso livello e che presenta eguale
   interfaccia d'uso pur utilizzando in realta` un semplice
   vettore e non una matrice:
   template<class T>
   class matrix {
       T* body;
       int x; int y;
     public:
       void setSize(int x, int y) {
         if(body) delete[] body;    // getta tutto
         body = new T[x*y];         // riparte
         this->x = x;
         this->y = y;
       }
       void getSize(int &x, int &y) {
         x = this->x;
         y = this->y;
       }
       matrix(): body(0) {}
       matrix(int x, int y): body(0) { setSize(x,y); }
       ~matrix() { if(body) delete[] body; }
       T* operator[](int i) { return body+i*y; }
       const T* operator[](int i) const { return body+i*y; }
   };
9) Che cosa e` un header? Come si creano e come si usano?
R) Un header e' un file di testo (con estensione .h o .hpp o altro)
   contenente normalmente dichiarazioni di funzioni, tipi, classi...
   Lo scopo principale di un header file e' quello di raggruppare in
un
   unico punto del programma tutte le dichiarazioni relative ad un
   certo argomento (ad esempio, parlando di header files standard,
   tutte quelle riguardanti l'I/O su stream o quelle riguardanti il
tipo
   std::vector in vector.h) ed evitare cosi' possibili errori di
   battitura da parte del programmatore e rendere piu` gestibile un
   programma.
   In un file header e` comunque possibile (e in alcuni casi
necessario)
   inserire anche definizioni di funzioni, variabili, costanti...
   Una volta creato un header per utilizzarlo si utilizza la direttiva
   #include "file.h" all'interno dei file che ne fanno uso.
   Per maggiori dettagli si rimanda ad un qualsiasi libro (tutorial)
   su C/C++.
10) Se separo le definizioni di un template dalla sua dichiarazione
    ponendole in file separati (.h e .cpp) non riesco ad istanziarlo.
    Come posso risolvere il problema?
R)  Gli attuali compilatori hanno bisogno di avere completo accesso
    sia alla dichiarazione che alla definizione di un template quando
    questo viene istanziato. Come conseguenza di cio` non e`
    possibile separare le definizioni dalle dichiarazioni, tutto deve
    essere messo in un unico file header (.h).
11) Come si passa un array ad una funzione in C++?
R)  In C++ un array non puo` essere passato come parametro allo
    stesso modo di una struttura o un altro aggregato.
    Sebbene sia possibile dichiarare la funzione nel seguente modo:
    const size_t Size = 100;
    void MyFunc(T array[Size]); 
    in C (e di conseguenza anche in C++) un parametro di tipo array
    di T decade a puntatore a T e Size perde di significato
    cosicche` e` possibile scrivere
    T MyArray[Size/2];
    MyFunc(MyArray);   // con tutte le conseguenze del caso
    Il modo classico in C/C++ di passare un array come parametro
    e` quello di passare un puntatore al primo elemento e la
dimensione
    dell'array:
    void MyFunc(T* Array, size_t ArraySize) {
      for(size_t i=0; i<ArraySize; ++i)
        cout << Array[i] << endl;
    }
    Questo metodo si applica sia ad array statici che array
    allocati dinamicamente:
    int main() {
      const size_t Size = 100;
      T MyArray[Size];
      T* MyDynArray = new T[Size];
      MyFunc(MyArray, Size);
      MyFunc(MyDynArray, Size);
      return 0;
    }
    Una soluzione alternativa ed elegante e` quella di utilizzare i
    template e la deduzione implicita dei parametri, ma richiede un
    compilatore standard (o almeno sufficientemente standard):
    template<typename T, size_t Size>
    void MyFunc(T (&Array)[Size])  {
      for(size_t i=0; i<Size; ++i)
        cout << Array[i] << endl;
    } 
    int main() {
      int Array1[5];
      int Array2[100];
      MyFunc(Array1);
      MyFunc(Array2);
      return 0;
    }
    Infine una soluzione quasi sempre molto valida e` quella di
    utilizzare la classe std::vector<> al posto dei tradizionali
    array:
    typedef std::vector<int> ArrayOfInt;
    void MyFunc(ArrayOfInt& array);
    ArrayOfInt MyArray;
    MyFunc(MyArray);    // passaggio di un array
12) Come posso generare numeri casuali?
R)  La libreria standard del C (e quindi del C++) prevede le
    funzioni srand() e rand().
    La prima serve a inizializzare il generatore di numeri casuali,
    la seconda invece restituisce un numero casuale nell'intervallo
    0..RAND_MAX. Se vuoi ottenere valori inferiori a RAND_MAX
    e` importante non utilizzare l'operatore di modulo:
    int random_fra_0_e_99() {
      return rand() % 100;
    }
    poiche` in questo modo otterresti una sequenza di qualita`
    assai scarsa... molto meglio utilizzare
    int un_po_meglio_fra_0_e_99() {
      static const double divisore = (1.0 + RAND_MAX)*100.0;
      return static_cast<int>(rand()/divisore);
    }
    RAND_MAX, srand() e rand() sono dichiarate in stdlib.h
13) Come mai ottengo sempre la stessa sequenza di numeri casuali?
R)  Ti sei ricordato di effettuare l'inizializzazione del generatore
    di numeri casuali? Hai evitato di inizializzarlo sempre con
    lo stesso seme? Un buon modo di fare tutto cio` e`:
    #include <stdlib.h>
    #include <time.h>
    /* ... */
    srand(static_cast<unsigned>(time(0)));
14) La sequenza generata da rand() non e` molto buona, dove posso
    trovare generatori di numeri casuali piu` validi?
R)  Il generatore fornito dalla libreria standard non e` solitamente
    di alta qualita`, anche se ha il pregio di essere veloce... Se hai
    esigenze piu` spinte, questo piccolo elenco comprende sia testi
    di teoria, sia software gia` fatto, sia informazioni sui
generatori
    hardware (non pseudo, ma VERI numeri casuali) accessibili via
rete.
 
http://csep1.phy.ornl.gov/rn/rn.html
 
http://random.mat.sbg.ac.at/
 
http://www.math.keio.ac.jp/~matumoto/emt.html
 
http://nhse.npac.syr.edu/random/
 
http://www.taygeta.com/random.xml
 
http://lavarand.sgi.com/
 
http://www.fourmilab.ch/hotbits/
 
http://www.ncsa.uiuc.edu/Apps/CMP/RNG/mascagni/www-rng.html
 
http://random.mat.sbg.ac.at/ftp/pub/data/winrand.zip
 
http://webnz.com/robert/nzc_nr02.html
 
http://www.math.keio.ac.jp/~matumoto/emt.html
 
http://www.ulib.org/webRoot/Books/Numerical_Recipes/bookcpdf.html
15) Che differenza c'e` tra STL e la libreria standard del C++?
R)  La libreria standard del C++ trae spunto da STL, il lavoro
    sviluppato da Alexander Stepanov. Molte delle funzionalita`
    offerte da STL sono state inserite nella libreria del C++,
    tuttavia la libreria del C++ non e` STL.
    STL rimane un progetto a se stante e in continua evoluzione,
    mentre il contenuto della libreria standard del C++ e` deciso
    unicamente dal comitato ANSI/ISO.
16) Lavorando con i numeri in virgola mobile, non riesco ad ottenere
    risultati precisi, perche`?
R)  E` normale, la rappresentazione dei numeri reali in base (base 10,
    base 2,...) e con un numero finito di cifre comporta inerentemente
    un errore di approssimazione. Ad esempio 1/3 in base 10 non puo`
    essere rappresentato con un numero finito di cifre, 1/10 che in
    base 10 equivale a 0.1, in base 2 e` periodico (proprio come 1/3
in base
    10).
    Infine ci sono anche i numeri irrazionali (es. sqrt(3)) che per
loro
    natura non sono mai rappresentabili con precisione in alcuna base.
    Cio` significa che lavorando con i numeri reali devi sempre
    aspettarti risultati affetti da errori di approssimazione. Tali
errori
    possono essere anche molto significativi poiche` le operazioni
aritmetiche
    tendono ad amplificarli.
    Per maggiori riferimenti, puoi leggere
    "Introduzione alla matematica computazionale"
    di R. Bevilacqua, D. Bini, M. Capovani, O. Menchi
    edito da Zanichelli


