Newsgroup: it.comp.lang.c++
Titolo: A proposito della FAQ

Naturalmente se qualcuno ha da proporre modifiche o aggiunte lo faccia
pure.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 
Nella numero 9, toglierei il riferimento a 'vector.h' (che è fuorviante), e
spiegherei che gli header standard non ereditati dal C sono privi di
estensione '.h'.
Nella 11, aggiungerei che gli array (come tutti gli altri tipi di dati)
essere anche essere passati per reference ( T (&arg)[N] ).
Aggiungerei, poi, la celebre FAQ di 'void main' e del 'return 0' implicito
in main.
Proporrei inoltre i seguenti argomenti come spunti per ulteriori FAQ:
 - la 'rule of three' 
 - problematiche sul distruttore non dichiato 'virtual'
 - definizione vs dichiarazione dei membri dati static
 - puntatore a funzione membro vs puntatore a funz. ordinaria.
Max 

 pure.
Si, io coreggerei il punto 12, dove dice:
int un_po_meglio_fra_0_e_99()
{
      static const double divisore = (1.0 + RAND_MAX)*100.0;
      return static_cast<int>(rand()/divisore);
}
ma invece dovrebbe essere
int un_po_meglio_fra_0_e_99()
{
      static const double divisore = ( 1.0 + RAND_MAX ) / 100.0;
      return static_cast<int>(rand()/divisore);
}


Sě, fatto. Ma non mi chiedere di correggerlo tipograficamente (spazi)
perché allora dovrei correggere tutto il documento.


  - puntatore a funzione membro vs puntatore a funz. ordinaria.
Chi si offre di scriverle? Non c'è bisogno di grossi trattati, bastano
poche, chiare righe. Io non lo faccio in quanto non penso di esserne in
grado, dato che il C++ non è attualmente uno dei linguaggi che uso
abitualmente.
Ecco come ho modificato i punti da te citati:
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) 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.
   Notare che che gli header standard non ereditati dal C sono privi
   di estensione '.h'.
   Per maggiori dettagli si rimanda ad un qualsiasi libro (tutorial)
   su C/C++.
e
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;
    }
    Gli array (come tutti gli altri tipi di dati) possono anche essere
    passati per reference:
    void MyFunc(T (&Array)[], size_t ArraySize) {
      for(size_t i=0; i<ArraySize; ++i)
        cout << Array[i] << endl;
    }
    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
Vedi un po' se vanno bene.


Io aggiungo:
-1) Perche` dovrei leggere questo documento ?
R) Potresi trovare qui le risposte alle tue domande rapidamente senza
   dover aspettare che qualcuno ti scriva. Magari se trovi risposte che
   ti fanno sorgere altre domande, cercale sempre in questo documento.
   Quando poi veramente non riesci a venirne fuori, cerca nel gruppo
   it.comp.lang.c++ con parole chiave del tuo problema su google:
 
http://groups.google.it/groups?hl=it&lr=&group=it.comp.lang.c%2B%2B
   (copia anche %2B%2B o la tua ricerca andra` su it.comp.lang.c)
   Magari esistono gia` risposte date da altri.
   Se non riesci a capire le risposte degli altri, controlla i termini
   usati su un tuo libro o in qualche sito web citato in questa faq.
   Questo potrebbe aiutarti anche nel porre poi la domanda ai
   partecipanti del gruppo.
   Se non hai tempo di fare tutto questo, ti verra` forse chiesto
   comunque di farlo, in modi piu' o meno cortesi. Se non hai tempo,
   evita quindi perdite di tempo e cerca di essere preciso nel formulare
   le domande.
 
   Ricordati anche di leggere il manifesto del gruppo.
   (inserire link al NIC)
0)
   (in genere, sarebbe il caso di ricordarsi dei programmatori C che
   devono passare al C++ e tenerne conto, riservando spazi di risposte
   adeguate a loro)
3)
   Ora ci sono anche quelli Microsoft e Intel, ottenibili e usabili
   entro certi limiti.
   (inserire link ai rispettivi siti di download)
4)
   (E qui, scusate ma voglio anche una posto per:)
   VIM   -   
http://www.vim.org
   Estensione dello storico 'vi' per Unix disponibile anche per Windows.
   Dotato anche di interfaccia grafica con menu` per principianti.
   Diventa uno strumento velocissimo dopo un opportuno addestramento
   all'uso solo-tastiera. Impareggiabile dopo l'accostamento a GNU
   Screen. Consiglio di comprare il libro con il quale l'autore
   finanzia un progetto a scopo umanitario, oppure di scaricarlo,
   stamparlo e leggerselo lontano dal computer.
6) C'e` anche una versione in italiano del primo libro di Eckel
   (inserire link)
15)
   (magari una domanda simile o comunque una citazione a boost)
Siete ovviamente liberi di modificare/correggere/stravolgere quanto
appena detto.
--
int

    (magari una domanda simile o comunque una citazione a boost)
Ti va di farla?


 Ti va di farla?
No. Sono l'ultima persona sulla terra che puo' parlare di boost. :-)
Sarebbe il caso pero` di citarla vista la standardizzazione futura di
alcune sue parti e della sua qualita`.
-- 
int

 alcune sue parti e della sua qualita`.
Non perdiamo però di vista lo scopo del documento: rispondere a domande
frequenti fatte nel newsgroup non descrivere le caratteristiche del C++.


 abitualmente.
Io proporrei questo. Anziché scrivere i testi da zero, si potrebbe andare 
ripescare qualche intervento significativo apparso in questa sede. Gli 
argmomenti che ho menzionato sono stati discussi più volte da quando il 
newsgroup è nato, spesso da gente molto esperta, come Musatti o Martelli 
(per dirne due). Si potrebbe anche riportare il Message-Id del contributo 
originale, affinché chi lo desidera possa agevolmente ripercorrere l'intera 
discussione. Tutto ovviamente previo consenso degli autori.
Max

 Dove la posso trovare?
17) a -void main() funziona perché non dovrei usarlo?
     b -Posso omettere di scrivere uno statement return in main?
     c -Posso scrivere una main ricorsiva?
a - le due definizioni garantite valide di main secondo lo
standard sono:
int main(void)
int main(int argc, char* argv[])
la prima è naturalmente riscrivibile in
int main()
Il vostro compilatore può permettervi altre forme di dichiarazione
di main. Non usatele, non avete alcun buon motivo per farlo.
b - si, è espressamente garantito che se il controllo raggiunge la
fine di main senza incontrare un return l'effetto sarà quello di
eseguire return 0;
c - no, è esplicitamente vietato.
[3.6.1 dello standard]
-- 
sbi

> - puntatore a funzione membro vs puntatore a funz. ordinaria.
XX) Posso ereditare pubblicamente da una classe che non ha distruttore
     virtuale?
Risposta breve: No.
Regola d'oro  : si eredita pubblicamente soltanto da classi con
                 distruttore public virtuale o protected non-virtual
Perché:
struct base{ };
struct derivata: public base{ };
int main(){ base* unaBase = new derivata; delete unaBase; }
deletare polimorficamente una classe senza ditruttore virtuale porta ad 
un comportamento indefinito [5.3.5.3 dello standard]
Se state pensando che non userete mai una delete in modo polimorfico, e 
ritenete quindi di essere nella legalità, avete ragione: è legale, ma 
immorale: state violando il principio di sostituzione di Liskov.
-- 
sbi

      c -Posso scrivere una main ricorsiva?
Aggiunta.


      virtuale?
Aggiunta.


 discussione. Tutto ovviamente previo consenso degli autori.
Mi pare una proposta sensata. Solo non vorrei appesantire la FAQ con
risposte troppo lunghe (secondo me una FAQ è efficace quando è semplice,
l'approfondimento è meglio che sia fatto a parte). Vedrò cosa posso
fare...



Io volevo solo far notare questa (recente) iniziativa del GCN:
http://groups.google.it/groups?as_umsgid=cnq9h7%248hi%2...@wonderland.linux.it&lr=&hl=it
ciao
-- 
Gerolamo 

 
http://groups.google.it/groups?as_umsgid=cnq9h7%248hi%2...@wonderland.linux.it&lr=&hl=it
Mi sembra senz'altro un'ottima iniziativa. Solo che io non ho capito
come si deve procedere. Mi sembra un po' complicato. Magari sono solo
problemi di gioventù di questo progetto (o problemi di senilità precoce
miei :-) ). Per il momento direi che il semplice file di testo che
abbiamo è molto più semplice. :-)


 abbiamo è molto più semplice. :-)
Ho creato seguendo le istruzioni, ora mancherebbe inserire il testo:
http://faq.news.nic.it/wiki/ICLC_2b_2bFaq?action=edit
-- 
int

 
http://faq.news.nic.it/wiki/ICLC_2b_2bFaq?action=edit
Devo inserirlo tutto lě dov'č scritto:
Inserisci una descrizione per ICLC++Faq
? E poi qual č l'indirizzo per la consultazione? Ma cosě chiunque puň
andare lě a pasticciarci? Continuo a preferire il file di testo gestito
da uno di noi...


 da uno di noi...
Idea forse pazzoide, ma e' pur sempre una proposta: strutturare si' 
tutto a wiki, pero' fornire una versione 'stable', dove un curatore in 
particolare si assume la briga (e di certo il gusto......... :P) di 
integrare la 'unstable' del wiki quando ha voglia.
Nel caso qualcuno avesse ancora dei dubbi, uso uno Debian... -_-
-- 
Mat/tia Belletti - Graduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003

 integrare la 'unstable' del wiki quando ha voglia.
Io intanto continuo cosě. Ma non ho problemi a cedere il tutto a
qualcun'altro che ritenga di fare meglio.
