C++ 用于移植到C+;的文本字符串的3向基数快速排序+;来自Java

C++ 用于移植到C+;的文本字符串的3向基数快速排序+;来自Java,c++,c,excel,bstr,safearray,C++,C,Excel,Bstr,Safearray,我已经移植到C++(我猜大部分是C)这个java 3路基快排序实现():< /p> 然而,这些元素被搅乱了。调用DLL后,数组如下所示: a(0) = Arborside a(1) = Capine a(2) = Dalltal a(3) = Irvi a(4) = Konaerry a(5) = Mayberhaven a(6) = Rivelwater a(7) = Roanas a(8) = Stiloke a(9) = Wintr 看起来每个元素的左四个字符都已排序,但其余字符仍然未排

我已经移植到C++(我猜大部分是C)这个java 3路<强>基<强>快排序实现():< /p> 然而,这些元素被搅乱了。调用DLL后,数组如下所示:

a(0) = Arborside
a(1) = Capine
a(2) = Dalltal
a(3) = Irvi
a(4) = Konaerry
a(5) = Mayberhaven
a(6) = Rivelwater
a(7) = Roanas
a(8) = Stiloke
a(9) = Wintr
看起来每个元素的左四个字符都已排序,但其余字符仍然未排序


您能帮我修复端口使其正常工作吗?

exch功能的实现在哪里?您的
无效交换点(长**a,长**b){
交换
,长度为4字节(或四个字符)@VladFeinstein:这可能就是问题所在。你能推荐一种方法来交换指向BSTR元素的指针,这样每个元素都可以整体交换吗?为了速度起见,我想交换指针。那些宽字符是吗?如果是,那么所有对
LPSTR
的转换都是不正确的。事实上,请删除所有这些字符这些类型转换。一旦这样做,请读取编译器生成的错误。除非您知道自己在做什么,否则不要尝试使用C样式转换来掩盖这些错误。如果字符是2字节字符,请再次删除这些类型转换并修复编译器错误。对
LPSTR
进行类型转换不会将多字节字符串转换为单字节字符串,可能是排序失败的原因。最简单的方法是在不同语言之间使用相同的字符类型,而不是不同的类型。
exch
函数的实现在哪里?您的
无效交换点(long**a,long**b){
交换
long
,长度为4字节(或四个字符)@VladFeinstein:这可能就是问题所在。你能推荐一种方法来交换指向BSTR元素的指针,这样每个元素都可以整体交换吗?为了速度起见,我想交换指针。那些宽字符是吗?如果是,那么所有对
LPSTR
的转换都是不正确的。事实上,请删除所有这些字符这些类型转换。一旦这样做,请读取编译器生成的错误。除非您知道自己在做什么,否则不要尝试使用C样式转换来掩盖这些错误。如果字符是2字节字符,请再次删除这些类型转换并修复编译器错误。对
LPSTR
进行类型转换不会将多字节字符串转换为单字节字符串,可能是排序失败的原因。最简单的方法是在不同语言之间使用相同的字符类型,而不是不同的类型。
void swapPointers(long **a, long **b) {
    long *t = *a;
    *a = *b;
    *b = t;
}

long int __stdcall  QuicksortX(LPSAFEARRAY FAR *psaBSTRs, long lo, long hi, long d = 0) 
{

    if (hi - lo <= 0) return 1;
    long i = lo-1, j = hi;
    long p = lo-1, q = hi;
    
    if ((*psaBSTRs)->cDims > 0) {
        long lb = (*psaBSTRs)->rgsabound[0].lLbound;
        long ub = lb + (*psaBSTRs)->rgsabound[0].cElements - 1;
        if (lo < lb || lo > ub || lo > hi) {return -2;}
        if (hi < lb || hi > ub || hi < lo) {return -3;}
    } else { 
        return -1;
    }

    BSTR *a = (BSTR*)(*psaBSTRs)->pvData;   
    short v = LPSTR(a[hi])[d];

    while (i < j)
    {
        while (LPSTR(a[++i])[d] < v) if (i == hi) break;
        while (v < LPSTR(a[--j])[d]) if (j == lo) break;
        if (i > j) break;
        swapPointers((long**)a[i], (long**)a[j]); 
        if (LPSTR(a[i])[d] == v) swapPointers((long**)a[++p], (long**)a[i]);
        if (LPSTR(a[j])[d] == v) swapPointers((long**)a[j], (long**)a[--q]);
    }

    if (p == q) {
        if (v != 0) QuicksortX(psaBSTRs, lo, hi, d+1);
        return 0;
    }

    if (LPSTR(a[i])[d] < v) i++;
    for (int k = lo; k <= p; k++) swapPointers((long**)a[k], (long**)a[j--]);
    for (int k = hi; k >= q; k--) swapPointers((long**)a[k], (long**)a[i++]);

    QuicksortX(psaBSTRs, lo, j, d);
    if ((i == hi) && (LPSTR(a[i])[d] == v)) i++;
    if (v != 0) QuicksortX(psaBSTRs, j+1, i-1, d+1);
    QuicksortX(psaBSTRs, i, hi, d);

}
Public Declare Function QuicksortX Lib "StringArraySort" (StringArray$(), Optional ByVal Lo&, Optional ByVal Hi&, Optional ByVal d& = 0) As Long

Sub Test_1()

    Dim ret&, a() As String
    
    ReDim a(0 To 9)
    
    a(0) = "Riverside"
    a(1) = "Irvine"
    a(2) = "Capital"
    a(3) = "Kona"
    a(4) = "Mayberry"
    a(5) = "Winterhaven"
    a(6) = "Stillwater"
    a(7) = "Dallas"
    a(8) = "Roanoke"
    a(9) = "Arbor"
    
    ret = QuicksortX(a, LBound(a), UBound(a))
    
    Stop

End Sub
a(0) = Arborside
a(1) = Capine
a(2) = Dalltal
a(3) = Irvi
a(4) = Konaerry
a(5) = Mayberhaven
a(6) = Rivelwater
a(7) = Roanas
a(8) = Stiloke
a(9) = Wintr