Thread overview
DMD1 function template broken or did I f.u.?
Aug 24, 2010
0ffh
Aug 24, 2010
Simen kjaeraas
August 24, 2010
Hi, all!

Try this:

---< snip >---

void remove(T)(out T[] array,T element) {
  int r=0,w=0;
  while (r<array.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 (r<array.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.



August 24, 2010
On Tue, 24 Aug 2010 11:18:35 -0400, 0ffh <frank@youknow.what.todo.internetz> wrote:

>
> Hi, all!
>
> Try this:
>
> ---< snip >---
>
> void remove(T)(out T[] array,T element) {
>    int r=0,w=0;
>    while (r<array.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 (r<array.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
August 24, 2010
0ffh <frank@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