2011-03-03 64 views
1

任何人都可以帮助我将这段代码从C++重写为C ...(它有模板... yeeee :)) 谢谢。重写C++模板C

template <class T> 
void SWAP(T& t1, T& t2) 
    { 
    T tmp=t1; 
    t1=t2; 
    t2=tmp; 
    } 

而这一次

template <class CMP, class Element> 
void sh_qsort(Element* array, uint lo, uint hi) 
    { 
    some code... 
    } 

和sh_qsort被称为像sh_qsort<TEST>(test_file, 0, 255) 其中TEST

struct TEST { 

static int c(uint* A, int x, int y) 
{ 
    uint px = A[x]; 
    uint py = A[y]; 
    int r,s; 
    s = (px<py) ? SWAP(px,py),0x80000000 : 0; 
    byte* p = &f_buf[px]; 
    byte* th = &f_buf[blocksize]; 
    byte* q = &f_buf[py]; 
    for(; (r=1,p<th) && ((r=(*p)-(*q))==0); p++,q++); 
    return r^s; 
} 

static void s(uint* A, int x, int y) 
    { 
    SWAP(A[x], A[y]); 
    } 
}; 

以及如何重写这个结构在C。

简单而整洁...帮助:)

谢谢!

+4

有一个更类似C的实现最简单的方法是使用'#define swap(x,y)'并告诉它该怎么做。我在宏观魔法方面并不重要,但如果您可以搜索宏功能和/或发布迄今为止尝试的内容,那么人们会更倾向于帮助您。这闻起来像功课。 – rubenvb 2011-03-03 10:23:11

+6

你是否意识到C中没有这些特性的直接等价物?你不能简单地重写,你需要大幅改变函数的接口;并根据您的需求,解决方案将有很大的不同。 – 2011-03-03 10:23:23

+1

该代码是可怕的。你可以从代码可读性开始,通过在代码中加入适当的缩进和空格,并让每条语句独立出来。然后制作直观,有意义的变量名称而不是单字母混淆。最后将复杂表达式分解成几个不太复杂的表达式。一旦完成,代码就可以用C重写了。 – Lundin 2011-03-03 11:05:05

回答

1

假设sh_qsort()实际上是快速排序的实现,所有你需要做的就是重构TEST::c()成从stdlib.h预计qsort()比较函数。

从编译时通用代码通过模板转到运行时通用代码通过void *通常会带来性能损失,您可以通过使用所谓的“X-macros”来使用预处理器模拟模板,从而摆脱这种性能损失。但是,可能没有必要打扰:因为TEST::c()足够复杂,所以它可能不会被内联,并且您只需支付使用由qsort()执行的运行时通用交换。

+0

好吧,'sh_sort'听起来更像是shell排序,你不觉得吗? – 2011-03-03 13:25:19

+0

@Konrad:请重新阅读功能的名称 - 您错过了一封信... – Christoph 2011-03-03 14:31:10