2011-10-24 6 views
2
class Register 
{ 
private: 
     DWORD ax,dx,cx,bx; // POH 
     DWORD bp,sp; 

     DWORD flag, ip; 
public: 
     //==================================================== 
     Register() 
     { 
     ax = 0x0; 
     dx = 0x0; 
     cx = 0x0; 
     bx = 0x0; 

     bp = 0x0; 
     memset(&this->sp,0,sizeof(sp)); 
     sp = 0x0; 

     flag = 0x0; 
     ip = 0x0; 
     } 
     //==================================================== 
     ~Register() 
     { 
     } 
     //==================================================== 
     void setAx(DWORD d) 
     { 
     ax=d; 
     } 
     //==================================================== 
     void setDx(DWORD d) 
     { 
     dx=d; 
     } 
     //==================================================== 
     void setCx(DWORD d) 
     { 
     cx=d; 
     } 
     //==================================================== 
     void setBx(DWORD d) 
     { 
     bx=d; 
     } 
     //==================================================== 
     void setBp(DWORD d) 
     { 
     bp=d; 
     } 
     //==================================================== 
     void incSp() 
     { 
     sp = sp+1; 
     } 
     void decSp() 
     { 
     if(sp == 0) 
     { 
     sp = 0; 
     } 
     sp = sp - 1; 
     } 
     //==================================================== 
     void setFlag(DWORD d) 
     { 
     flag=d; 
     } 
     //==================================================== 
     void setIp(DWORD d) 
     { 
     ip=d; 
     } 
     //==================================================== 
     DWORD getAx() 
     { 
     return ax; 
     } 
     //==================================================== 
     DWORD getDx() 
     { 
     return dx; 
     } 
     //==================================================== 
     DWORD getCx() 
     { 
     return cx; 
     } 
     //==================================================== 
     DWORD getBx() 
     { 
     return bx; 
     } 
     //==================================================== 
     DWORD getBp() 
     { 
     return bp; 
     } 
     //==================================================== 
     DWORD getSp() 
     { 
      return this->sp; 
     } 
     //==================================================== 
     DWORD getFlag() 
     { 
     return flag; 
     } 
     //==================================================== 
     DWORD getIp() 
     { 
     return ip; 
     } 
     //==================================================== 
}; 

왜 getSp()를 사용합니까? 이런 기능 : 그것은 내게 AV 오류를 범메모리 액세스 위반 C ​​++ Borland

PReg->getSp(); 

, I는 I 그것이 내게 및 문제 함수의 지점에서 설정 제로의 insted 난수를 제공 초기화 시점이 변수를 추적 sp 변수는 "????" ?

Register *PReg;은 - 레그 :

+1

왜 SP를 다른 SP와 다르게 취급합니까? 어떻게 'PReg'를 배정 하시겠습니까? – Mat

+2

'PReg'를 선언 한 코드를 보여줄 수 있습니까? – birryree

+1

'Register '의 인스턴스를 어떻게 선언하고 있습니까? – Chad

답변

0

(지금까지의 내가 주어진 말할 수있는 당신이 무엇을 게시 한) 이유입니다

Register *PReg; 

PReg가 유효하지 않습니다. 확실히, 당신은 그것을 선언하지만 초기화하지 않기 때문에 그 값은 불확실하고 그것을 역 참조하면 정의되지 않은 동작이 발생합니다. new해야하거나 다른 곳에서 유효한 포인터로 초기화하십시오. 간단히 선언하면 메모리를 할당하지 않고 포인터를 초기화하지 않습니다. 정적 저장 공간이없는 변수의 경우에도 마찬가지입니다. 그러나 정적 인 경우에도 포인터가 역 참조되기 전에 초기화되지 않으면 유효하지 않습니다.

Register *PReg = new Register(); 
// use it... 
delete PReg; 

는 정직하지만, 당신은 C에서 코드이 방법을 설계해서는 안 ++ 당신은 당신이 무엇을하고 있는지 알지 못한다. RAII을 살펴보십시오. 귀하의 예를 들어, 나는 자동 스토리지를 사용하지 않을 이유가 없다고 생각합니다.

void Foo() { 
    Register reg; 
    // use reg 
} // reg goes out of scope, memory reclaimed 

또한, 나는 당신이 sp를 초기화 memset을 사용하는 이유를 모르겠어요.

+0

고마워요! 너 나 많이 도와 줬어! 나는 Register를 사용한다. * PReg 사촌 나는 오직 하나의 Register 인스턴스만을 필요로한다. 그리고 memset 다른 사람들이 사용하는 것처럼 사용 sp를 초기화 할 수 있습니다 .. – Hakon89

+0

당신은 그것을 초기화하는 memset 필요하지 않습니다; 그냥 값을 지정하십시오. memset은 비교적 큰 블록의 데이터를 빠르게 할당하는데 유용합니다 (대부분의 루핑 배열 초기화는 컴파일러에 의해 memset에 대한 단일 호출로 변환 될 것입니다). 그러나 여기에서는 필요하지 않습니다. –

+0

다시 한번 고맙습니다. 이제 조심하세요! – Hakon89

0

코드가 올바르게 컴파일되고 실행되므로 PReg 변수를 인스턴스화하는 방법이 가장 쉬울 수 있습니다. 그냥 선언도

Register *PReg = new Register; 
cout << PReg->getSp() << endl; 

그리고 :

Register PReg; 
cout << PReg.getSp() << endl; 

그리고 예상대로 모두 인쇄 "0"나는 첫 번째는 당신이 그것을하고있는 가정 방법입니다, 그것을 두 가지 방법을했습니다. PReg 인스턴스를 만드는 방법을 게시 할 수 있다면 도움이 될 것입니다.

+0

Ive는 이미 PReg 인스턴스를 만드는 방법을 게시했습니다. 여기에 조금 더 있습니다 :'class Stack { private : DWORD stack [STACK_SIZE]; DWORD stack_max; 등록 * PReg; public :'... – Hakon89

+0

포인터를 선언하는 방법을 알려주지 만 클래스의 인스턴스를 만드는 방법은 알 수 없습니다. "PReg = new Register"를 호출하지 않고 Stack 내에서 PReg를 사용하려는 경우, 단위화된 포인터를 참조하려고하기 때문에 매번 충돌이 발생합니다. – JoeFish