| Thread overview | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
April 17, 2012 appending newly initialized struct to array | ||||
|---|---|---|---|---|
| ||||
Attachments:
| Just for fun I decided to complete some codejam challenges in D. At some point I wanted to add structs to an array but I got a compiler error. What am I doing wrong?
code:
struct test{
int x;
int y;
}
void main(){
test[] why;
why~={3,5};
}
error:
wait.d(7): found '}' when expecting ';' following statement
wait.d(8): found 'EOF' when expecting ';' following statement
wait.d(8): found 'EOF' when expecting '}' following compound statement
Is there any reason a why this wouldn't work?
| |||
April 17, 2012 Re: appending newly initialized struct to array | ||||
|---|---|---|---|---|
| ||||
Posted in reply to maarten van damme | On Tue, 17 Apr 2012 22:28:31 +0200, maarten van damme <maartenvd1994@gmail.com> wrote:
> Just for fun I decided to complete some codejam challenges in D. At some
> point I wanted to add structs to an array but I got a compiler error. What
> am I doing wrong?
>
> code:
> struct test{
> int x;
> int y;
> }
> void main(){
> test[] why;
> why~={3,5};
> }
>
> error:
> wait.d(7): found '}' when expecting ';' following statement
> wait.d(8): found 'EOF' when expecting ';' following statement
> wait.d(8): found 'EOF' when expecting '}' following compound statement
>
> Is there any reason a why this wouldn't work?
Sounds like a bug. C style initializers work in other cases:
struct S { int i; }
void main() {
S[] arr;
S s = { 1 };
arr ~= S(1);
// But the following barfs
//arr ~= { 1 };
//arr ~= { i:1 };
//arr[0] = { 1 };
}
| |||
April 17, 2012 Re: appending newly initialized struct to array | ||||
|---|---|---|---|---|
| ||||
Posted in reply to simendsjo | simendsjo:
> Sounds like a bug. C style initializers work in other cases:
D language is so much irregular, so many special cases that don't work :-)
Bye,
bearophile
| |||
April 18, 2012 Re: appending newly initialized struct to array | ||||
|---|---|---|---|---|
| ||||
Posted in reply to simendsjo | On Tuesday, 17 April 2012 at 21:00:55 UTC, simendsjo wrote: > On Tue, 17 Apr 2012 22:28:31 +0200, maarten van damme <maartenvd1994@gmail.com> wrote: > >> Just for fun I decided to complete some codejam challenges in D. At some >> point I wanted to add structs to an array but I got a compiler error. What >> am I doing wrong? >> >> code: >> struct test{ >> int x; >> int y; >> } >> void main(){ >> test[] why; >> why~={3,5}; >> } >> >> error: >> wait.d(7): found '}' when expecting ';' following statement >> wait.d(8): found 'EOF' when expecting ';' following statement >> wait.d(8): found 'EOF' when expecting '}' following compound statement >> >> Is there any reason a why this wouldn't work? > > Sounds like a bug. C style initializers work in other cases: > > struct S { int i; } > void main() { > S[] arr; > S s = { 1 }; > arr ~= S(1); > // But the following barfs > //arr ~= { 1 }; > //arr ~= { i:1 }; > //arr[0] = { 1 }; > } No, it is designed. {3,5} is struct initializer: http://dlang.org/declaration.html#StructInitializer And it is only allowed in initializer of variable declarations. > why~={3,5}; This is concat assign expression, so you should use test(3,5) instead of {3,5}. That is StructLiteral: http://dlang.org/struct.html#StructLiteral and it is an expression. Bye. Kenji Hara | |||
April 18, 2012 Re: appending newly initialized struct to array | ||||
|---|---|---|---|---|
| ||||
Posted in reply to simendsjo | On 04/17/2012 02:00 PM, simendsjo wrote:
> Sounds like a bug. C style initializers work in other cases:
I try not to use them. I think they have this 'feature' of leaving unspecified members uninitialized:
struct S
{
int i;
double d;
}
void main()
{
S s = { 42 }; // <-- no initializer for S.d
assert(s.i == 42);
assert(s.d == double.nan); // <-- fails (may work for you)
}
Is that a bug or a feature? I might have opened it but I don't remember now. :)
Ali
| |||
April 18, 2012 Re: appending newly initialized struct to array | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Wednesday, 18 April 2012 at 04:55:23 UTC, Ali Çehreli wrote: > On 04/17/2012 02:00 PM, simendsjo wrote: > > > Sounds like a bug. C style initializers work in other cases: > > I try not to use them. I think they have this 'feature' of leaving unspecified members uninitialized: > > struct S > { > int i; > double d; > } > > void main() > { > S s = { 42 }; // <-- no initializer for S.d > assert(s.i == 42); > assert(s.d == double.nan); // <-- fails (may work for you) You should use std.math.isNaN whether a floating point value is NaN. assert(isNaN(s.d)); // <-- success > } > > Is that a bug or a feature? I might have opened it but I don't remember now. :) > > Ali Bye. Kenji Hara | |||
April 18, 2012 Re: appending newly initialized struct to array | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Kenji Hara Attachments:
| That's a very odd design. Making it work when instantiating a new struct of that type but not inline. Anyway, test(3,5) works perfect, thank you. | |||
April 18, 2012 Re: appending newly initialized struct to array | ||||
|---|---|---|---|---|
| ||||
Posted in reply to maarten van damme | Le 18/04/2012 12:41, maarten van damme a écrit :
> That's a very odd design. Making it work when instantiating a new struct of that type but not inline. Anyway, test(3,5) works perfect, thank you.
It's not odd at all. You append a structure, not an array.
{3,5} is for array initialization, it's the same syntax as in C, C++,
Java, C#.
What if you want to append an array of structures ?
why~=[test(3,5), test(3,6)];
| |||
April 18, 2012 Re: appending newly initialized struct to array | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Kenji Hara | On 04/18/2012 12:16 AM, Kenji Hara wrote: > On Wednesday, 18 April 2012 at 04:55:23 UTC, Ali Çehreli wrote: >> assert(s.d == double.nan); // <-- fails (may work for you) > > You should use std.math.isNaN whether a floating point value is NaN. > > assert(isNaN(s.d)); // <-- success That a thousandth time I have made that mistake and still have not learned. :( Yes, .nan may not be compared with any other value, including .nan. Ali | |||
April 18, 2012 Re: appending newly initialized struct to array | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | Ali:
> That a thousandth time I have made that mistake and still have not learned. :( Yes, .nan may not be compared with any other value, including .nan.
Today I'll present an enhancement request to remove this problem from D.
Hugs,
bearophile
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply