Thread overview
null pointer return problem
Oct 08, 2004
ano
Oct 08, 2004
Derek Parnell
Oct 08, 2004
ano
Oct 08, 2004
Derek
October 08, 2004
i'm porting some code over to D from C++ and am now facing the NULL pointer return problem. in C++ i have a class on which you can call a findChild() function and it will either return the child or NULL if no child with the given name exists. both cases are perfectly ok, e.g. imagine a INI config file that has some required variables in it but also some additional variables that aren't required to be present in the file. an application may want to check for those variables and if it's not there then just make some default values or something. in D i cannot make this work because of an access violation (see below).

-------------
Symbol foo = config.findChild ("foo"); // this is ok, "foo" exists
Symbol bar = config.findChild ("bar"); //error, "bar" doesn't actually exist
assert (bar != null); // access violation before the assert the even fires.
assert (null != bar); //same as above
if (bar != null) //same as above
-------------

i'm not really sure what is the best way to make this work.

) should i change the "Symbol" return value to a "Symbol*" - this should work but pointers are ugly.

) on startup, allocate a special NULL_SYMBOL that is always there and is only used to compare against.

) let findChild() throw a "new SymbolNotFoundException(name_of_symbol)".  i'm
not sure about this s it makes the calling code bloated.

which would you prefer or what else could be done. or am i missing something obvious maybe...

Best Regards,
ano


October 08, 2004
On Fri, 8 Oct 2004 08:57:43 +0000 (UTC), ano wrote:

> i'm porting some code over to D from C++ and am now facing the NULL pointer return problem. in C++ i have a class on which you can call a findChild() function and it will either return the child or NULL if no child with the given name exists. both cases are perfectly ok, e.g. imagine a INI config file that has some required variables in it but also some additional variables that aren't required to be present in the file. an application may want to check for those variables and if it's not there then just make some default values or something. in D i cannot make this work because of an access violation (see below).
> 
> -------------
> Symbol foo = config.findChild ("foo"); // this is ok, "foo" exists
> Symbol bar = config.findChild ("bar"); //error, "bar" doesn't actually exist
> assert (bar != null); // access violation before the assert the even fires.
> assert (null != bar); //same as above
> if (bar != null) //same as above
> -------------
> 
> i'm not really sure what is the best way to make this work.

There is a special way to do this is in D. Try this instead ...

 assert (bar !== null);
 assert (null !== bar);
 if (bar !== null)

Notice that there are two (2) '=' symbols used '!=='. There is also a '==='
(3 equals) to check for null. eg.  "if (bar === null) "

An alternate syntax is "if (!(bar is null)) "  and "if (bar is null)"

-- 
Derek
Melbourne, Australia
8/10/2004 7:20:21 PM
October 08, 2004
In article <ck5man$15ud$1@digitaldaemon.com>, Derek Parnell says...
>
>There is a special way to do this is in D. Try this instead ...
>
> assert (bar !== null);
> assert (null !== bar);
> if (bar !== null)
>
>Notice that there are two (2) '=' symbols used '!=='. There is also a '==='
>(3 equals) to check for null. eg.  "if (bar === null) "
>
>An alternate syntax is "if (!(bar is null)) "  and "if (bar is null)"
>
>-- 
>Derek
>Melbourne, Australia
>8/10/2004 7:20:21 PM


thanks, Derek, it works fine now. i wasn't even aware of that syntax.




October 08, 2004
On Fri, 8 Oct 2004 11:03:19 +0000 (UTC), ano wrote:

> In article <ck5man$15ud$1@digitaldaemon.com>, Derek Parnell says...
>>
>>There is a special way to do this is in D. Try this instead ...
>>
>> assert (bar !== null);
>> assert (null !== bar);
>> if (bar !== null)
>>
>>Notice that there are two (2) '=' symbols used '!=='. There is also a '==='
>>(3 equals) to check for null. eg.  "if (bar === null) "
>>
>>An alternate syntax is "if (!(bar is null)) "  and "if (bar is null)"
>>
>>-- 
>>Derek
>>Melbourne, Australia
>>8/10/2004 7:20:21 PM
> 
> 
> thanks, Derek, it works fine now. i wasn't even aware of that syntax.

Its documented under the Expressions section, sub-section "Identity Expressions".

I believe its required because the syntax "instance == expression" is really shorthand for "instance.opEquals(expression)" which means that before the opEquals() function can be called, "instance" must be a valid reference. Thus if "instance" is null, we get an access violation. This is why we need a different method to see if the reference is null before trying to use it.

-- 
Derek
Melbourne, Australia