Newsgroup: it.comp.programmare.win32
Titolo: Variabile = NULL

In C++ esiste una funzione paragonabile a IsNull di Visual Basic?
O meglio... qual'č il miglior modo per controllare lo stato NULL di una variabile?
Grazie.

 
if (!Variabile)
  ...
-- 
Luc.

 
se ti riferisci a un qualsiasi puntatore (per le altre tipologie di 
variabili non ha senso parlare di NULL) puoi usare
if (NULL==variabile)
Se ti riferisci ai variant (ed č quello che fa VB, credo) puoi 
controllare se il campo vt č settato a VT_NULL (attenzione che esiste 
anche VT_EMPTY che indica che il variant č vuoto...).
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

In C++ esiste una funzione paragonabile a IsNull di Visual Basic?
Non in generale, ma potrebbe esistere con una particolare
implementazione.
Il VB, se non erro, possiede i tipi Variant, che gestisce
anche il Borland C++ Builder.
Non conosco altri compilatori.
-- 
Andrea Laforgia - walkietalkie(at)
libero.it

if (NULL==variabile)
if (variable == NULL) è pochino + elegante e più logico ^_^
--
Rhymes - 
rhy...@myself.com
http://www.foxhound-games.it
"Sapete cosa fa un InputStream quando
gli si racconta una barzelletta? Reader..."

if (variable == NULL) è pochino + elegante e più logico ^_^
Falso. 
Spesso si potrebbe confondere con :
if (variable = NULL) ...
La forma :
if ( 0 == variabile ) e' molto comune in C/C++.


 
Anche l'umorismo è un concetto estremamente relativo...



Questo l'ho sentito anche al corso Mondadori.

Questo l'ho sentito anche al corso Mondadori.
Che corso ?


 ha scritto nel messaggio
news:3bb6dae...@news.tin.it...


Perchč?
Curiosita'.
In realta', il nome corretto dello standard e' ISO C++.


variabili non ha senso parlare di NULL)
tu dici?

 In realta', il nome corretto dello standard e' ISO C++.
Dai Andra... Non mi dire che anche alla Mondadori hanno sbagliato!
Ed anche sui libri ho sempre letto ANSI...
Non ci credo!

Non ci credo!
Credici.
Lo standard del C++ non e' piu' solo americano da un bel po'
di tempo.  Il nome ufficiale e' ISO C++ ed e' uno standard
internazionale.


 ha scritto nel messaggio
news:3bbaf09c...@news.tin.it...


Herbert Schildt parla di comitato ANSI/ISO.
Le parole di Herbert Schildt (rinomato per essere un pessimo
conoscitore del C++) non sono necessariamente giuste.
Stranamente questa volta ha detto una cosa corretta.
Giusto per precisare.


 tu dici?
tu no? E se no... perchč?


tu no? E se no... perchè?
Sennò i database non avrebbero una costante Null. Zero è un numero, è 
qualcosa, non è nulla. Solo nulla è nulla

no...@libero.it
 (KJK :: Hyperion) wrote in
news:Xns912DC787D91E...@127.0.0.1
: 

Si parlava di linguaggio C++, non di database e la mia affermazione sul 
fatto che il NULL (scritto tutto maiuscolo :)) ha senso solo per i 
puntatori era riferito a quello, non al discorso generale.
Scusa se sono stato poco chiaro.


Sennò i database non avrebbero una costante Null. 
Che c'entrano i database ??


i puntatori era riferito a quello, non al discorso generale.
Si parlava, originariamente, di Visual Basic, che ha un IsNull che ti 
rileva proprio se la variabile contiene il Null nel senso di nulla, 
niet, nada. Mentre nel C/C++ puoi al massimo controllare se il puntatore 
non punta a niente, ma non č la stessa cosa

 il puntatore non punta a niente, ma non è la stessa cosa
Infatti chi poneva la domanda chiedeva se in C++ c'era qualcosa di 
equivalente e, rigorosamente IMHO, la cosa più vicina è il confronto con 
un puntatore a NULL (che non punta a niente, ma a 0, che è, nella 
maggior parte dei casi pratici, la stessa cosa). 
Il VARIANT (tipo delle variabili non tipizzate in VB, scusa il gioco di 
parole) supporta un valore NULL (VT_NULL) ed è (per quel poco di VB che 
sò) quello che viene controllato dalla funzione VB (IsNull) che ha 
generato questo thread.


> Sennň i database non avrebbero una costante Null. 
AL> Che c'entrano i database ??
Effettivamente  in VB IsNull()  č un  predicato che  -se non  erro- si
applica solo a campi di un record di un DB, il NULL del C č piů simile
al Nothing del VB (č un puntatore non inizializzato).
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: 
sa...@eng.it
 ( vedere X-nospam nello header - see X-nospam in header )

applica solo a campi di un record di un DB
Sicuro ? non e' che si applica ai tipi Variant ? (la cui
natura non e' strettamente legata ai DB).


equivalente
State confrontando il C++ con il VB, che e' gia' un
confronto scorretto, in quanto si paragona un linguaggio ad
un ambiente di programmazione.
Il C++, **nelle sue implementazioni**, puo' prevedere il
tipo Variant (cosi' come fa il C++ Builder, per esempio) e
il valore Null nel dominio dei Variant (cosi' come fa il C++
Builder).
Quindi, quando qualcuno vi chiede "come si fa in C++",
chiedetegli prima quale ambiente di programmazione utilizza.


nella maggior parte dei casi pratici, la stessa cosa).
Già, ma nessuno mi pare abbia dato la risposta giusta: "In C++ il 
concetto di Null non esiste, il NULL del C++ è più vicino piuttosto al 
Nothing di VB"

Nothing di VB"
In una implementazione C++ puo' esistere il concetto di
Null, cosi' come in VB (vedi, come gia' detto, il C++
Builder).


no...@libero.it
 (KJK :: Hyperion) wrote in
news:Xns912EC67695F0...@127.0.0.1
: 

Il fatto che il thread sia arrivato a queste dimensioni dimostra (sempre 
rigidamente IMHO) che non c'è una risposta giusta (e se c'è soffia nel 
vento...). Comunque dovremmo anche chiederci quale risposta ha 
soddisfatto la curiosità di chi ha scatenato questo putiferio...
La prossima volta che si inizia un thread con una risposta giusta 
partecipo solo se c'è un premio.


 partecipo solo se c'è un premio.
Bravo Valter... hai ragione...
Il discorso è un po' vago e tale resta anche dopo la discussione. Alla fine
la mia domanda è partita dal fatto che non sapevo come controllare (nella
maniera più corretta) se una variabile (anche se puntatore) fosse o meno
uguale a NULL.
Considera che però dal thread, anche se partito per una strada e terminato
in un'altra, si carpisce sempre qualcosa di interessante e laddove la
partecipazione di tutti sia prestata con piacere... non credo si faccia mai
una cosa inutile.
Grazie ancora.

> applica solo a campi di un record di un DB
AL> Sicuro ? non e' che si applica ai tipi Variant ? (la cui
AL> natura non e' strettamente legata ai DB).
Di sicuro un  variant non inizializzato non vale NULL  ma vale True il
predicato  IsEmpty (Is  Nothing,  faccio ammenda,  vale  solo per  gli
Object e rappresenta  un riferimento non inizializzato -  il caro NULL
pointer del C).
La  documentazione di  MS sui  tipi (mi  hai spinto  a ricontrollarla,
grassie Andrea):
The Null Value
The Variant data type can contain another special value: Null. Null is
commonly used in database  applications to indicate unknown or missing
data. Because of the way it is used in databases, Null has some unique
characteristics:
Expressions involving Null  always result in Null. Thus,  Null is said
to  "propagate" through  expressions; if  any part  of  the expression
evaluates to Null, the entire expression evaluates to Null.
Passing  Null,  a  Variant  containing  Null, or  an  expression  that
evaluates to Null as an argument to most functions causes the function
to return Null.
Null values propagate through  intrinsic functions that return Variant
data types.  You can also assign Null with the Null keyword:
Z = Null
You can use the IsNull function to test if a Variant variable contains
Null:
If IsNull(X) And IsNull(Y) Then
   Z = Null
Else
   Z = 0
End If
If you  assign Null to  a variable of  any type other than  Variant, a
trappable error  occurs. Assigning Null to a  Variant variable doesn't
cause an error, and  Null will propagate through expressions involving
Variant  variables (though  Null  does not  propagate through  certain
functions). You  can return  Null from any  Function procedure  with a
Variant return value.
Variables are  not set  to Null unless  you explicitly assign  Null to
them, so if you don't use  Null in your application, you don't have to
write code that tests for and handles it.
For  More  Information   For  information  on  how  to   use  Null  in
expressions, see "Null" in the Language Reference.


uguale a NULL.
Io penso che bisogna porre le domande in modo giusto, se si
vogliono delle risposte giuste.
Non complichiamo i problemi:
1.
Se utilizzi IsNull() in Visual Basic per testare se un
Variant e' NULL, allora non c'e' un equivalente in C++, a
meno di rifarti ad implementazioni specifiche.
In C++ standard, difatti, non esiste il tipo Variant.
Quest'ultima frase, per i piu' distratti, vuol dire che ci
possono essere implementazioni (leggi compilatori)
particolari (VC++, BC++B, gcc, ecc..) che implementano
qualcosa di simile a IsNull() del VB, cosi' come ci possono
essere implementazioni che lo ignorano del tutto.
2.
Se utilizzi IsNull() in Visual Basic per testare se un
puntatore e' NULL (non so se il VB abbia i puntatori,
pero'), allora in C++ standard, in cui esistono i puntatori
come tipi predefiniti, tutto si risolve con un confronto con
la costante NULL predefinita.
Punto.
In questo non c'entrano nulla database e roba varia, c'entra
solo se il particolare compilatore C++ che stai considerando
accetta il tipo Variant o meno.
Non so se vene siete accorti, ma il succo di questa mia
risposta e' esattamente quello del primo messaggio di
Valter, dopo il quale si e' voluto scatenare una catena di
messaggi a partire da un concetto (racchiuso in un "tu dici
?") che non c'entra assolutamente nulla col problema (e
cioe' i database).


data.
Avevo letto giusto.
"Commonly used" non vuol dire "si applica solo a campi di un
record di un DB".  
E' questo che voglio sottolineare.
I database non c'entrano col problema di partenza.
Il nostro amico vuol sapere se esiste qualcosa per
controllare lo stato NULL di una variabile in C++, cosi'
come in VB.  Punto.
Questo prescinde dai database e la risposta e' strettamente
dipendente dalla possibile implementazione del tipo Variant
con un particolare compilatore C++.
Mi e' sembrato di capire dai messaggi di Valter (e sono
sicuro per quanto riguarda il C++ Builder) che il VC++
possieda questa caratteristica.
Quindi la risposta e' : in C++ standard non e' previsto il
tipo Variant, cosi' come in VB, tuttavia ci possono essere
particolari compilatori che estendono il set standard,
aggiungendo questo tipo.
Ci saranno quindi, in dipendenza dal compilatore, dei metodi
appropriati per testare la NULLITA' di una variabile
Variant.
Anche se non vi fossero, si potrebbe scrivere una semplice
funzione:
bool IsNull(Variant V)
{
     return (V == Null);
}
Attenzione al fatto che il C++ e' case-sensitive e quindi la
costante Null per i Variant deve essere definita in modo da
non collidere con NULL (C++ Builder, per esempio, la
definisce proprio "Null").


 una variabile?
In quali casi usavi IsNull in VB? campi di database? o interfacciandoti 
con altre librerie? allora sě, includi ole.h e avrai i Variant, come 
quelli di VB. In codice scritto da te? allora no, in C++ si fa 
diversamente, se vuoi indicare che ritorni dati nulli devi usare un 
puntatore e ritornare zero (NULL č deprecato in C++), dopodichč puoi 
verificare se il puntatore č nullo come fosse un booleano, con un 
semplice if

Builder).
Ma mica tanto, guarda. Dire "C ha le regexp" significa una cosa, dire 
"Perl ha le regexp" è un'altra (in Perl fanno proprio parte del 
linguaggio, in C al massimo possono essere funzioni di libreria)
Diciamo: VB e C++ chiamano con la parola Null due cose diverse. Per il 
Null di VB, C++ non ha un equivalente (stiamo parlando del linguaggio, 
non delle librerie); per il NULL di C++ (ma non si doveva usare sempre 0 
al posto di NULL in C++? che sia anche solo lontanamente collegato a 
questa faccenda?), VB ha un equivalente nella costante oggetto Nothing. 
Se non vogliamo escludere del tutto l'uso di OLE in C++, allora sì, a 
C++ viene aggiunto il tipo Variant che può contenere anche Null
Ma il fatto è che stiamo qui a scannarci e quello che ha iniziato il 
thread non s'è più fatto vivo. Dobbiamo averlo spaventato

puntatore e ritornare zero (NULL č deprecato in C++)
Dove l'hai letto che NULL e' deprecato ?


thread non s'č piů fatto vivo. Dobbiamo averlo spaventato
Be', se si comincia ad inserire argomenti che non hanno
niente a che vedere col problema di partenza, e' chiaro che
uno si spaventa e se ne va.  Se si risponde, invece, in modo
preciso e corretto, difficilmente qualcuno si spaventera'.
Chiudo qui, ho gia' dato le mie risposte all'OP.


 ha scritto nel messaggio
news:Xns912F173E01C3...@127.0.0.1...


 wrote:
AL> Il nostro amico vuol sapere se esiste qualcosa per
AL> controllare lo stato NULL di una variabile in C++, cosi'
AL> come in VB.  Punto.
A   capo  lettera  maiuscola.   Nope,  Andrea!   Il  NULL   ovvero  il
punto-a-niente, nil, lambda, messa-a-terra in VB è Empty.
NULL in VB lo hai o se assegni una costante o se fai un'operazione tra
variant in cui uno degli operatori è NULL (quindi qualcuno lo ha messo
a null) o se lo prendi da un DB.
Non so se le  librerie di accesso ai DB disponibili per  il C usino il
NULL  del  C per  mappare  anche  il NULL  del  DB,  ma  di sicuro  il
significato di NULL come non  inizializzato/non valido è mappato in VB
con Empty  (Variant) o Nothing (Objec),  non con NULL.  Un variant che
vale NULL non è un variant non inizializzato/non valido. E' un variant
con un valore valido (NULL). Lo so. VB è un dannato casino.


con Empty  (Variant) o Nothing (Objec),  non con NULL.  
E' Empty che ci interessa, tagliamo fuori tutto il resto.


del valore nullo del tipo variant del VB.
Scusa, volevo dire che non c'entra NULL, insomma io ignoro
il thread e non se ne parla piu' ;)


Dove l'hai letto che NULL e' deprecato ?
Su questo newsgroup, credo

Non c'entra nulla Nothing, si sta parlando di IsNull().
Si sta parlando di NULL. Almeno, a questo mi riferisco io. Nothing è 
l'oggetto nullo, assegna un riferimento ad esso ad una variabile oggetto 
per annullare detta variabile. Dunque, per quanto assurdo, Nothing è 
l'oggetto "puntato" da NULL. Che Nothing non sia assegnabile ad altri 
tipi che agli oggetti, è ininfluente: VB concepisce riferimenti solo 
agli oggetti, e i tipi impliciti non sono oggetti

> NULL  del  C per  mappare  anche  il NULL  del  DB,  ma  di sicuro  il
AL> No, non lo fanno, sarebbe errato.
Danke!


del valore nullo del tipo variant del VB.
ufff... ennesima (ultima) precisazione: nemmeno Empty è il puntatore 
nullo, è la variabile Variant non inizializzata.