www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - initializing a static array

reply Simon =?UTF-8?B?QsO8cmdlcg==?= <simon.buerger rwth-aachen.de> writes:
I have a static array inside a struct which I would like to be 
initialized to all-zero like so

   struct Foo(size_t n)
   {
     double[n] bar = ... all zeroes ...
   }

(note that the default-initializer of double is nan, and not zero)

I tried

   double[n] bar = 0;  // does not compile
   double[n] bar = {0}; // neither does this
   double[n] bar = [0]; // compiles, but only sets the first 
element, ignoring the rest

Is there a good way to set them all to zero? The only way I can 
think of is using string-mixins to generate a string such as 
"[0,0,0,0]" with exactly n zeroes. But that seems quite an 
overkill for such a basic task. I suspect I might be missing 
something obvious here...
Oct 10
next sibling parent reply Andrea Fontana <nospam example.com> writes:
On Tuesday, 10 October 2017 at 13:36:56 UTC, Simon Bürger wrote:
 Is there a good way to set them all to zero? The only way I can 
 think of is using string-mixins to generate a string such as 
 "[0,0,0,0]" with exactly n zeroes. But that seems quite an 
 overkill for such a basic task. I suspect I might be missing 
 something obvious here...
Maybe: double[n] bar = 0.repeat(n).array;
Oct 10
next sibling parent reply jmh530 <john.michael.hall gmail.com> writes:
On Tuesday, 10 October 2017 at 13:48:16 UTC, Andrea Fontana wrote:
 Maybe:

 double[n] bar = 0.repeat(n).array;
Alt: double[n] bar; bar[] = 0;
Oct 10
parent Andrea Fontana <nospam example.com> writes:
On Tuesday, 10 October 2017 at 13:53:37 UTC, jmh530 wrote:
 double[n] bar;
 bar[] = 0;
This works at runtime only for mutable arrays, anyway.
Oct 10
prev sibling parent reply Simon =?UTF-8?B?QsO8cmdlcg==?= <simon.buerger rwth-aachen.de> writes:
On Tuesday, 10 October 2017 at 13:48:16 UTC, Andrea Fontana wrote:
 On Tuesday, 10 October 2017 at 13:36:56 UTC, Simon Bürger wrote:
 Is there a good way to set them all to zero? The only way I 
 can think of is using string-mixins to generate a string such 
 as "[0,0,0,0]" with exactly n zeroes. But that seems quite an 
 overkill for such a basic task. I suspect I might be missing 
 something obvious here...
Maybe: double[n] bar = 0.repeat(n).array;
This works fine, thanks a lot. I would have expected `.array` to return a dynamic array. But apparently the compiler is smart enough to know the length. Even the multi-dimensional case works fine: double[n][n] bar = 0.repeat(n).array.repeat(n).array;
Oct 10
next sibling parent reply Daniel Kozak <kozzi11 gmail.com> writes:
On Tue, Oct 10, 2017 at 4:15 PM, Simon B=C3=BCrger via Digitalmars-d-learn =
<
digitalmars-d-learn puremagic.com> wrote:

 On Tuesday, 10 October 2017 at 13:48:16 UTC, Andrea Fontana wrote:

 On Tuesday, 10 October 2017 at 13:36:56 UTC, Simon B=C3=BCrger wrote:

 Is there a good way to set them all to zero? The only way I can think o=
f
 is using string-mixins to generate a string such as "[0,0,0,0]" with
 exactly n zeroes. But that seems quite an overkill for such a basic tas=
k. I
 suspect I might be missing something obvious here...
Maybe: double[n] bar =3D 0.repeat(n).array;
This works fine, thanks a lot. I would have expected `.array` to return a dynamic array. But apparently the compiler is smart enough to know the length. Even the multi-dimensional case works fine: double[n][n] bar =3D 0.repeat(n).array.repeat(n).array;
It will return dynamic array. it is same as: double[5] =3D [0,0,0,0,0]; // this is still dynamicaly allocated.
Oct 10
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Tuesday, 10 October 2017 at 14:42:15 UTC, Daniel Kozak wrote:
 It will return dynamic array. it is same as:

 double[5] = [0,0,0,0,0]; // this is still dynamicaly allocated.
Not true here, the compiler knows it is going into a static array and puts the result directly in there. It handles literals. The range version though will allocate since the function doesn't know where its result ends up. It will CTFE though if the variable is static.
Oct 10
next sibling parent Daniel Kozak <kozzi11 gmail.com> writes:
Yeah, you are right. My fault.

On Tue, Oct 10, 2017 at 4:47 PM, Adam D. Ruppe via Digitalmars-d-learn <
digitalmars-d-learn puremagic.com> wrote:

 On Tuesday, 10 October 2017 at 14:42:15 UTC, Daniel Kozak wrote:

 It will return dynamic array. it is same as:

 double[5] = [0,0,0,0,0]; // this is still dynamicaly allocated.
Not true here, the compiler knows it is going into a static array and puts the result directly in there. It handles literals. The range version though will allocate since the function doesn't know where its result ends up. It will CTFE though if the variable is static.
Oct 10
prev sibling parent Daniel Kozak <kozzi11 gmail.com> writes:
https://run.dlang.io/is/SC3Fks
Oct 10
prev sibling parent reply kinke <noone nowhere.com> writes:
On Tuesday, 10 October 2017 at 14:15:07 UTC, Simon Bürger wrote:
 On Tuesday, 10 October 2017 at 13:48:16 UTC, Andrea Fontana 
 wrote:
 Maybe:

 double[n] bar = 0.repeat(n).array;
This works fine, thanks a lot. I would have expected `.array` to return a dynamic array. But apparently the compiler is smart enough to know the length. Even the multi-dimensional case works fine: double[n][n] bar = 0.repeat(n).array.repeat(n).array;
I hope this is not performance-critical code. The assembly is terrible for such code, at least for LDC, doing a GC allocation, unrolled reset to zero, then memcpying the dynamic array back to the stack: https://godbolt.org/g/uXBN75 `double[n] bar = void; bar[] = 0;` (2 lines, granted) results in a memset.
Oct 10
parent kinke <noone nowhere.com> writes:
On Tuesday, 10 October 2017 at 22:00:27 UTC, kinke wrote:
 [...]
Ah sorry, overlooked that it's the initializer for a struct field.
Oct 10
prev sibling next sibling parent reply Daniel Kozak <kozzi11 gmail.com> writes:
struct Double
{
    double v =3D 0;
    alias v this;
}

struct Foo(size_t n)
{
    Double[n] bar;
}

Dne 10. 10. 2017 3:40 odpoledne napsal u=C5=BEivatel "Simon B=C3=BCrger via
Digitalmars-d-learn" <digitalmars-d-learn puremagic.com>:

I have a static array inside a struct which I would like to be initialized
to all-zero like so

  struct Foo(size_t n)
  {
    double[n] bar =3D ... all zeroes ...
  }

(note that the default-initializer of double is nan, and not zero)

I tried

  double[n] bar =3D 0;  // does not compile
  double[n] bar =3D {0}; // neither does this
  double[n] bar =3D [0]; // compiles, but only sets the first element,
ignoring the rest

Is there a good way to set them all to zero? The only way I can think of is
using string-mixins to generate a string such as "[0,0,0,0]" with exactly n
zeroes. But that seems quite an overkill for such a basic task. I suspect I
might be missing something obvious here...
Oct 10
parent Simon =?UTF-8?B?QsO8cmdlcg==?= <simon.buerger rwth-aachen.de> writes:
On Tuesday, 10 October 2017 at 13:54:16 UTC, Daniel Kozak wrote:
 struct Double
 {
     double v = 0;
     alias v this;
 }

 struct Foo(size_t n)
 {
     Double[n] bar;
 }
Interesting approach. But this might introduce problems later. For example `Double` is implicitly convertible to `double`, but `Double[]` is not implicitly convertible to `double[]`. Therefore I will stick with jmh530's solution for now, but thank you anyway.
Oct 10
prev sibling parent ag0aep6g <anonymous example.com> writes:
On 10/10/2017 03:36 PM, Simon Bürger wrote:
 I have a static array inside a struct which I would like to be 
 initialized to all-zero like so
 
    struct Foo(size_t n)
    {
      double[n] bar = ... all zeroes ...
    }
 
 (note that the default-initializer of double is nan, and not zero)
 
 I tried
 
    double[n] bar = 0;  // does not compile
Works for me: ---- struct Foo(size_t n) { double[n] bar = 0; } void main() { import std.stdio; Foo!5 foo; writeln(foo.bar); /* prints "[0, 0, 0, 0, 0]" */ } ----
Oct 10