Jump to page: 1 2
Thread overview
initializing a static array
Oct 10
jmh530
Oct 10
kinke
Oct 10
kinke
Oct 10
ag0aep6g
October 10
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...
October 10
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;
October 10
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;
October 10
struct Double
{
    double v = 0;
    alias v this;
}

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

Dne 10. 10. 2017 3:40 odpoledne napsal uživatel "Simon Bürger 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 = ... 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...


October 10
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.

October 10
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;


October 10
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.

October 10
On Tue, Oct 10, 2017 at 4:15 PM, Simon Bürger 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ü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;
>

It will return dynamic array. it is same as:

double[5] = [0,0,0,0,0]; // this is still dynamicaly allocated.


October 10
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.
October 10
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.
>


« First   ‹ Prev
1 2