funkcja na wzór qsort

0

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 :/

0

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

0

sprawdziłeś chociaż jak to działa :>

0

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.

0

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 ?

0

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;
}
0

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)

0

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.)

0

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]

1 użytkowników online, w tym zalogowanych: 0, gości: 1