2016-06-15 5 views
0

두 벡터의 내적을 수행 한 다음 결과를 표시해야합니다. 내가 배운 것을 보면, C++로 할 수있는 최선의 결과는 결과 벡터 (포인터)의 주소를 반환한다는 것입니다.다른 함수에서 반환 된 배열 포인터 사용

// Dot product. 
double * dot(double u[3], double v[3]) { 
    double result[3]; 
    result[0] = u[0] * v[0]; 
    result[1] = u[1] * v[1]; 
    result[2] = u[2] * v[2]; 
    return result; 

그때 결과를 인쇄해야, 그래서 포인터를 받아 다른 함수가 있습니다 : 나는 현재이 코드를 사용하는 것이 일을 오전이 작동하지 않습니다

void pvec(double * ptr) { 
    cout << "[" << *(ptr + 0) <<", " << *(ptr + 1) << ", " << *(ptr + 2) << "]\n"; 
} 

합니다. 결과 값은 모두 가비지입니다.

어떻게하면됩니까? 파이썬에서 왔을 때, 나는 팔이나 다리가없는 것과 같은 기능을 통해 배열을 전달할 수없는 것 같았고 포인터 게임을 제대로 할 수 없었습니다.

void dot(double u[3], double v[3], double result[3]) 

과에 코드의 나머지 부분을 조정합니다

+2

함수'dot'는 로컬 객체에 대한 포인터를 반환합니다. 참조 해제 될 때 동작은 정의되지 않습니다. –

+2

게다가, ** 포인터 게임을하지 **. C++ 방식으로 일을하십시오. –

+1

결과를 정적'static double result [3];로 만들거나'double * result = new double [3];을 동적으로 (better) 할당하고'delete [] ptr'가 필요 없다면 해제 할 수 있습니다. 라이브 데모는 https://ideone.com/FU8L0I를 참조하십시오. – kwarnke

답변

1

가장 간단한 방법은, 내 의견으로는 다음이 될하기 위해 dot 프로토 타입을 변경하는 것입니다.

+2

아니요. 가장 간단한 방법은'std :: vector'와 같은 적절한 컨테이너 유형을 사용하는 것입니다. –

+0

@NickyC 나는 다른 것을 구걸한다. 컨테이너는 많은 오버 헤드와 복잡성을 추가합니다. 특히 신규 이민자들에게. – GMichael

+1

표준 라이브러리 컨테이너는 제로 오버 헤드 원칙을 준수합니다. 컨테이너를 일반 오브젝트, 특히 esp로 취급하는 것은 쉽습니다. 파이썬 배경. 배열에서 포인터로의 감쇠, 함수 인수에서의 배열에서 포인터로의 조정, 객체/배열 수명 및 매달린 포인터, 배열 크기 추적 등과 같은 복잡한 문제가 포함되어있을 때 학습이 훨씬 더 어려워졌습니다. –