digitalmars.D.learn - Array-wise operations
- Bob Cowdery (17/17) Oct 12 2010 I'm trying to implement some array-wise operations.
- Simen kjaeraas (4/8) Oct 12 2010 You need to append [] to x_average[index].
- Bob Cowdery (4/12) Oct 12 2010 Thanks. I tried it the other way round [][0]. To put [0][] seems to me
- Simen kjaeraas (8/23) Oct 12 2010 Yeah, it's a bit the wrong way around, for those coming from C, at least...
- Bob Cowdery (6/29) Oct 12 2010 Ok, kind of understand that. Now I have another problem.
- Simen kjaeraas (12/16) Oct 12 2010 Oh, yes. Sorry, I didn't see that at first. D (for some reason) supports
- Bob Cowdery (5/21) Oct 12 2010 How confusing to support two ways of doing something which require the
- bearophile (4/6) Oct 12 2010 Yes, it's a mess. I have proposed to accept that C syntax only when the ...
- Bob Cowdery (3/35) Oct 12 2010 Got it now. The array was defined back to front as well. Should have bee...
I'm trying to implement some array-wise operations. // I have an array of float values that need to be averaged over a 10 cycle period. float x_points[600]; float x_average[600][10]; int ptr = 0; // I accumulate one cycle in x_points and add that into a circular array of the last 10 cycles x_average[ptr] = x_points; if (++ptr > 9) {ptr = 0;} // Now I want to average the last 10 cycles and put the result back into x_points x_points[] =(x_average[0]+x_average[1]+x_average[2]+x_average[3]+x_average[4]+x_average[5]+ x_average[6]+x_average[7]+x_average[8]+x_average[9])/10; The average gives me a compile error of incompatible types. bob
Oct 12 2010
Bob Cowdery <bob bobcowdery.plus.com> wrote:x_points[] =(x_average[0]+x_average[1]+x_average[2]+x_average[3]+x_average[4]+x_average[5]+ x_average[6]+x_average[7]+x_average[8]+x_average[9])/10; The average gives me a compile error of incompatible types.You need to append [] to x_average[index]. -- Simen
Oct 12 2010
On 12/10/2010 20:29, Simen kjaeraas wrote:Bob Cowdery <bob bobcowdery.plus.com> wrote:Thanks. I tried it the other way round [][0]. To put [0][] seems to me the wrong way round. Probably just not understanding the syntax properly. bobx_points[] =(x_average[0]+x_average[1]+x_average[2]+x_average[3]+x_average[4]+x_average[5]+ x_average[6]+x_average[7]+x_average[8]+x_average[9])/10; The average gives me a compile error of incompatible types.You need to append [] to x_average[index].
Oct 12 2010
Bob Cowdery <bob bobcowdery.plus.com> wrote:On 12/10/2010 20:29, Simen kjaeraas wrote:Yeah, it's a bit the wrong way around, for those coming from C, at least. The idea is that for any T[] t, t[0] should behave as if a function returning a T. So, for char[][] c, c[0] returns char[], which would then be indexed by the next brackets. If index was the function: c[0][1] => index( index( c, 0 ), 1 ); -- SimenBob Cowdery <bob bobcowdery.plus.com> wrote:Thanks. I tried it the other way round [][0]. To put [0][] seems to me the wrong way round. Probably just not understanding the syntax properly.x_points[] =(x_average[0]+x_average[1]+x_average[2]+x_average[3]+x_average[4]+x_average[5]+ x_average[6]+x_average[7]+x_average[8]+x_average[9])/10; The average gives me a compile error of incompatible types.You need to append [] to x_average[index].
Oct 12 2010
On 12/10/2010 21:11, Simen kjaeraas wrote:Bob Cowdery <bob bobcowdery.plus.com> wrote:Ok, kind of understand that. Now I have another problem. x_average[ptr] = x_points; // tells me array length don't match. When I print x_average[ptr] or x_average[][ptr] or x_average[ptr][] they all tell me the length is 10. What do I have to do to get to the row which is 600?On 12/10/2010 20:29, Simen kjaeraas wrote:Yeah, it's a bit the wrong way around, for those coming from C, at least. The idea is that for any T[] t, t[0] should behave as if a function returning a T. So, for char[][] c, c[0] returns char[], which would then be indexed by the next brackets. If index was the function: c[0][1] => index( index( c, 0 ), 1 );Bob Cowdery <bob bobcowdery.plus.com> wrote:Thanks. I tried it the other way round [][0]. To put [0][] seems to me the wrong way round. Probably just not understanding the syntax properly.x_points[] =(x_average[0]+x_average[1]+x_average[2]+x_average[3]+x_average[4]+x_average[5]+ x_average[6]+x_average[7]+x_average[8]+x_average[9])/10; The average gives me a compile error of incompatible types.You need to append [] to x_average[index].
Oct 12 2010
Bob Cowdery <bob bobcowdery.plus.com> wrote:x_average[ptr] = x_points; // tells me array length don't match. When I print x_average[ptr] or x_average[][ptr] or x_average[ptr][] they all tell me the length is 10. What do I have to do to get to the row which is 600?Oh, yes. Sorry, I didn't see that at first. D (for some reason) supports both C style definition of arrays (int a[3][];), and D style (int[][3] a;). As you can see, the order of indices are reversed. If you print typeof( x_average ), you should get float[10][600], meaning an array of 600 elements, each holding 10 floats. I believe what you want is float[600][10], which is an array of 10 arrays of 600 floats. If I'm wrong, you likely want a strided array, which D noes not currently support. -- Simen
Oct 12 2010
On 12/10/2010 21:43, Simen kjaeraas wrote:Bob Cowdery <bob bobcowdery.plus.com> wrote:How confusing to support two ways of doing something which require the indices in a different order. I now have a C style defined which works so I will change it to a D style which should also work. Thanks for the help.x_average[ptr] = x_points; // tells me array length don't match. When I print x_average[ptr] or x_average[][ptr] or x_average[ptr][] they all tell me the length is 10. What do I have to do to get to the row which is 600?Oh, yes. Sorry, I didn't see that at first. D (for some reason) supports both C style definition of arrays (int a[3][];), and D style (int[][3] a;). As you can see, the order of indices are reversed. If you print typeof( x_average ), you should get float[10][600], meaning an array of 600 elements, each holding 10 floats. I believe what you want is float[600][10], which is an array of 10 arrays of 600 floats. If I'm wrong, you likely want a strided array, which D noes not currently support.
Oct 12 2010
Bob Cowdery:How confusing to support two ways of doing something which require the indices in a different order.Yes, it's a mess. I have proposed to accept that C syntax only when the -d compiler switch is used (it also enables C-style function literals and maybe C function pointers too). Bye, bearophile
Oct 12 2010
On 12/10/2010 21:25, Bob Cowdery wrote:On 12/10/2010 21:11, Simen kjaeraas wrote:Got it now. The array was defined back to front as well. Should have been x_average[10][600] (I think, seems to work anyway).Bob Cowdery <bob bobcowdery.plus.com> wrote:Ok, kind of understand that. Now I have another problem. x_average[ptr] = x_points; // tells me array length don't match. When I print x_average[ptr] or x_average[][ptr] or x_average[ptr][] they all tell me the length is 10. What do I have to do to get to the row which is 600?On 12/10/2010 20:29, Simen kjaeraas wrote:Yeah, it's a bit the wrong way around, for those coming from C, at least. The idea is that for any T[] t, t[0] should behave as if a function returning a T. So, for char[][] c, c[0] returns char[], which would then be indexed by the next brackets. If index was the function: c[0][1] => index( index( c, 0 ), 1 );Bob Cowdery <bob bobcowdery.plus.com> wrote:Thanks. I tried it the other way round [][0]. To put [0][] seems to me the wrong way round. Probably just not understanding the syntax properly.x_points[] =(x_average[0]+x_average[1]+x_average[2]+x_average[3]+x_average[4]+x_average[5]+ x_average[6]+x_average[7]+x_average[8]+x_average[9])/10; The average gives me a compile error of incompatible types.You need to append [] to x_average[index].
Oct 12 2010