2013-02-23 4 views
1

포인터 및 함수 작동 방법에 대해 약간의 질문이 있습니다. 나는 어떻게 함수가 qsort()처럼 보이는지 알고 싶지만, 요소를 교환하고 요소를 비교하기 위해서는 자체 함수를 사용해야한다.C/C++, 포인터 및 함수 관련 문제

//prototypes file: other.h 

void Sort(char* pcFirst, int nNumber, int size, void (*Swap)(void*, void*), int (*Compare)(void*, void*)); //sorts any arrays 
void SwapInt(void* p1, void* p2); // swap pointers 
int CmpInt(void* p1, void* p2); // compare poineters 

//realisation file: other.cpp 

#include "other.h" 
void Sort(char* pcFirst, int nNumber, int size, 
    void (*Swap)(void*, void*), int (*Compare)(void*, void*)) 
{ 
    int i; 
    for(i = 1; i < nNumber; i++) 
     for(int j = nNumber - 1; j >= i; j--) 
     { 
      char* pCurrent = pcFirst + j * size; 
      char* pPrevious = pcFirst + (j - 1) * size; 
      if((*Compare)(pPrevious, pCurrent) > 0)// if > 0 then Swap 
      { 
       (*Swap)(pPrevious, pCurrent); 
      } 
     } 
} 

void SwapInt(void* p1, void* p2) 
{ 
    int * ptmp1 = static_cast<int*>(p1); 
    int * ptmp2 = static_cast<int*>(p2); 
    int * ptmp = ptmp1; 
    ptmp1 = ptmp2; 
    ptmp2 = ptmp; 
} 

int CmpInt(void* p1, void* p2) 
{ 
    int nResult; 
    int * ptmp1 = static_cast<int*>(p1); 
    int * ptmp2 = static_cast<int*>(p2); 
    nResult = (*ptmp1 - *ptmp2); 
    return nResult; 
} 

//main file: lab.cpp 
#include <tchar.h> 
#include <iostream> 
#include <cstdio> 
#include <cmath> 
#include "other.h" 

int _tmain() 
{ 
int nAr[] = {33,44,55,22,11}; //array for sort 
    int nTotal = sizeof(nAr)/sizeof(int); //number of elements 
for (int i = 0; i < nTotal; i++) 
    { 
     printf("%d ",nAr[i]); // result of cycle is 33 44 55 22 11 
    } 
    Sort(reinterpret_cast<char*>(&nAr[0]), nTotal, sizeof(int), SwapInt, CmpInt); 
for (int i = 0; i < nTotal; i++) 
    { 
     printf("%d ",nAr[i]); // result of cycle is 33 44 55 22 11 too =(
    } 
} 

왜 배열이 변경되지 않습니다 : 나는

내 코드는 ... 내 함수가 데이터를 교환하지 않는 것을 알고 매우 놀랐?

디버거에서 모든 포인터가 변경되어 올바른 값을 얻을 수 있지만 main에 배열이 변경되지 않았 음을 알 수 있습니다.

+1

, 그들이 가리 키지 무엇 : 그래서 코드는 다음과 같이 될 수 있습니다. –

답변

0

당신은 이들과 같은 다양한 조합에 보일 수는 ..... 귀하의 코드는 포인터를 교환한다

#include<iostream> 
#include<stdio.h> 
#include<malloc.h> 
//Call by Address 
    void SwapIntAddr(int* ptmp1, int* ptmp2) 
    { 
     int ptmp; 
     ptmp = *ptmp1; 
     *ptmp1 = *ptmp2; 
     *ptmp2 = ptmp; 
    } 

//Call by Reference 

    void SwapIntRef(int& ptmp1, int& ptmp2) 
    { 
     int ptmp; 
     ptmp = ptmp1; 
     ptmp1 = ptmp2; 
     ptmp2 = ptmp; 
    } 
//Call by Reference but in pointer level 
    void SwapPtrRef(int*& ptmp1, int*& ptmp2) 
    { 
     int* ptmp; 
     ptmp = ptmp1; 
     ptmp1 = ptmp2; 
     ptmp2 = ptmp; 
    } 

//Call by Address but in Pointer level. 

    void SwapPtrAddr(int** ptmp1,int** ptmp2) 
    { 
     int** ptmp = (int**) malloc(sizeof(int*)); 
     *ptmp = *ptmp1; 
     *ptmp1 = *ptmp2; 
     *ptmp2 = *ptmp; 
    } 


int main(){ 
    int a = 3, b= 5; 
    int* p1 = &a; 
    int* p2 = &b; 

    SwapIntAddr(p1,p2); 
    printf("%d %d\n",*p1,*p2); 

    SwapIntRef(*p1,*p2); 
    printf("%d %d\n",*p1,*p2); 

    SwapPtrRef(p1,p2); 
    printf("%d %d\n",*p1,*p2); 

    SwapPtrAddr(&p1,&p2); 
    printf("%d %d\n",*p1,*p2); 

    return 0; 
} 
+0

이 컴파일하려고했습니다 –

+0

무효를 제쳐 놓고 컴파일하지 않을 것입니다. 함수 이름을 살펴보면 정수가 아닌 포인터를 바꾸려는 의도가 명확해야합니다. – Slava

+0

예 코드를 변경하고 컴파일하고 작동했습니다. –

0

SwapInt 함수가 int이 아닌 일부 포인터를 바꿉니다. 모든 포인터는 SwapInt에 국지적이므로 실제 효과가 없습니다. 아마도 과 *ptmp2으로 무엇인가를 할 생각이었을 것입니다.

3

포인터는 객체

int * ptmp = ptmp1; 
ptmp1 = ptmp2; 
ptmp2 = ptmp; 

함수에 로컬로 몇 가지 포인터 값을 변경하는 코드를 가리 키, 그리고 그게 다야. 두 객체의 값을 교환 참조로 전달할하기 위해

는 :

void swap_values_of(int& a, int& b) 
{ 
    int const original_a = a; 
    a = b; 
    b = original_a; 
} 

당신은 또한 덜 안전하게 포인터 인수, 다음의 값을 교환 할 돌보는 대신에 지적 할 수있다 포인터 그 자체. 현재 마이크로 소프트 별을 변경하면

하지만, 학습의 목적을 제외하고 ... 대신


가 요청하지 std::swap를 사용하지만,

int _tmain() 

단지 표준

int main() 

다음 코드는 (예 : 리눅스.

그냥 팁

+0

대단히 감사합니다! – sesega

+0

해결되었습니다.방금 사용 : \t int tmp = * ptmp1; \t * ptmp1 = * ptmp2; \t * ptmp2 = tmp; – sesega

0

실제로하고있는 것은 포인터를 바꿔 쓰는 것입니다. 당신이하려고하는 것은 그 포인터가 가리키고있는 값을 교환하는 것입니다. 적어도 그것은 프로그램 논리에서 나온 것입니다.

void SwapInt(void* p1, void* p2) 
{ 
    int * ptmp1 = static_cast<int*>(p1); 
    int * ptmp2 = static_cast<int*>(p2); 
    int ptmp = *ptmp1; 
    *ptmp1 = *ptmp2; 
    *ptmp2 = ptmp; 
} 
+0

고맙습니다 =) 그것을 사용하고 작동합니다! – sesega