Avatar billede tax Nybegynder
20. november 2003 - 13:05 Der er 16 kommentarer og
1 løsning

Swap pointere af enhver type

Jeg arbejder på arrays af pointere af flere forskellige typer.

Jeg ønsker at swappe pointere ofte og vil derfor lave en define til det.

#define SWAP(a,b) {float * tmp=a;a=b;b=tmp;}

Dette virker, men jeg har ikke lyst til at definere denne for alle mine variabeltyper. int, float, unsigned int, char etc...

Er der en måde hvor jeg kan lave den som en slags template?
Avatar billede narrr Nybegynder
20. november 2003 - 13:09 #1
Hvad med den std::swap der allerede findes?
Avatar billede arne_v Ekspert
20. november 2003 - 13:09 #2
Er det ikke det som C++ template er der for ?
Avatar billede arne_v Ekspert
20. november 2003 - 13:11 #3
Men eller vil jeg da tro at void* er en hurtig genvej !
Avatar billede tax Nybegynder
20. november 2003 - 13:12 #4
Thanx
Avatar billede tax Nybegynder
20. november 2003 - 13:13 #5
arne_v hvordan ville du lige gøre det med void?

jeg skal jo lave en midlertidig variabel, for at lagre a.
Avatar billede arne_v Ekspert
20. november 2003 - 13:23 #6
void *tmp
Avatar billede olennert Nybegynder
20. november 2003 - 15:59 #7
std::swap kan vist ikke bruges i denne sammenhæng; den ville swap'e de som argumenterne pegede på, ikke argumenterne selv, idet den er noget i stil med

template <class T> inline void swap(T& a, T& b) {
  T tmp(a);
  a = b;
  b = tmp;
}
(pakket passende ind i namespace std). Du kan så lave din egen udgave:

template <class T> inline void swap(T*& a, T*& b) {
  T* tmp(a);
  a = b;
  b = tmp;
}

Fordelen ved dette (i forhold til void*) er at der laves statisk typecheck at a og b faktisk *har* samme type.
Avatar billede narrr Nybegynder
20. november 2003 - 17:00 #8
std::swap swapper skam adresserne:
---
int val1 = 1111;
    int val2 = 0000;
    int* p1 = &val1;
    int* p2 = &val2;

    cout << "Adresser før swap: " << p1 << " og " << p2<<endl;
    swap(p1,p2);
    cout << "Adresser efter swap: " << p1 << " og " << p2<<endl;
---
OUTPUT:
Adresser f°r swap: 0012FED4 og 0012FEC8
Adresser efter swap: 0012FEC8 og 0012FED4
Avatar billede olennert Nybegynder
20. november 2003 - 17:05 #9
Interessant. Mon ikke oversætteren laves en implicit cast til long eller noget i den stil?
Avatar billede narrr Nybegynder
20. november 2003 - 17:42 #10
Grunden til at swap bytter om på pointerne og ikke det de peger på, er vel at jeg giver swap to pointere som argumenter. swap(T& t1, T& t2) bliver så til en reference til en pointer...
Avatar billede olennert Nybegynder
20. november 2003 - 17:44 #11
Ja, selvfølgelig. Tak.
Avatar billede arne_v Ekspert
30. november 2003 - 22:58 #12
tax>

Tid at lukke spørgsmålet ?
Avatar billede arne_v Ekspert
30. november 2003 - 22:59 #13
Et svar hvis mine kommentarer har bidraget med noget ?
Avatar billede tax Nybegynder
30. november 2003 - 23:08 #14
jeg endte med at bruge std::swap(), så jeg ville helst give olennert points
Avatar billede arne_v Ekspert
30. november 2003 - 23:11 #15
Hvis du brugte std::swap var det så ikke snarere narr der skulle have point ?

Men bed hvem det nu skal være om at ligge et svar.
Avatar billede tax Nybegynder
01. december 2003 - 07:57 #16
Tjooo.. Det ser vist sådan ud....


narrr kom med et svar!
Avatar billede narrr Nybegynder
01. december 2003 - 16:39 #17
Svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis