2012-10-06 3 views
-1

2 차원 포인터 클래스 배열을 만들려고합니다. 클래스 개체 그리드가 필요합니다. 지금 말한 오류가 발생합니다 :C++ 2 차원 포인터 클래스 배열 오류 (openframeworks 사용)

testApp.cpp | 53 | error : '((testApp *) this) -> testApp :: myCell [i] '|

// this is cell.h 
class Cell 
{ 


public: 
    int x; 
}; 

.

// this is testApp.h 

class testApp : public ofBaseApp{ 
public: 

    int width; 
    int height; 
    int Grid; 
    int space; 
    float wWidth; 
    float wHeight; 
    Cell myCell; 


    void setup(); 
    void update(); 
    void draw(); 
}; 

'.' 는 이것은 testapp.cpp 이다 // // 오류가 myCell 포인터와 x 매개 변수를 adressing에 문제가 왜 이해가 안

void testApp::setup(){ 


Cell *myCell[5][5]; 
myCell[1][0]->x =2; 
myCell[2][0]->x =1; 
myCell[3][0]->x =23; 
myCell[4][0]->x =4; 
myCell[5][0]->x =7; 
myCell[0][0]->x =4; 



} 

//-------------------------------------------------------------- 
void testApp::draw(){ 

ofSetColor(255,255,0); 
for (int i = 0; i<5; i++) { 
    int q = myCell[i][0]->x;  // i get the error here. 
    ofCircle(20*q,20*q,50); 
} 
} 

곳이 있습니다.

도움을 주시면 대단히 감사하겠습니다.

+0

을 직접'myCell'에 대한'int'를 사용하여'만'INT를 노출 Cell'을 사용 x' 공개적으로 대신 할 특별한 이유가 다음과 같이 이제 배열의 내용을 설정할 수 있습니다 ? – Nobody

+1

setup의 myCell 배열이 초기화되지 않았습니다. 즉,이 배열의 포인터가 유효하지 않고 참조를 해제하면 정의되지 않은 동작이 발생합니다. – Nobody

+0

지금'int x'는 테스트입니다. 나중에 나는'myCell'의 여러 변수에 기초하여 다양한 모양을 그릴 필요가있다. – Bluefarmer

답변

1

당신이 testApp::draw()testApp::setup()에서 myCell을 참조하려고하는 것 같다,하지만 당신은 당신이 원하는 작업을 지원하지 않습니다 때문에 유형 Cell이며이 회원 testApp::myCell 액세스 할 수 있습니다.

편집 당신이 당신의 setup() 함수가 될 수있는 언급하는 충돌의

한 가지 소스. 거기에 단위화된 포인터가 사용됩니다. 당신은 당신의 코멘트에 언급 된 변화와 함께 당신은 또한에 설정에서 코드를 변경해야합니다

void testApp::setup(){ 
    //remove the next line to not shadow the member declaration 
    //Cell *myCell[5][5]; 
    //replace -> by . as you are not handling pointers anymore 
    myCell[1][0].x =2; 
    myCell[2][0].x =1; 
    myCell[3][0].x =23; 
    myCell[4][0].x =4; 
    myCell[5][0].x =7; 
    myCell[0][0].x =4; 
} 
+0

좋아, 글쎄, 나는 'Cell myCell [5] [5];를 넣을 때 오류가 지나가는 것 같다. testapp.h에 있습니다. 그런데 내가 그것을 실행할 때, 잠시 후에 멈추고 아무런 결과없이 응용 프로그램이 작동을 멈춘다. – Bluefarmer

+0

프로그램을 디버그하여 중단 된 이유와 이유를 확인해야하지만 액세스 위반으로 인한 것일 수 있습니다. – Nobody

+1

은 포인터에 메모리를 할당하지 않았을 수 있습니다 ... In Cell * myCell [5] [5]; 각 세포 * 그것에 할당 된 메모리가 있어야합니다 .. – bhuwansahni

0

귀하의 변수 myCelltestApp::setup의 범위 내에서 정의된다. 따라서 testApp::draw 범위 내에서 액세스 할 수 없습니다. 그것을 당신의 testApp 클래스의 속성으로 생각하십시오.

+0

좋아요, 저는 현재'testapp.h'의 속성으로'Cell myCell'을 가지고 있습니다. 'testapp' 클래스에서 포인터 배열을 초기화하고'testapp :: setup'에서 크기를 묘사하는 방법은 무엇입니까? – Bluefarmer

2

myCell이라는 두 개의 개체가 있습니다. 첫 번째 유형 CelltestApp의 회원입니다 :

class testApp : public ofBaseApp { 
    public: 
    // ... 
    Cell myCell; 
    // ... 
} 

myCell라는 이름의 다른 목적은 당신의 testApp::setup() 기능에서 생성 및 유형 array of 5 array of 5 pointer to Cell이다. setup() 함수 내에서

void testApp::setup() { 
    Cell *myCell[5][5]; // This hides the previous myCell 
    // ... 
} 

, 당신은 구성원 myCell을 숨기고있다. 함수가 끝나면 myCell의 배열 버전은 범위를 벗어나 더 이상 존재하지 않습니다. setup()myCell의 정의를

class testApp : public ofBaseApp { 
    public: 
    // ... 
    Cell* myCell[5][5]; 
    // ... 
} 

및 제거 : 그래서 첫 번째 것들 먼저, 당신은 구성원 myCell의 정의를 수정하려는

void testApp::setup() { 
    // ... 
} 

당신은 지금이 어느 하나의 개체 만이 myCell라는이 포인터의 2D 배열 myCell. 그러나 이제는 해결해야 할 또 다른 문제가 있습니다.이 포인터 배열이 있지만 현재 아무 데나 가리키고 있지 않습니다. 은 초기화되지 않았습니다.입니다. 인덱스 [1][0]Cell 개체가 지정되어 있지 않기 때문에 myCell[1][0]->x을 시도해 볼 수 없습니다.

Cell에 대한 공간을 동적으로 할당하려면 new을 사용하여 전체 배열을 루프하는 것이 한 가지 방법입니다. 다음과 같이이 작업을 수행 할 것입니다 :

void testApp::setup() { 
    for (int i = 0; i < 5; i++) { 
     for (int j = 0; j < 5; j++) { 
      myCell[i][j] = new Cell(); 
     } 
    } 
    // ... 
} 

그러나, 더 나은 방법이 전혀 동적 할당 (new)를 사용하지 않는 것입니다. Cell에 대한 포인터 배열이 아닌 myCellCells의 배열로 정의하면 Cell이 스택에 자동으로 할당됩니다. 당신의 testApp 인스턴스가 생성 될 때

class testApp : public ofBaseApp { 
    public: 
    // ... 
    Cell myCell[5][5]; 
    // ... 
} 

지금, 배열이 자동으로 할당됩니다 이것은에 멤버 정의를 변경 포함한다.

void testApp::setup() { 
    myCell[1][0].x = 2; 
    myCell[2][0].x = 1; 
    // ... 
} 
+0

이 철저한 설명에 감사드립니다. 나는 포인터 배열 대신에 셀의 배열을 고수 할 것이다. 감사 – Bluefarmer