Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
August 07, 2010 Default constructor for structs | ||||
---|---|---|---|---|
| ||||
Since default constructors for structs are not allowed, how do I go about making all the elements of this Matrix struct default to zero? (floats default to nan by default). struct Matrix(int M, int N) { float[M][N] elements; } Matrix(3, 3) m; assert(m[0][0] == 0); ? |
August 07, 2010 Re: Default constructor for structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to Peter Alexander | Peter Alexander:
> Since default constructors for structs are not allowed, how do I go about making all the elements of this Matrix struct default to zero? (floats default to nan by default).
This doesn't work, I don't know why:
float[M][N] elements = 0.0;
A bad looking solution:
struct Matrix(int M, int N) {
float[M][N] elements;
static Matrix opCall() {
Matrix m;
foreach (ref row; m.elements)
row[] = 0.0;
return m;
}
}
void main() {
auto m = Matrix!(3, 3)();
assert(m.elements[0][0] == 0);
}
A possible solution avoids going against the language (the default nan value for FP values isn't there for show, it's there because it improves your code):
struct Matrix(int M, int N) {
float[M][N] elements;
this(float init=0) {
foreach (ref row; elements)
row[] = init;
}
}
void main() {
auto m = Matrix!(3, 3)(0.0);
assert(m.elements[0][0] == 0);
}
This doesn't work:
struct Matrix(int M, int N) {
float[M][N] elements;
this(float init=0.0) {
foreach (ref row; elements)
row[] = init;
}
}
void main() {
auto m = Matrix!(3, 3)();
assert(m.elements[0][0] == 0);
}
Bye,
bearophile
|
August 07, 2010 Re: Default constructor for structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On 7/08/10 3:44 PM, bearophile wrote:
> Peter Alexander:
> <snip>
>
> Bye,
> bearophile
Thanks for your detailed reply.
However, I'm not particularly satisfied with any of those :(
I have already gone with the single parameter init constructor in my code until I find something better, but really, I just want the matrix to be default initialised to zeroes without having to explicitly specify it in client code.
Initialising to NaNs is highly unintuitive (especially since ints auto-initialise to 0...) and this has already caused me unnecessary grief. I understand the reasoning, and I might agree with it if it wasn't forced on you...
|
August 07, 2010 Re: Default constructor for structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to Peter Alexander Attachments: | Hi, I'm a newbie, hope the attached example works for you.
Peter Alexander wrote:
> Since default constructors for structs are not allowed, how do I go about making all the elements of this Matrix struct default to zero? (floats default to nan by default).
>
> struct Matrix(int M, int N)
> {
> float[M][N] elements;
> }
>
> Matrix(3, 3) m;
> assert(m[0][0] == 0);
>
> ?
|
August 07, 2010 Re: Default constructor for structs | ||||
---|---|---|---|---|
| ||||
Posted in reply to rouge | oops :p correction:
in template Zero
const float[M][N] ==> const T[M][N]
rouge wrote:
> Hi, I'm a newbie, hope the attached example works for you.
>
> Peter Alexander wrote:
>> Since default constructors for structs are not allowed, how do I go about making all the elements of this Matrix struct default to zero? (floats default to nan by default).
>>
>> struct Matrix(int M, int N)
>> {
>> float[M][N] elements;
>> }
>>
>> Matrix(3, 3) m;
>> assert(m[0][0] == 0);
>>
>> ?
|
Copyright © 1999-2021 by the D Language Foundation