Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
October 31, 2016 Classes and templates | ||||
---|---|---|---|---|
| ||||
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): [code] import std.random; void main() { immutable uint N = 10_000; double[] arr = new double[](N); for (uint k = 0; k < N; k++) arr[k] = uniform(0, N); BubbleSort b = new BubbleSort(); b.Sort(arr); } public class BubbleSort(T) { private T[] a; private uint n; public void Sort(T)(T[] a) { this.a = a; n = a.length; bubblesort(); } private void bubblesort() { bool sorted; do { sorted = true; for (uint k = 0; k < n; k++) { if (a[k] > a[k+1]) { T tmp = a[k]; a[k] = a[k+1]; a[k+1] = tmp; sorted = false; } } n--; } while (!sorted); } } [/code] 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? |
October 31, 2016 Re: Classes and templates | ||||
---|---|---|---|---|
| ||||
Posted in reply to Hefferman | 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
|
October 31, 2016 Re: Classes and templates | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | 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....
|
October 31, 2016 Re: Classes and templates | ||||
---|---|---|---|---|
| ||||
Posted in reply to Hefferman | 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));
|
October 31, 2016 Re: Classes and templates | ||||
---|---|---|---|---|
| ||||
Posted in reply to Meta | 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....
|
October 31, 2016 Re: Classes and templates | ||||
---|---|---|---|---|
| ||||
Posted in reply to Hefferman | 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.
|
October 31, 2016 Re: Classes and templates | ||||
---|---|---|---|---|
| ||||
Posted in reply to Hefferman | 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. |
November 01, 2016 Re: Classes and templates | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | 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.
|
Copyright © 1999-2021 by the D Language Foundation