你的第一个问题是在几个表达式中处理了太多的事情。你需要把它拆分开来。
void MapArray(void * src, void * dest, void * (f)(void *), size_t n, size_t elem)
{
unsigned int i = 0, j = 0;
void * temp = malloc(elem);
char* csrc = (char*)src;
char* cdest = (char*)dest;
char* ctemp = (char*)temp;
for(i = 0; i<n; i++)
{
csrc++;
cdest++;
ctemp++;
temp = f(csrc);
for(j = 0; j < elem; j++)
{
cdest[i] = ctemp[i];
}
}
free(temp);
}
现在是你的第二个问题。你分配了一个缓冲区,然后你把指针赋值给它?反复这样做?然后只释放最后一个 f 调用的结果吗?这是完全不必要的。
void MapArray(void * src, void * dest, void * (f)(void *), size_t n, size_t elem)
{
unsigned int i = 0, j = 0;
char* csrc = (char*)src;
char* cdest = (char*)dest;
for(i = 0; i<n; i++)
{
csrc++;
cdest++;
char* ctemp = (char*)f(csrc);
for(j = 0; j < elem; j++)
{
cdest[i] = ctemp[i];
}
}
}
现在是你的第三个问题。你传递了一个指向char类型的指针,但没有传递void*类型的指针。这意味着你的函数不能是通用的,即f不能应用于任何东西。我们需要一个void*类型的数组,这样该函数就可以接受任何类型的参数。我们还需要将类型的大小作为参数传递进来,以便我们知道要移动dest指针多远。
void MapArray(void ** src, void * dest, void * (f)(void *), size_t n, size_t sizeofT)
{
for(unsigned int i = 0; i < n; i++) {
void* temp = f(src[n]);
memcpy(dest, temp, sizeofT);
dest = (char*)dest + sizeofT;
}
}
我们仍然有另一个问题 - temp的内存。我们没有释放它。我们也没有传递用户数据参数到f中,这样它就可以返回我们不需要释放的堆分配的内存。f能够工作的唯一方式是它返回一个静态缓冲区。
void MapArray(void ** src, void * dest, void * (f)(void *, void*), void* userdata, size_t n, size_t sizeofT)
{
for(unsigned int i = 0; i < n; i++) {
void* temp = f(src[n], userdata);
memcpy(dest, temp, sizeofT);
dest = (char*)dest + sizeofT;
}
}
现在f可以对任何内容进行操作并保留所需的状态。 但我们仍未释放缓冲区。 现在,f返回一个简单的结构体,告诉我们是否需要释放缓冲区。 这还允许我们在不同的f调用中释放或不释放缓冲区。
typedef struct {
void* data;
int free;
} freturn;
void MapArray(void ** src, void * dest, freturn (f)(void *, void*), void* userdata, size_t n, size_t sizeofT)
{
for(unsigned int i = 0; i < n; i++) {
freturn thisreturn = f(src[n], userdata);
void* temp = thisreturn.data;
memcpy(dest, temp, sizeofT);
dest = (char*)dest + sizeofT;
if (thisreturn.free)
free(temp);
}
}
然而,我仍然不明白这个函数的作用。所有这些代码只是为了替换一个简单的for循环吗?你试图替换的那段代码比调用你的函数的代码更简单,可能更有效率,绝对更强大(例如可以使用continue/break)。
此外,C对于这种工作真的很糟糕。 C ++要好得多。例如,在C++中,将函数应用于数组的每个成员非常简单。