Re: Classes and templates

2016-11-01 Thread Hefferman via Digitalmars-d

On Monday, 31 October 2016 at 22:33:11 UTC, John Colvin wrote:

On Monday, 31 October 2016 at 19:24:46 UTC, Hefferman wrote:

Hello,

I've been trying to implement a class for sorting which 
accepts arrays which "different" data types. Hard to describe, 
here's my example (filename sorting.d):


[...]


Glad to see you're getting helpful responses here, but just an 
FYI: https://forum.dlang.org/group/learn would be a more 
appropriate forum for questions like this.


Thanks to all for replying!

@J.C.: I'll keep it in mind for the next time.


Re: Classes and templates

2016-10-31 Thread John Colvin via Digitalmars-d

On Monday, 31 October 2016 at 19:24:46 UTC, Hefferman wrote:

Hello,

I've been trying to implement a class for sorting which accepts 
arrays which "different" data types. Hard to describe, here's 
my example (filename sorting.d):


[...]


Glad to see you're getting helpful responses here, but just an 
FYI: https://forum.dlang.org/group/learn would be a more 
appropriate forum for questions like this.


Re: Classes and templates

2016-10-31 Thread Kapps via Digitalmars-d

On Monday, 31 October 2016 at 20:25:18 UTC, Hefferman wrote:

for (uint k = 1; k < n; k++) {
if (a[k-1] > a[k]) {
T tmp = a[k];
a[k] = a[k+1];
a[k+1] = tmp;
sorted = false;
}
}
n--;
} while (!sorted);
}
}
[/code]

It gives a Range Violation upon executing, but I guess it's 
part of the algorithm


The value of n is array length, so k reaches (n - 1), therefore 
k+1 gives you n which is out of bounds.


Re: Classes and templates

2016-10-31 Thread Hefferman via Digitalmars-d

On Monday, 31 October 2016 at 20:20:09 UTC, Meta wrote:

[...]

You can't use an un-instantiated template as a type anyway, 
unlike Java. There the above is illegal because of `BubbleSort 
b = ...`. The symbol BubbleSort by itself is not a type; you 
have to instantiate it with template arguments to create a 
type. So you *could* do it like this:


BubbleSort!(typeof(arr)) b = new BubbleSort!(typeof(arr));

But that's too verbose. There's need need to repeat ourselves. 
You can instead use `auto` and omit the type of `b`, which will 
be inferred from the right hand side:


auto b = new BubbleSort!(typeof(arr));


Thanks! This compiled just fine...

[code]
import std.random;
import std.stdio;

void main()
{
immutable uint N = 10_000;

double[] arr = new double[](N);
for (uint k = 0; k < N; k++) arr[k] = uniform(0, N);

auto b = new BubbleSort!(typeof(arr));
b.Sort(arr);
}

public class BubbleSort(T)
{
private T[] a;
private uint n;

public void Sort(T)(T[] a) {
n = a.length;
bubblesort();
}

private void bubblesort() {
bool sorted;

do {
sorted = true;
for (uint k = 1; k < n; k++) {
if (a[k-1] > a[k]) {
T tmp = a[k];
a[k] = a[k+1];
a[k+1] = tmp;
sorted = false;
}
}
n--;
} while (!sorted);
}
}
[/code]

It gives a Range Violation upon executing, but I guess it's part 
of the algorithm


Re: Classes and templates

2016-10-31 Thread Meta via Digitalmars-d

On Monday, 31 October 2016 at 20:06:22 UTC, Hefferman wrote:

On Monday, 31 October 2016 at 19:43:57 UTC, Adam D. Ruppe wrote:

On Monday, 31 October 2016 at 19:24:46 UTC, Hefferman wrote:

Give a template type when crating it

new BubbleSort!(string)

for example


Is it possible to create this using "typeof"?
E. g. "BubbleSort b = new BubbleSort!(typeof(arr));"
Compilation fails with that line


You can't use an un-instantiated template as a type anyway, 
unlike Java. There the above is illegal because of `BubbleSort b 
= ...`. The symbol BubbleSort by itself is not a type; you have 
to instantiate it with template arguments to create a type. So 
you *could* do it like this:


BubbleSort!(typeof(arr)) b = new BubbleSort!(typeof(arr));

But that's too verbose. There's need need to repeat ourselves. 
You can instead use `auto` and omit the type of `b`, which will 
be inferred from the right hand side:


auto b = new BubbleSort!(typeof(arr));


Re: Classes and templates

2016-10-31 Thread Hefferman via Digitalmars-d

On Monday, 31 October 2016 at 19:43:57 UTC, Adam D. Ruppe wrote:

On Monday, 31 October 2016 at 19:24:46 UTC, Hefferman wrote:

Give a template type when crating it

new BubbleSort!(string)

for example


Is it possible to create this using "typeof"?
E. g. "BubbleSort b = new BubbleSort!(typeof(arr));"
Compilation fails with that line


Re: Classes and templates

2016-10-31 Thread Adam D. Ruppe via Digitalmars-d

On Monday, 31 October 2016 at 19:24:46 UTC, Hefferman wrote:
Whenever I try to compile this, it throws an error "class 
sorting.BubbleSort(T) is used as a type". How do I get a 
workaround?


Give a template type when crating it

new BubbleSort!(string)

for example