hei,
kuinka toteutan C:llä funktion joka vaihtaa kaksi parametrina annettua muuttujaa keskenään? Voivat olla mitä tahansa tyyppiä, mutta ovat siis kuitenkin samaa tyyppiä keskenään. Tyyppi annetaan parametrina myös.
Tavallinen vaihto kyllä onnistuu (eli jos tiedetään etukäteen että on vaikkapa kaks intii), mutta toi tyyppi aiheuttaa nyt ongelmia.
Vinkkejä, ideoita?
kuinka toteutan C:llä funktion joka vaihtaa kaksi parametrina annettua muuttujaa keskenään? Voivat olla mitä tahansa tyyppiä, mutta ovat siis kuitenkin samaa tyyppiä keskenään. Tyyppi annetaan parametrina myös.
Tavallinen vaihto kyllä onnistuu (eli jos tiedetään etukäteen että on vaikkapa kaks intii), mutta toi tyyppi aiheuttaa nyt ongelmia.
Vinkkejä, ideoita?
Vastaukset 4
Vanhimmat
C:llä en tuota osaa tehdä mutta C :lla kyllä:
#include
template void swap(t &eka, t &toka){
t temp;
temp=eka;
eka=toka;
toka=temp;
}
int main(){
int a=1;
int b=2;
std::cout
tosin argumenttina ei anneta tyyppiä vaan sen koko
void swap (void *eka,void *toka, int size)
{
char *temp = malloc(size);
memcpy(temp,eka,size); /* temp = eka */
memcpy(eka,toka,size); /* eka = toka */
memcpy(toka,temp,size); /* toka = temp */
free(temp);
}
käyttö
int a, b;
...
swap(&a,&b,sizeof(a)); // tai sizeof(int)
Toinen "järkevämpi" mahdollisuus olisi käyttää makroa:
#define SWAP(EKA,TOKA,TYYPPI)
{
##TYYPPI TEMP;
TEMP = EKA;
EKA = TOKA;
TOKA = TEMP;
}
käyttö:
int a, b;
...
SWAP(a,b,int);
Tuossa edellä niitä jo tulikin. Tässä vielä yksi:
#define swap(a,b) \
do_swap((char *)(a),(char *)(b),sizeof(*(a)))
void do_swap(char *a, *b; size_t s)
{
do {*a^=*b;*b^=*a;*a^=*b;} while(s-=sizeof(char));
}
Eikö kukaan huomannut virheitä? Funktion pitää olla tietenkin:
void do_swap(char *a,char *b,size_t s)
{
do {*a^=*b;*b^=*a;*a ^=*b ;} while(s-=sizeof(char));
}