I am imlementing a simple merge function and I have got stuck, as the compiler gives me errors that I cannot explain. Here is my merge function:
void merge(void *a, int beg, int middle, int end, int (*cmp)(const void*, const void*
{
std::stack<void*> first;
std::stack<void*> second;
for(int i = beg; i < middle; i++) {
first.push(a+i);
}
for(int i = middle; i < end; i++) {
second.push(a+i);
}
for(int i = beg; i < end; i++) {
if(first.empty()) {
void *tmp = second.top();
second.pop();
a+i = tmp;
} else if(second.empty()) {
void *tmp = first.top();
first.pop();
a+i = tmp;
} else if(cmp(first.top(), second.top())) {
void *tmp = first.top();
first.pop();
a+i = tmp;
} else {
void *tmp = second.top();
second.pop();
a+i = tmp;
}
}
}
And here is the error:
sort.h: In function `void merge(void*, int, int, int, int (*)(const void*, const void*))':
sort.h:9: error: pointer of type `void *' used in arithmetic
sort.h:12: error: pointer of type `void *' used in arithmetic
sort.h:19: error: pointer of type `void *' used in arithmetic
sort.h:19: error: non-lvalue in assignment
sort.h:23: error: pointer of type `void *' used in arithmetic
sort.h:23: error: non-lvalue in assignment
sort.h:27: error: pointer of type `void *' used in arithmetic
sort.h:27: error: non-lvalue in assignment
sort.h:31: error: pointer of type `void *' used in arithmetic
sort.h:31: error: non-lvalue in assignment
Can anyone help me? TIA.
Pointer arithmetic is not possible with
void*, sincevoidhas no size, and pointer arithmetic requires to compute memory addresses based on the size of the type.If you expect
beg,middleandendto represent byte offsets, you should usecharpointers instead (onecharis one byte).If you want to write a generic function, that works with any type, don’t use
voidpointers but templates: