Newsgroup: it.comp.lang.c++
Titolo: domanda su albero

ho il seguente albero:
struct nodo {
   char * word;
   unsigned int conta;
    nodo *sin, *des;
   };
più avanti nel programma ho le due seguenti righe:
albero->sin = 0;
albero->des=0;
volevo sapere cosa mettono a zero queste due righe
Grazie
Ciao
Valerio

 volevo sapere cosa mettono a zero queste due righe
Fino a che non crei un nodo da mettere a sinistra (ed uno da mettere a
destr) e' giusto che questi due puntino a NULL. Almeno sai che non puntano a
nulla. Altrimenti il puntatore contiene un valore qualsiasi e .... non puoi
sapere se e' l'indirizzo di un vero nodo o meno.
quando poi vorrai che albero->sin punti a qualche cosa farai:
albero->sin=p_nuovo_nodo;
Ora albero->sin punta al nuovo nodo.
Spero di essere stato chiaro, se non lo sono stato fammi sapere.....
Tommy

 wrote in message
news:PrxZ9.129355$AA2.5...@news2.tin.it...

Ciao Valerio,
Essendo sin e des due dati membri della tua struct, che sono di tipo
puntatore a nodo, ed essendo 0, l'equivalente di NULL per i puntatori, le
due istruzioni da te riportate, azzerano i puntatori per cui non puntano a
nessun ulteriore nodo.
Cio' significa che il nodo che ha i suoi rami sinistro e destro che puntano
a NULL, e' l'equivalente di una foglia, ovvero uno dei nodi terminali del
tuo albero.
Maurus

 wrote

Ma, non l'hai scritto tu questo programma?
Claudio Puviani

 in questo modo: testa->next non punta a nulla (NULL).
Non mi azzarderei a sostenere con tanta leggerezza che NULL vale 0 ( nè che
sia piu' chiaro :)
lo standard non lo specifica (ok! in c in genere è un define su   (void*)0
in c++ in genere è un define su 0 o 0L ).
Stroustrup tra l'altro sostiene sia meglio utilizzare 0 anziche la macro
NULL.
D'altro canto lo standard riguardo alla delete parla di safe delete su un
null pointer,
non parlando nè di 0 nè di NULL.
viva le paranoie e scusa la digressione :)
Sbirish

 viva le paranoie e scusa la digressione :)
Non fa nulla, credo che standard a parte sia accettabile dire che NULL
equivale a 0.
Tommy

 equivale a 0.
Anche perche' altrimenti il mio codice:
while(testa){
    cout << testa->val << endl;
    testa=testa->next;
}
ma anche il codice di milioni di altre persone compresi autori autorevoli
non sarebbe portabile!!!
Infatti questo codice si basa sul fatto che NULL==0, altrimenti non funziona
e dovrebbe essere riscritto:
while(testa!=NULL){
    cout << testa->val << endl;
    testa=testa->next;
}
Insomma, non ho voglia di prendermi a mano lo standard e poi mi fido, ma ti
ripeto, standard ufficiale a parte credo che cio' che ho scritto sia
"standard" e portabile!
Tommy

 la macro NULL.
Il K&R per il C dice che "NULL viene usata al posto dello 0 ..... Da questo
momento in poi la useremo sempre al posto dello 0".
Lo stesso stroustrup anche se dice che e' meglio usare 0 in quanto su di
alcuni compilatori NULL potrebbe dare problemi dovuto al type checking piu'
forte del C++. Poi dice anche che e' possibile definire const int NULL=0;
per utilizzarla senza problemi.
Tutti i compilatori C++ che io ho utilizzato non hanno mai dato problemi in
quanto non usano piu' la NULL definita come macro in stdio.h come dice il
K&R! Ora molti compilatori la accettano anche senza includere cstdio e....
non e' piu' definita come macro ((void *)0), ma per evitare problemi "quasi"
nel modo in cui dice Stroustrup.
Ecco ad esempio ecco come gestisce la cosa il VC++6:
/* Define NULL pointer value */
#ifndef NULL
#ifdef  __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif
E questo e' come funziona stdio.h in VC++.
NULL e' sicuramente standard in C, e sicuramente equivale a 0 (ed e' inclusa
in stdio.h).
Non ho a mano lo standard del C++, ma per quanto le cose siano sicuramente
piu' oscure non penso che NULL possa assumere valori diversi da 0,
altrimenti, sai che confusione ;-)
Tommy

 nel modo in cui dice Stroustrup.
NULL è un anacronismo in C++. Adoperarlo è come portare una bandiera che dice
"sono principiante in C++". Non c'è nessuna raggione per fare uso del NULL ed
ancora meno per consigliarlo ad altri.
Claudio Puviani

 wrote

Inutile dire che non concordo con la tua affermazione e che la trovo troppo
forte.
NULL non e' indispensabile, ne sono convinto! Ma non sono convinto che sia
da principiante usarlo.
Sono convinto che per fare strutture dati "in modo accademico" vedi alberi,
etc... sia piu' che giusto utilizzarlo!
Penso che tu abbia frainteso il discorso e ti stia riferendo alla normale
programmazione in C++. Ovvio che passare NULL pointers a funzioni come si
faceva in C non e' piu' richiesto in C++. Tuttavia in C++ se ti vuoi
implementare una struttura dati albero, se non usi  NULL usi 0, ma qualche
cosa devi usare..... (a meno che tu non voglia usare stratagemmi che piu'
che semplificare compilacano solo la cosa).
Beh, ho alzato la mia barriera e ne sono fiero. Tu hai puntato il tuo dito e
ti senti grande.... Siamo felici entrambi!
Tommy

 wrote


 ti senti grande.... Siamo felici entrambi!
BANDIERA non barriera!
Tommy

 scritto sia "standard" e portabile!
Quel che scrivi non ha senso.
O è standard o non lo è.
Ciò che non lo è può essere comodo, comune, o avere altri vantaggi,
ma non è C++ e come tale soggetto a variazioni eventualmente
non prevedibili.
--
Gerolamo

 programmazione in C++.
In C++ new lancia un bad_alloc, forse intendevi questo. Ma qui si parlava di
strutture dati in cui.....
Mah, cerco di capire che cosa tu possa aver pensato, ma la verita' e' che
forse abbiamo solo differenti opinioni.
Solo che io non dico che sei un principiante e non ti offendo per quello che
pensi, tu si.....
Tommy

 O č standard o non lo č.
fa parte di cstdio
Tommy

 "sono principiante in C++".
NULL č piů leggibile di 0. Non ci sono santi, sorry.
-- 
Luc.


A parte che, se non sbaglio, dovrebbe far parte di <cstddef>
e non di <cstdio> (dove non vedo che c'entri NULL
con l'I/O) il problema di NULL credo sia essenzialmente che
in C viene definito come ((void *)0), mentre in C++
trovo questo:
http://www.kuzbass.ru:8086/docs/isocpp/lib-support.html
che testualmente dice:
-4- The macro NULL is an implementation-defined C++ null
pointer constant in this International Standard (conv.ptr).*
[Footnote:
Possible definitions include 0 and 0L, but not (void*)0.
--- end foonote]
In pratica, piů che altro č una questione di tipo...
--
Gerolamo

 wrote
Scrivo qua, ma e' in conclusione a tutto quello che si e' scritto......
Voglio anche dire che tutti i miei libri di algoritmi e strutture dati in
C++ usano NULL per gestire strutture dati come alberi, code, liste etc...
Mi dispiace che Claudio dica che e' da principianti visto che sono libri di
autori autorevoli come:
Data structures & algoritm analysis in C++ second edition
by Mark Allen Weiss
published in 1999
Poi per il resto condivido che nella maggior parte dei casi (quando uno non
si deve implementare un struttura dati di questo tipo) NULL, o 0 se si
preferisce, in C++ sia quasi sempre evitabile!
Il fatto che il C++ abbia una libreria standard e' un grosso vantaggio. I
programmatori possono usarla senza dover scrivere codice, debuggarlo etc....
Insomma, un gran strumento. Non dimentichiamo pero' che il programmatore
deve comunque essere in grado di saper scrivere tali strutture dati ed
algoritmi se richiesto, altrimenti non e' completo.
Il fatto che con stratagemmi tipici del C++ si riesca ad evitare l'uso di 0
(NULL) non significa che tenere le strutture dati semplici ed accademiche e
consigliare l'uso di 0 (NULL) in tali strutture sia sbagliato. E penso che
non sia sbagliato nemmeno fuori dall'uso accademico, e' solo piu' a basso
livello, ma in questo che cosa c'e' di sbagliato!
Tommy

 In pratica, più che altro è una questione di tipo...
Bravo! Nel messaggio news:b185t2$2ib$1...@knossos.btinternet.com... circa
3 ore fa ho scritto:
#ifndef NULL
#ifdef  __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif
e documentavo questa differenza.....
Tommy

 con l'I/O)
Su questo posso aver sbagliato, ma sono pigro per verificare questo thread
mi ha stancato.
Ad ogni modo dove sbaglio ammetto le mie colpe (al contrario di altri (ma
non e' riferito a questo thread)), e ... qua forse ho sbagliato (sulla cosa
del cstdio vs. cstddef .
Tommy

 wrote in message
news:b18gtj$t4g$1...@sparta.btinternet.com...

No, sono troppo generoso....
C++ standard:  27.8.2 C Library Files
Lo standard dice:
"The macro NULL, defined in any of <clocale>, <cstddef>, <cstdio>,
<cstdlib>,<cstring>,<ctime> or <wchar> is an implementation-defined C++ null
pointer in this international Standard".
Cavolo, prima di dire che le persone sbagliano, gia' che hai preso in mano
lo standard controlla!
Sembra che ogni cosa che si possa dire contro ad una persona debba essere
detta. Io poi mi fido e mi faccio venire i dubbi!
Tommy

 (dove non vedo che c'entri NULL con l'I/O)
Beh:
1) fopen (di cstdlib) restituisce NULL se fallisce.
2) fflush(NULL) scarica tutti i buffers associati ai files di output.
3) freopen resituisce NULL se l'operazione fallisce.
4) tmpfile restituisce NULL se l'operazione fallisce.
5) tmpnam(NULL) crea una stringa diversa da qualsiasi nome di file esistente
....
6) setbuf(FILE *s, char *buf) se buf e' uguale a NULL, la bufferizzazione
dello stream viene eliminata.
7) gets restituisce NULL se raggiunge la fine del file o rileva errore.
...
forse ce ne sono altri di casi, ma inutile andare avanti.
So che questo ha poco a che fare con il C++, ma stavamo parlando di cstdio e
mi e' stato detto che la macro NULL non serve a nulla con l'I/O! Ho solo
provato il contrario, visto che alcuni mi attaccano senza motivo ;-)
Tommy

...

E quindi ancor piu' gravemente fuorviante: uno si aspetta che
significhi in modo inequivoco "generico puntatore con valore nullo" ed
invece significa solo 0.
NULL deve averla inventata Herbert Schildt ;-)
Ciao,
Nicola

> > che dice "sono principiante in C++".
???? Perche' ? Indica in modo sufficientemente immediato e chiaro
che stai parlando di puntatori!

che stai parlando di puntatori!
Sufficientemente chiaro ? A livello intuitivo la parola "NULL" mi fa
venire in mente tutto, meno che i puntatori.  Lo zero, invece, è
interpretabile in modo molto intuitivo (se non altro per analogia con
altri contesti), come un valore che indica "nullità".
-- 
Andrea Laforgia
#exclude <windows.h>

 e documentavo questa differenza.....
Gerolamo parla di Standard. Tu parli di una implementazione.
E' chiara la differenza?
Sbirish.

 NULL deve averla inventata Herbert Schildt ;-)
ghghghghgh mi hai fatto ghignare :)
complimenti per la cattiveria :)
Uno Sbirish che a volte per entrare nello standard basta pagare.


in tutta la stl SGI vedo un solo NULL ( e mi sembra chiaro il motivo in
questo caso ).
O usano tutti 'stratagemmi' come dici te..
o sono dei pessimi coder ( mi sentirei di dissentire)..
oppure l'uso di NULL da parte di chi ha codato la stl SGI è stato
opportunamente evitato.
Naturalmente questa è SOLO una implementazione.
Ma visto che se si parla astrattamente di standard sembra ti agiti e
continui a riportare pezzi di codice
da chissa' quale implementazione..
cmq ti ricordo che questo thread è nato solo perché sostenevi che l'uso di 0
invece di NULL
è fuorviante.
In genere evito di essere troppo "fiscale" riguardo lo standard, dopotutto
siamo su
it.comp.lang.c++ e non su un ng di mostri sacri..
la mia precisazione era tuttavia perche' sconsigliavi l'uso di uno stile che
è considerato
più corretto di quello che proponevi.
Uno Sbirish e la gente traviata dal C.

 E' chiara la differenza?
Ma con chi credi di parlare?!? Rilassati!
La differenza e' chiara!
NULL e' standard, la sua implementazione non e' definita. Ogni compilatore
puo' dare la sua.
Che sia 0, (void*)0, 0L,  o altro, ma non avra' mai valore diverso da 0 (il
tipo puo' cambiare invece).
Buona notte banda di polemici, vo a dormire....
Tommy

"sbirish" <sbi...@dontspam.me.tnx> wrote
no comment ma non sono d'accordo!
Tommy

 invece significa solo 0.
Allora si che è un pivello del C++.
Comunque tutti i miei colleghi usano il NULL, ed ovviamente non gliel'ho 
imposto io...
Cosi è leggibile:
int a=0;
int *pa=NULL;
Cosi un po meno:
int a=0;
int *pa=0;
Mi sembra banale il motivo...
-- 
Luc.

 invece significa solo 0.
Io invece visto il nome mi aspetto un puntatore NON generico (ma del tipo
usato) che non punta a NULLA (non punta da nessuna parte). In effetti
puntare a 0 vuole dire non puntare a nulla, visto che non e' molto
interessante l'area di memoria con valore 0 ;-)
Tommy

 Ma con chi credi di parlare?!? Rilassati!
Mi pare che tu ti stia agitando un po' troppo e che questa storia
stia degenerando in un "io ce l'ho più lungo del tuo"...
Visto che un "gruppo di _discussione_" lo intendo in maniera
diversa, per me questo thread è chiuso.
ciao.
--
Gerolamo

 per me questo thread è chiuso.
Meglio cosi'!
Tommy