Jump to page: 1 2
Thread overview
Shortest way to allocate an array and initialize it with a specific value.
Jun 10, 2015
Adel Mamin
Jun 10, 2015
Low Functioning
Jun 10, 2015
Michael Coulombe
Jun 10, 2015
Ali Çehreli
Jun 11, 2015
Per Nordlöw
Jun 11, 2015
Marc Schütz
Jun 11, 2015
weaselcat
Jun 11, 2015
Daniel Kozák
Jun 11, 2015
Marc Schütz
Jun 11, 2015
Daniel Kozák
June 10, 2015
ubyte[5] a = 0xAA; // Fine. Five 0xAA bytes.
auto a2 = new ubyte[5]; // Fine. Five 0 bytes.
Now, let's say, I want to allocate an array of a size, derived at run time, and initialize it to some non-zero value at the same time. What would be the shortest way of doing it?
June 10, 2015
On Wednesday, 10 June 2015 at 20:22:18 UTC, Adel Mamin wrote:
> ubyte[5] a = 0xAA; // Fine. Five 0xAA bytes.
> auto a2 = new ubyte[5]; // Fine. Five 0 bytes.
> Now, let's say, I want to allocate an array of a size, derived at run time, and initialize it to some non-zero value at the same time. What would be the shortest way of doing it?

Assign void, then assign whatever?
June 10, 2015
On Wednesday, 10 June 2015 at 20:22:18 UTC, Adel Mamin wrote:
> ubyte[5] a = 0xAA; // Fine. Five 0xAA bytes.
> auto a2 = new ubyte[5]; // Fine. Five 0 bytes.
> Now, let's say, I want to allocate an array of a size, derived at run time, and initialize it to some non-zero value at the same time. What would be the shortest way of doing it?

Probably:

auto a2 = value.repeat(size).array;
June 10, 2015
On 06/10/2015 01:22 PM, Adel Mamin wrote:
> ubyte[5] a = 0xAA; // Fine. Five 0xAA bytes.
> auto a2 = new ubyte[5]; // Fine. Five 0 bytes.
> Now, let's say, I want to allocate an array of a size, derived at run
> time, and initialize it to some non-zero value at the same time. What
> would be the shortest way of doing it?

Another option:

void main()
{
    auto a2 = new ubyte[5];
    a2[] = 0xAA;    // <-- Assign to "all elements"

    /* Alternative syntax:
     *
     *    auto a2 = new ubyte[](5);
     */
}

Ali

June 11, 2015
On Wednesday, 10 June 2015 at 22:03:52 UTC, Ali Çehreli wrote:
> Another option:
>
> void main()
> {
>     auto a2 = new ubyte[5];

But this causes an extra zero-initialization of a2.

>     a2[] = 0xAA;    // <-- Assign to "all elements"

Is

    auto a2 = value.repeat(size).array;

better in this regard?
June 11, 2015
On Wed, 10 Jun 2015 20:22:17 +0000
Adel Mamin via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
wrote:

> ubyte[5] a = 0xAA; // Fine. Five 0xAA bytes.
> auto a2 = new ubyte[5]; // Fine. Five 0 bytes.
> Now, let's say, I want to allocate an array of a size, derived at
> run time, and initialize it to some non-zero value at the same
> time. What would be the shortest way of doing it?

import std.stdio;

struct Ubyte(ubyte defval) {
    ubyte v = defval;
    alias v this;
}

void main() {
	auto a2 = new Ubyte!(0xAA)[5];
	writeln(a2);
}
June 11, 2015
On Thursday, 11 June 2015 at 07:57:47 UTC, Per Nordlöw wrote:
> On Wednesday, 10 June 2015 at 22:03:52 UTC, Ali Çehreli wrote:
>> Another option:
>>
>> void main()
>> {
>>    auto a2 = new ubyte[5];
>
> But this causes an extra zero-initialization of a2.
>
>>    a2[] = 0xAA;    // <-- Assign to "all elements"
>
> Is
>
>     auto a2 = value.repeat(size).array;
>
> better in this regard?

Yes, it uses `uninitializedArray()` if the length is known (which it is for `repeat()`):
https://github.com/D-Programming-Language/phobos/blob/master/std/array.d#L111
June 11, 2015
On Thursday, 11 June 2015 at 08:33:46 UTC, Daniel Kozák wrote:
> On Wed, 10 Jun 2015 20:22:17 +0000
> Adel Mamin via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
> wrote:
>
>> ubyte[5] a = 0xAA; // Fine. Five 0xAA bytes.
>> auto a2 = new ubyte[5]; // Fine. Five 0 bytes.
>> Now, let's say, I want to allocate an array of a size, derived at run time, and initialize it to some non-zero value at the same time. What would be the shortest way of doing it?
>
> import std.stdio;
>
> struct Ubyte(ubyte defval) {
>     ubyte v = defval;
>     alias v this;
> }
>
> void main() {
> 	auto a2 = new Ubyte!(0xAA)[5];
> 	writeln(a2);
> }

I like this one :-)
June 11, 2015
On Thu, 11 Jun 2015 11:43:25 +0000
via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote:

> On Thursday, 11 June 2015 at 08:33:46 UTC, Daniel Kozák wrote:
> > On Wed, 10 Jun 2015 20:22:17 +0000
> > Adel Mamin via Digitalmars-d-learn
> > <digitalmars-d-learn@puremagic.com>
> > wrote:
> >
> >> ubyte[5] a = 0xAA; // Fine. Five 0xAA bytes.
> >> auto a2 = new ubyte[5]; // Fine. Five 0 bytes.
> >> Now, let's say, I want to allocate an array of a size, derived
> >> at run time, and initialize it to some non-zero value at the
> >> same time. What would be the shortest way of doing it?
> >
> > import std.stdio;
> >
> > struct Ubyte(ubyte defval) {
> >     ubyte v = defval;
> >     alias v this;
> > }
> >
> > void main() {
> > 	auto a2 = new Ubyte!(0xAA)[5];
> > 	writeln(a2);
> > }
> 
> I like this one :-)

small enhancment:
struct Ubyte(ubyte defval = 0)


June 11, 2015
On Thursday, 11 June 2015 at 07:57:47 UTC, Per Nordlöw wrote:
> On Wednesday, 10 June 2015 at 22:03:52 UTC, Ali Çehreli wrote:
>> Another option:
>>
>> void main()
>> {
>>    auto a2 = new ubyte[5];
>
> But this causes an extra zero-initialization of a2.

just an fyi, gdc optimizes this away(looks like it overwrites the typeinfo,) ldc does not.
« First   ‹ Prev
1 2