digitalmars.D.dtl - Odd behaviour with dynamic array within a struct
- Brad Beveridge (42/42) Aug 07 2004 Hi all. I am working with DMD 0.98 on linux. I've just run across
 - 
Carlos Santander B.
 (53/53)
 Aug 08 2004
 "Brad Beveridge" 
escribió en el mensaje  - Regan Heath (12/65) Aug 08 2004 Yeah, but surely the line:
 - Brad Beveridge (4/4) Aug 08 2004 Thanks for the replies guys. I actually ment to post this to the main
 
Hi all.  I am working with DMD 0.98 on linux.  I've just run across
something that is a little non-intuitive.  An anonymous struct within a
struct (or class) will allocate storage, and allow you to use members
within that struct - this is expected.  However, a named struct within a
struct will not allocate storage, but its members are still happily
accessible.  This more or less gives the effect of a union.  Is this
intended or a nasty side-effect?  This took me a while to understand - I
think it's a bit of a trap for new D programmers.  Comments?
There is some example code below.
Cheers
Brad
//version=ok;  // uncomment to fix
struct A 
{
    version(ok){
        struct _fileData{
            int someval;
        }
        _fileData fileData;
    } else {
        struct fileData{
            int someval;
        }
    }
    int [] data;
}
void printInfo(A a)
{
    printf("addr %x sizeof %i\n", &a, a.sizeof);
    printf("someval %i\n", a.fileData.someval);
    printf("length of data %i\n", a.data);
}
int main(char[][] arg)
{
    int [] d;
    A a;
    a.fileData.someval=66;
    printInfo(a);
    a.data.length= 550;
    printInfo(a);
    return 0;
}
 Aug 07 2004
"Brad Beveridge" <brad.beveridge somewhere.com> escribió en el mensaje
news:cf4hbt$2lig$1 digitaldaemon.com
| Hi all.  I am working with DMD 0.98 on linux.  I've just run across
| something that is a little non-intuitive.  An anonymous struct within a
| struct (or class) will allocate storage, and allow you to use members
| within that struct - this is expected.  However, a named struct within a
| struct will not allocate storage, but its members are still happily
| accessible.  This more or less gives the effect of a union.  Is this
| intended or a nasty side-effect?  This took me a while to understand - I
| think it's a bit of a trap for new D programmers.  Comments?
|
| There is some example code below.
|
| Cheers
| Brad
|
| //version=ok;  // uncomment to fix
| struct A
| {
|     version(ok){
|         struct _fileData{
|             int someval;
|         }
|         _fileData fileData;
|     } else {
|         struct fileData{
|             int someval;
|         }
|     }
|     int [] data;
| }
|
| void printInfo(A a)
| {
|     printf("addr %x sizeof %i\n", &a, a.sizeof);
|     printf("someval %i\n", a.fileData.someval);
|     printf("length of data %i\n", a.data);
| }
|
| int main(char[][] arg)
| {
|     int [] d;
|     A a;
|     a.fileData.someval=66;
|     printInfo(a);
|     a.data.length= 550;
|     printInfo(a);
|     return 0;
| }
D is not like C in this aspect. What you have as version(ok) is the correct way
in D.
-----------------------
Carlos Santander Bernal
 Aug 08 2004
On Sun, 8 Aug 2004 08:39:28 -0500, Carlos Santander B. 
<carlos8294 msn.com> wrote:
 "Brad Beveridge" <brad.beveridge somewhere.com> escribió en el mensaje
 news:cf4hbt$2lig$1 digitaldaemon.com
 | Hi all.  I am working with DMD 0.98 on linux.  I've just run across
 | something that is a little non-intuitive.  An anonymous struct within a
 | struct (or class) will allocate storage, and allow you to use members
 | within that struct - this is expected.  However, a named struct within 
 a
 | struct will not allocate storage, but its members are still happily
 | accessible.  This more or less gives the effect of a union.  Is this
 | intended or a nasty side-effect?  This took me a while to understand - 
 I
 | think it's a bit of a trap for new D programmers.  Comments?
 |
 | There is some example code below.
 |
 | Cheers
 | Brad
 |
 | //version=ok;  // uncomment to fix
 | struct A
 | {
 |     version(ok){
 |         struct _fileData{
 |             int someval;
 |         }
 |         _fileData fileData;
 |     } else {
 |         struct fileData{
 |             int someval;
 |         }
 |     }
 |     int [] data;
 | }
 |
 | void printInfo(A a)
 | {
 |     printf("addr %x sizeof %i\n", &a, a.sizeof);
 |     printf("someval %i\n", a.fileData.someval);
 |     printf("length of data %i\n", a.data);
 | }
 |
 | int main(char[][] arg)
 | {
 |     int [] d;
 |     A a;
 |     a.fileData.someval=66;
 |     printInfo(a);
 |     a.data.length= 550;
 |     printInfo(a);
 |     return 0;
 | }
 D is not like C in this aspect. What you have as version(ok) is the 
 correct way in D.
Yeah, but surely the line:
   a.fileData.someval=66;
should be illegal if version=ok is not defined?
What about:
   printf("someval %i\n", a.fileData.someval);
does that make any sense if version=ok is not defined?
Regards,
Regan
-- 
Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/
 Aug 08 2004
Thanks for the replies guys. I actually ment to post this to the main newsgroup, but made a mistake. Walter says it is a bug BTW :) Cheers Brad
 Aug 08 2004








 
 
 
 Brad Beveridge <brad.beveridge somewhere.com>