2011-09-14 2 views
4

저는 매트릭스 프로그램을 작성 중이며 현재 점과 행렬을 곱하려고합니다. 나는 내 개체 이상 오류 (결과 및 P)이 함수에서 "표현이 오브젝트 유형의 포인터가 있어야합니다"를 점점 계속 : 표현식에는 객체 유형에 대한 포인터가 있어야합니다.

//Point Class functions 
Point Matrix44::operator*(const Point & P){ 
    Point result; 
    for (int i = 0; i < 4; i++) { 
     for (int k = 0; k < 4; k++) { 
      result.element[i][k] = 0; 
      for (int j = 0; j < 4; j++) { 
       result.element[i][k] = element[i][j] * P.element[j][k] + result.element[i][k]; 
      } 
     } 
    } 
    return result; 

} 

내 두 클래스

은 다음과 같습니다

당신의 Point 클래스에서
//Matrix class 
class Point; 

class Matrix44 { 
private: 
    double element[4][4]; 
public: 
    Matrix44(void); 
    Matrix44 transpose(void) const; 
    friend istream& operator>>(istream& s, Matrix44& t); 
    friend ostream& operator<<(ostream& s, const Matrix44& t); 
    Matrix44 operator *(Matrix44 b); 
    Point operator*(const Point & P); 
}; 


//Point class 
class Point { 
    double element[4]; 
    friend class Matrix44; 
public: 
    Point(void) { 
     element[0] = element[1] = element[2] = 0; 
     element[3] = 1; 
    } 
    Point(double x, double y, double z){ 
     element [0]=x; 
     element [1]=y; 
     element [2]=z; 
     element [3]=1; 
    } 

}; 

답변

12

,

double element[4]; 

이 1 차원 배열입니다 : 당신은 같은 element 멤버 정의합니다. 그러나 함수에, 당신은이 차원 배열 인 것처럼 액세스하려는 :

result.element[i][k] 
P.element[j][k] 

나는 당신이 당신의 행렬 곱셈이 작동하도록되어 정확히 재고 할 필요가 있다고 생각합니다.

+0

정확하게 문제를 내 기능을 통해 복사하여 하나를 수용하기 위해 그것을 변경하는 것을 잊었다했다 차원 배열 :), 감사합니다! – Nick

+0

내 두뇌가 자동 조종 장치에 있었기 때문에 나는 똑같은 일을했다.이 대답을 주셔서 감사합니다 –

2

result.element는 1 차원 배열입니다. 당신은 두 개의 인덱스를 사용하고 있습니다. 그건 컴파일되지 않습니다. matrix multiplication의 정의를 살펴 봐야합니다.

Point Matrix44::operator*(const Point & P){ 
    Point result; 
    for (int i = 0; i < 4; i++) { 
     result.element[i] = 0; 
     for (int j = 0; j < 4; j++) { 
      result.element[i] += element[i][j] * P.element[j]; 
     } 
    } 
    return result; 

} 
+0

+1 코드, 감사합니다 – Nick

1

Point::elementdouble[4]이다. 코드에는 Point result; result.element[i][k] = 0;이 있습니다. 요소가 2 차원 배열이 아니기 때문에 컴파일러는 double을 배열로 변환하여 []을 사용하려고 시도하지만 그렇게 할 수는 없습니다. 나는 이것이 복사 붙여 넣기 코드에서 추측 할 것입니다 Matrix44 Matrix44::operator*(const Matrix44& M)

항상 샘플 코드에서 문제가있는 줄을 알려주는 데 도움이됩니다.

또한이 함수는 잘못된 결과를 가지며 result.element[i][k]을 0으로 설정 한 다음 4 개의 다른 값으로 설정합니다. 내 생각에는 당신이 가장 안쪽 루프에 할당 대신에 추가 할 생각. 포인트 자체 만 한 수준의 배열이있는 경우

result.element[i][k] = element[i][j] * P.element[j][k] + result.element[i][k]; 

는 :

0

당신은 액세스하려는 당신이 구조체를 가리키는 경우

double element[4]; 
0

같은 오류가 오해 나타날 수도 있습니다 그게 아니다 소스에 액세스 할 수 있습니다. 예 :

header.h

struct m yStruct;

source1.c는

는 header.h가이

myStruct structX; 

source2.c

헤더 등을 포함한다.시간

uint8_t * ptr2Struct = &structX; 

그 경우는 다음 "라인이 arror을받을 경우 uint8_t * ptr2Struct = structX;.

관련 문제