digitalmars.D - null pointer return problem
- ano (26/26) Oct 08 2004 i'm porting some code over to D from C++ and am now facing the NULL poin...
- Derek Parnell (12/30) Oct 08 2004 There is a special way to do this is in D. Try this instead ...
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
Oct 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
Oct 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 PMthanks, Derek, it works fine now. i wasn't even aware of that syntax.
Oct 08 2004
On Fri, 8 Oct 2004 11:03:19 +0000 (UTC), ano wrote:In article <ck5man$15ud$1 digitaldaemon.com>, Derek Parnell says...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, AustraliaThere 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 PMthanks, Derek, it works fine now. i wasn't even aware of that syntax.
Oct 08 2004