digitalmars.D.bugs - struct/array static initialization bug
- Andrew Fedoniouk (22/22) Mar 09 2005 Program below outputs two lines:
- Regan Heath (16/38) Mar 09 2005 I think you meant two[] = 2?
- Andrew Fedoniouk (12/55) Mar 09 2005 I mean following:
- Regan Heath (18/30) Mar 10 2005 I see what you mean. I had it confused with:
- Andrew Fedoniouk (4/38) Mar 10 2005 Yes. But in any case compiler must be consistent in these two places.
- Regan Heath (6/61) Mar 13 2005 And what do you think is consistent?
- =?UTF-8?B?VGhvbWFzIEvDvGhuZQ==?= (30/30) Mar 13 2005 -----BEGIN PGP SIGNED MESSAGE-----
Program below outputs two lines: 2 0 2 2 First line result is a bug. { two:2 } should behave similar to int two[2] = 2 , I guess. Now { two:2 } initializes only first element of the array. --------------------------------------- import std.stdio; struct A { int one; int two[2]; } A a = { one:1, two:2 }; int two[2] = 2; int main(char[][] args) { writef("%d %d\n",a.two[0],a.two[1]); writef("%d %d\n",two[0],two[1]); return 0; } ---------------------------------------
Mar 09 2005
On Wed, 9 Mar 2005 08:45:55 -0800, Andrew Fedoniouk <news terrainformatica.com> wrote:Program below outputs two lines: 2 0 2 2 First line result is a bug. { two:2 } should behave similar to int two[2] = 2 , I guess.I think you meant two[] = 2?Now { two:2 } initializes only first element of the array.Indeed, so should it be the same as two[] = 2, or is it okay as is given that we can say two:[2,2], eg. struct A { int one; int two[2]; } A a = { one:1, two:[2,3] }; void main() { printf("%d,%d,%d",a.one,a.two[0],a.two[1]); }--------------------------------------- import std.stdio; struct A { int one; int two[2]; } A a = { one:1, two:2 }; int two[2] = 2; int main(char[][] args) { writef("%d %d\n",a.two[0],a.two[1]); writef("%d %d\n",two[0],two[1]); return 0; } ---------------------------------------Regan
Mar 09 2005
I mean following: static real rr[4] = 3.1415926; all four elements of rr will be initialized to Pi value. but if rr is member of struct this multiple-element-inititalization-by-single-value does not work. It does work in fact as compiler is happy seeing this struct A { int one; int two[4]; } A a = { one:1, two:2 }; But it is just unexpected initialization behaviour, I guess. Andrew. "Regan Heath" <regan netwin.co.nz> wrote in message news:opsnd5c7q723k2f5 nrage.netwin.co.nz...{ two:2 } should behave similar to int two[2] = 2 , I guess.I think you meant two[] = 2?On Wed, 9 Mar 2005 08:45:55 -0800, Andrew Fedoniouk <news terrainformatica.com> wrote:Program below outputs two lines: 2 0 2 2 First line result is a bug. { two:2 } should behave similar to int two[2] = 2 , I guess.I think you meant two[] = 2?Now { two:2 } initializes only first element of the array.Indeed, so should it be the same as two[] = 2, or is it okay as is given that we can say two:[2,2], eg. struct A { int one; int two[2]; } A a = { one:1, two:[2,3] }; void main() { printf("%d,%d,%d",a.one,a.two[0],a.two[1]); }--------------------------------------- import std.stdio; struct A { int one; int two[2]; } A a = { one:1, two:2 }; int two[2] = 2; int main(char[][] args) { writef("%d %d\n",a.two[0],a.two[1]); writef("%d %d\n",two[0],two[1]); return 0; } ---------------------------------------Regan
Mar 09 2005
On Wed, 9 Mar 2005 23:40:04 -0800, Andrew Fedoniouk <news terrainformatica.com> wrote:I see what you mean. I had it confused with: real rr[4]; rr[] = 3.1415926; which also sets all elements of rr to Pi value.I mean following: static real rr[4] = 3.1415926; all four elements of rr will be initialized to Pi value.{ two:2 } should behave similar to int two[2] = 2 , I guess.I think you meant two[] = 2?but if rr is member of struct this multiple-element-inititalization-by-single-value does not work.No, instead it sets only the first element.It does work in fact as compiler is happy seeing this struct A { int one; int two[4]; } A a = { one:1, two:2 }; But it is just unexpected initialization behaviour, I guess.I actually expected it to only set the first element, but, I'm used to C which does not have a 'set all elements of an array' feature (unless you count the memset function). I think it would be nice to be able to do both. Given that we can write: A a = { one:1, two:[2,0,0,0] }; or, shorthand: A a = { one:1, two:[2] }; to set 'just the first element to 2' it would make sense for: A a = { one:1, two:2 }; to set all elements to '2'. Regan
Mar 10 2005
I think it would be nice to be able to do both. Given that we can write:Yes. But in any case compiler must be consistent in these two places. Andrew. "Regan Heath" <regan netwin.co.nz> wrote in message news:opsne181pg23k2f5 nrage.netwin.co.nz...On Wed, 9 Mar 2005 23:40:04 -0800, Andrew Fedoniouk <news terrainformatica.com> wrote:I see what you mean. I had it confused with: real rr[4]; rr[] = 3.1415926; which also sets all elements of rr to Pi value.I mean following: static real rr[4] = 3.1415926; all four elements of rr will be initialized to Pi value.{ two:2 } should behave similar to int two[2] = 2 , I guess.I think you meant two[] = 2?but if rr is member of struct this multiple-element-inititalization-by-single-value does not work.No, instead it sets only the first element.It does work in fact as compiler is happy seeing this struct A { int one; int two[4]; } A a = { one:1, two:2 }; But it is just unexpected initialization behaviour, I guess.I actually expected it to only set the first element, but, I'm used to C which does not have a 'set all elements of an array' feature (unless you count the memset function). I think it would be nice to be able to do both. Given that we can write: A a = { one:1, two:[2,0,0,0] }; or, shorthand: A a = { one:1, two:[2] }; to set 'just the first element to 2' it would make sense for: A a = { one:1, two:2 }; to set all elements to '2'. Regan
Mar 10 2005
On Thu, 10 Mar 2005 12:05:07 -0800, Andrew Fedoniouk <news terrainformatica.com> wrote:And what do you think is consistent? Because from where I'm sitting, it *is* consistent already. Consistent with C/C++ behaviour. ReganI think it would be nice to be able to do both. Given that we can write:Yes. But in any case compiler must be consistent in these two places.Andrew. "Regan Heath" <regan netwin.co.nz> wrote in message news:opsne181pg23k2f5 nrage.netwin.co.nz...On Wed, 9 Mar 2005 23:40:04 -0800, Andrew Fedoniouk <news terrainformatica.com> wrote:I see what you mean. I had it confused with: real rr[4]; rr[] = 3.1415926; which also sets all elements of rr to Pi value.I mean following: static real rr[4] = 3.1415926; all four elements of rr will be initialized to Pi value.{ two:2 } should behave similar to int two[2] = 2 , I guess.I think you meant two[] = 2?but if rr is member of struct this multiple-element-inititalization-by-single-value does not work.No, instead it sets only the first element.It does work in fact as compiler is happy seeing this struct A { int one; int two[4]; } A a = { one:1, two:2 }; But it is just unexpected initialization behaviour, I guess.I actually expected it to only set the first element, but, I'm used to C which does not have a 'set all elements of an array' feature (unless you count the memset function). I think it would be nice to be able to do both. Given that we can write: A a = { one:1, two:[2,0,0,0] }; or, shorthand: A a = { one:1, two:[2] }; to set 'just the first element to 2' it would make sense for: A a = { one:1, two:2 }; to set all elements to '2'. Regan
Mar 13 2005
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Andrew Fedoniouk wrote: |>>{ two:2 } should behave similar to int two[2] = 2 , I guess. |> |>I think you meant two[] = 2? | | | I mean following: | static real rr[4] = 3.1415926; | all four elements of rr will be initialized to Pi value. | | but if rr is member of struct this | multiple-element-inititalization-by-single-value does not work. | | It does work in fact as compiler is happy seeing this | | struct A { int one; int two[4]; } | A a = { one:1, two:2 }; | | But it is just unexpected initialization behaviour, I guess. Added to DStress as http://dstress.kuehne.cn/run/struct_initialization_06.d Thomas -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (MingW32) iD8DBQFCNTVI3w+/yD4P9tIRAgwDAJ9UTX0CjGBbSRW3Lfopa13IRUhzZgCgikI/ 70S8tXpErNH4L3qSp7b6c+0= =rzQ4 -----END PGP SIGNATURE-----
Mar 13 2005