2013-02-26 2 views
0
#include <iostream> 
#include <stdlib.h> 

class circuitTypes{ 

protected: 
    static int size; 
    circuitTypes **Matrix; 
    int input1,input2; 
    int output1, output2; 

public: 

    circuitTypes() {}; 
    static int getSize() { return size; }; 
    static void upSize() { size++; }; 
    void ItemRegistry(); 
    virtual void setTruthTable()=0; 
    void setInputAndCalculateOutput(int a, int b); 
    int *getOutput(); 
}; 

int circuitTypes::size=0; 

int *circuitTypes::getOutput(){ 
    int Output[2]; 
    Output[0]=output1; 
    Output[1]=output2; 
    return Output; 
} 
void circuitTypes::ItemRegistry(){ 

    circuitTypes::upSize(); 
    int circuitSize=circuitTypes::getSize(); 

    if(circuitSize==1) 
     Matrix=(circuitTypes **)malloc(circuitSize*sizeof(circuitTypes *)); 
    else 
     Matrix=(circuitTypes **)realloc(Matrix,circuitSize*sizeof(circuitTypes *)); 
    if(Matrix==0){ 
     std::cout <<"No available memory \n"; 
     exit(1); 
    } 
    Matrix[circuitSize-1]=this; 
} 


void circuitTypes::setInputAndCalculateOutput(int a, int b){ 
    input1=a; 
    input2=b; 
    setTruthTable(); 
} 


class TypeA : private circuitTypes{ 

public: 
    TypeA() { ItemRegistry(); }; 
    void setTruthTable(); 
}; 

void TypeA::setTruthTable(){ 
    if (input1==0){ 
     if (input2==0){ 
      output1=0; 
      output2=0; 
     } 
     else{ 
      output1=0; 
      output2=1; 
     } 
    } 
    else{ 
     if (input2==0){ 
      output1=0; 
      output2=1; 
     } 
     else{ 
      output1=1; 
      output2=1; 
     } 
    } 
} 


class TypeB : private circuitTypes{ 
public: 
    TypeB() { ItemRegistry(); }; 
    void setTruthTable(); 
}; 

void TypeB::setTruthTable(){ 
    if (input1==0){ 
     if (input2==0){ 
      output1=0; 
      output2=0; 
     } 
     else{ 
      output1=0; 
      output2=1; 
     } 
    } 
    else{ 
     if (input2==0){ 
      output1=1; 
      output2=1; 
     } 
     else{ 
      output1=0; 
      output2=1; 
     } 
    } 
} 

void circuit (circuitTypes **Example, int a, int b){ 
    std::cout << "NIKKK"; 
    Example[0]->setInputAndCalculateOutput(a,b); 
    int Size=Example[0]->getSize(); 
    for (int i=1;i<Size;i++){ 

     Example[i]->setInputAndCalculateOutput(Example[i-1]->getOutput()[0],Example[i-1]->getOutput()[1]); 

    } 
    std::cout << "For input a= " << a << " and b= " << b << " the result is c= " << Example[Size-1]->getOutput()[0] << " and d=" << Example[Size-1]->getOutput()[1] << "\n"; 
} 


int main(){ 

    circuitTypes **Example; 
    TypeA A1,A2,A3; 
    TypeB B1,B2,B3; 
    for (int i=0;i<2;i++){ 

     for (int j=0;j<2;j++){ 
      circuit (Example,i,j); 
     } 

    } 

} 

코드의 크기는 유감 스럽지만 어디에서 문제가 있는지 전체 프로그래머를 게시하기로 결정했습니다. .cpp 파일은 우분투 11.10에서 아무 문제없이 컴파일 (++ g와)하지만 난 a.out 파일을 실행하려고하면이 오류 얻을 : (realloc을 : glibc는이 ./a.out을 감지C에서 메모리를 올바르게 재 할당

*를) : 잘못된 포인터 : 0x003c2ff4 * *

======= 역 추적 : =========

/lib/i386-linux-gnu/libc.so.6 (+ 0x721a2) 0x2b71a2]

/lib/i386-linux-gnu/libc.so.6(realloc+0x2a5)[0x2bb245]

,536,913 63,210

./a.out[0x8048835]

./a.out[0x8048ca9]

./a.out[0x8048b2a]

/LIB/I386-리눅스 GNU/된 libc. so.6 (__ libc_start_main + 0xf3) 0x25e113]

./a.out[0x80486c1]

======= 메모리 맵 : ========

00110000 -0012c000 r-xp 00000000 08 : 06 1311674 /lib/i386-linux-gnu/libgcc_s.so.1

0012c000-0012d000 R - P 0001b000 8시 6분 1,311,674 /lib/i386-linux-gnu/libgcc_s.so.1

아무도 도와 줄 수 있습니까?

+1

제 조언 : 'malloc'또는 'realloc'이 전혀 존재하지 않는다는 것을 잊지 마십시오. 대신에'std :: vector'를 사용하십시오. 당신의 진리표에 관해서는, TypeA에 대해서 그것은 단지'output1 = input1 & input2','output2 = input1 | 입력 2 '. 당신의'getoutput'은 또한 지역 변수의 주소를 반환합니다. 그래서 그것을 사용하면 정의되지 않은 행동을합니다 (다시 말하면 배열 대신에 벡터를 반환함으로써 쉽게 치료할 수 있습니다). –

+0

맨 위부터'main()'을주의 깊게 살펴본 다음, ** 답을 ** 묻고, 다음 질문을한다.'circuit '함수에 전달되는'Example'의 값은 무엇인가?)'? – WhozCraig

+0

'realloc (0, size)'는'malloc (size)'와 동일합니다. 그래서 처음에는'Matrix'를 널 (NULL)로 만들 수 있고,'Matrix = realloc (Matrix, n); if (! Matrix) oom();' –

답변

0
  1. Matrix = realloc은 realloc이 실패 할 경우를 대비하여 해제 할 수 없기 때문에 좋지 않습니다. 하지만 코드가 누출되지 않도록 즉시 종료됩니다.하지만 여전히 나쁜 습관입니다.
  2. circuitTypes ** Example을 선언하고 회로에 메모리 (예, i, j)를 사용하지 않고이를 사용하고 있습니다. 아마도 Matrix를 사용하고 싶을 것입니다.
  3. 이것은 순수한 추측입니다. 코드가 구조화 된 방식으로 Matrix를 정적으로 만들고 Example 대신 사용하려고한다고 생각합니다.
0
if(circuitSize==1) 
     Matrix=(circuitTypes **)malloc(circuitSize*sizeof(circuitTypes *)); 
    else 
     Matrix=(circuitTypes **)realloc(Matrix,circuitSize*sizeof(circuitTypes *)); 

여기에는 if 조건을 이해할 수 없습니다. 확실히 if (Matrix == 0)이어야합니까? 그렇지 않으면 당신은 결코 malloc -ed를 가진 realloc 뭔가를 시도 할 위험이 있습니다.

하지만 @JerryCoffin에 동의하면 던져서 std::vector을 사용해야합니다.