[疑难] Help!

Colorful 2007-09-18
示例代码如下:
public class AClass
{
    public int I;
}
void main()
{
    /+
    foreach(AClass a; arrayA)
    {
        printf("%d\n", a.I);
    }
    +/
    for(int i=0; i<arrayA.length; i++)
    {
        printf("%d\n", arrayA[i].I);
    }
}

偶的开发环境是 DMD 2.004 + Phobos(Windows版)。
上面的代码运行结果是 Error: Access Violation.
偶费了老大劲也没看出是哪里的问题导致非法内存访问。
郁闷~
Colorful 2007-09-18
继续报告错误。
void main()
{
    AClass[] arrayA = new AClass[10];
    arrayA[0].I = 2;
    arrayA[1].I = 6;
    arrayA[2].I = 3;
    arrayA[3].I = 9;
    arrayA[4].I = 10;
    arrayA[5].I = 8;
    arrayA[6].I = 7;
    arrayA[7].I = 1;
    arrayA[8].I = 5;
    arrayA[9].I = 4;

    InsertionSort!(AClass)(arrayA);

    for(int i=0; i<arrayA.length; i++)
    {
        printf("%d\n", arrayA[i].I);
    }
}

public void InsertionSort(T : IComparable!(T))(T[] array)
{
    for(int i = 1; i < array.length; i++)
    {
        T temp = array[i];
        int j = i;
        for(; j > 0 && temp.CompareTo(array[j-1]) < 0; j--)
        {
            array[j] = array[j-1];
        }
        array[j] = temp;
    }
}
public interface IComparable(T)
{
    int CompareTo(T other);
}
public class AClass : IComparable!(AClass)
{
    public int I;
    public int CompareTo(AClass other)
    {
        if(other is null) return 1;
        if(this.I < other.I) return -1;
        if(this.I > other.I) return 1;
        if(this.I == other.I) return 0;
    }
}

上面的代码不能通过编译!
说是模板实例跟模板的声明不能相匹配。
qiezi 2007-09-18
void InsertionSort(T : IComparable!(T))(T[] array) 

D并没有支持这种特化方式,它的模板类型推导还没有这么强,改成这样就行了:

void InsertionSort(T)(T[] array) 
qiezi 2007-09-18
Colorful 写道
示例代码如下:
public class AClass
{
    public int I;
}
void main()
{
    /+
    foreach(AClass a; arrayA)
    {
        printf("%d\n", a.I);
    }
    +/
    for(int i=0; i<arrayA.length; i++)
    {
        printf("%d\n", arrayA[i].I);
    }
}

偶的开发环境是 DMD 2.004 + Phobos(Windows版)。
上面的代码运行结果是 Error: Access Violation.
偶费了老大劲也没看出是哪里的问题导致非法内存访问。
郁闷~


你只是分配了一个数组,并没有把数组里的内容初始化,改成这样:

     AClass[] arrayA = new AClass[10];
    foreach(ref e; arrayA)
        e = new AClass;
     arrayA[0].I = 2;
     arrayA[1].I = 6;
//...
Colorful 2007-09-18
那么如何保证T是继承自IComparable(T)接口呢?
Colorful 2007-09-18
晕,偶的第一段代码贴错了。
Colorful 2007-09-18
晕了,下面的代码是错误的。

咋编辑功能不好用呢?
Colorful 2007-09-18
偶那个郁闷!
void InsertionSort(T: IComparable!(T))(T[] array)
{
    //...
}
这个不能推导,但是is表达式可以推导。
把上面的代码改成
void InsertionSort(T)(T[] array)
{
    static if( is ( T : IComparable!(T) ) )
    {
        //...
    }
    else
    {
        static assert(false, "Argument must be derived from interface IComparable(T).");
    }
}

也算是曲线救国吧。
redsea 2007-09-19
那你为什么不直接一个 static assert(is ( T : IComparable!(T) ) )     ?


Colorful 写道
偶那个郁闷!
void InsertionSort(T: IComparable!(T))(T[] array)
{
    //...
}
这个不能推导,但是is表达式可以推导。
把上面的代码改成
void InsertionSort(T)(T[] array)
{
    static if( is ( T : IComparable!(T) ) )
    {
        //...
    }
    else
    {
        static assert(false, "Argument must be derived from interface IComparable(T).");
    }
}

也算是曲线救国吧。
Global site tag (gtag.js) - Google Analytics