DMD1 function template broken or did I f.u.?

2010-08-24 Thread 0ffh


Hi, all!

Try this:

--- snip ---

void remove(T)(out T[] array,T element) {
  int r=0,w=0;
  while (rarray.length) {
if (array[r]!=element)
  array[w++]=array[r];
++r;
  }
  array.length=w;
}

void test() {
  int[] array;
  int element=2;
  //
  array=[1,3,2,2,1,3,1,1,2];
  writef(direct\n);
  writef(  before : ,array,\n);
  int r=0,w=0;
  while (rarray.length) {
if (array[r]!=element)
  array[w++]=array[r];
++r;
  }
  array.length=w;
  writef(  after  : ,array,\n);
  //
  array=[1,3,2,2,1,3,1,1,2];
  writef(template\n);
  writef(  before : ,array,\n);
  remove!(int)(array,element);
  writef(  after  : ,array,\n);
}

--- snap ---

I get the following output:

direct
  before : [1,3,2,2,1,3,1,1,2]
  after  : [1,3,1,3,1,1]
template
  before : [1,3,2,2,1,3,1,1,2]
  after  : []

So, my question is: Huh?

Kind regards.





Re: DMD1 function template broken or did I f.u.?

2010-08-24 Thread Steven Schveighoffer
On Tue, 24 Aug 2010 11:18:35 -0400, 0ffh  
fr...@youknow.what.todo.internetz wrote:




Hi, all!

Try this:

--- snip ---

void remove(T)(out T[] array,T element) {
   int r=0,w=0;
   while (rarray.length) {
 if (array[r]!=element)
   array[w++]=array[r];
 ++r;
   }
   array.length=w;
}

void test() {
   int[] array;
   int element=2;
   //
   array=[1,3,2,2,1,3,1,1,2];
   writef(direct\n);
   writef(  before : ,array,\n);
   int r=0,w=0;
   while (rarray.length) {
 if (array[r]!=element)
   array[w++]=array[r];
 ++r;
   }
   array.length=w;
   writef(  after  : ,array,\n);
   //
   array=[1,3,2,2,1,3,1,1,2];
   writef(template\n);
   writef(  before : ,array,\n);
   remove!(int)(array,element);
   writef(  after  : ,array,\n);
}

--- snap ---

I get the following output:

direct
   before : [1,3,2,2,1,3,1,1,2]
   after  : [1,3,1,3,1,1]
template
   before : [1,3,2,2,1,3,1,1,2]
   after  : []

So, my question is: Huh?


s/out/ref

out means return this argument by reference, but initialize it to its  
initial value first which for arrays means, a null array.


ref means pass the argument by reference.

Also, btw, you should not need to specifically call the !int version, you  
can just do remove(array, element).


-Steve


Re: DMD1 function template broken or did I f.u.?

2010-08-24 Thread Simen kjaeraas

0ffh fr...@youknow.what.todo.internetz wrote:


So, my question is: Huh?


The answer to this should for symmetry be: Duh!
However, it is not quite that simple.



void remove(T)(out T[] array,T element) {


This is the line that gives you problems. You are expecting 'out' to
work like 'ref', which it doesn't. From [1]: out parameters are set to
the default initializer for the type of it.

Also, this newsgroup is for automated messages from D's Bugzilla. You
might want to ask this kind of questions in digitalmars.D.learn in the
future.

[1]: http://digitalmars.com/d/2.0/function.html#parameters
--
Simen