Jak można napisać funkcję która zamieni dwie wartości funkcja musi być beztypowa. Próbowałem tak:
void exchange(void* a, void* b)
{
void *t = a;
a = b;
b = t;
}
ale nie działa :/
Jak można napisać funkcję która zamieni dwie wartości funkcja musi być beztypowa. Próbowałem tak:
void exchange(void* a, void* b)
{
void *t = a;
a = b;
b = t;
}
ale nie działa :/
void change(*a, *b)
{
void temp;
temp=a;
a=b;
b=temp
}
Zmienne a i b deklarujesz w funkcji glownej a nastepnie do tej funkcji przekazujesz ich adresy
sprawdziłeś chociaż jak to działa :>
spróbuj tak
void exchange(void* a, void* b)
{
void *t = *a;
*a = *b;
*b = *t;
}
Jeżeli może być to C++ to zrób to na szablonach.
bez rzutowania rządanym typem nie można wyłuskać wskaźnika na void
niestety program piszę w C :(
moż ma ktoś źródło funkcji qsort ?
Bez przekazania dodatkowych (np. wielkosc) informacji o typie wydaje mi sie to niemozliwe.
//DOPISANE:
Jesli zdecydujesz sie jednak na przekazanie informacji o typie to masz przykladowy kod:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int zamiana(void *, void *, size_t);
void main(void)
{
int i = 10,
j = 22;
printf("Przed zamiana:\n i = %d, j = %d\n", i, j);
if ( zamiana(&i, &j, sizeof(int)) )
printf("Po zamianie:\n i = %d, j = %d\n", i, j);
else
printf("Niepowodzenie\n");
system("pause > nul");
}
int zamiana(void *wsk_1, void *wsk_2, size_t rozm)
{
void *bufor = NULL;
if ( rozm && (bufor = malloc(rozm)) )
{
memcpy(bufor, wsk_1, rozm);
memcpy(wsk_1, wsk_2, rozm);
memcpy(wsk_2, bufor, rozm);
free(bufor);
}
else
return 0;
return 1;
}
w funkcji qsort podaje się rozmiar tablicy, rozmiar elementu oraz wskaźnik do funckji porównującej a więc zamiana elementów wykonuje funkcja qort a nie funkcja zwrotna (porównująca)
Najlepiej jest napisać to w ASM (dla NASM):
[bits 32]
zamianab:
pop eax
pop ebx
xchg byte [eax],[ebx]
ret
zamianaw:
pop eax
pop ebx
xchg word [eax],[ebx]
ret
zamianad:
pop eax
pop ebx
xchg dword [eax],[ebx]
ret
Aby było dla rmode należy zmienić eax na ax, i ebx na bx, 32 na 16.
Nie wiem, od jakiego procesora jest xchg.
Można też w zależności od kompilatora użyć inline asm.
To ten sam kod dla GNU as:
zamianab:
pop %%eax
pop %%ebx
xchgb %ebx,%eax
ret
zamianaw:
pop %%eax
pop %%ebx
xchgw %eax,%ebx
ret
zamianad:
pop eax
pop ebx
xchgl %eax,%ebx
ret
(W tym mogą być błędy, zawsze stosuję NASM, i prawdopodobnie napiszę kompilator.)
Dzięki za odpowiedź wszysko działa ale mam jeszcze jeden problem: chcę odwrócić tablicę a więc piszę:
//wersja skrócona żeby nie zaśmieać forum
void odwroc(void* tab, size_t n, size_t s)
{
char *pbegin, *pend;
for(pbegin = tab, pend = (char*)tab+n*s; pbegin != pend; pbegin += s)
memcpy(pbegin, pend, s); //no i bum
}
wszysko jest dobrze dopóki nie dojdzie do memcpy wyrzuca mi acces violation :( Co może być nie tak z tyn kodem ?? [glowa]