#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
아무도 도와 줄 수 있습니까?
제 조언 : 'malloc'또는 'realloc'이 전혀 존재하지 않는다는 것을 잊지 마십시오. 대신에'std :: vector'를 사용하십시오. 당신의 진리표에 관해서는, TypeA에 대해서 그것은 단지'output1 = input1 & input2','output2 = input1 | 입력 2 '. 당신의'getoutput'은 또한 지역 변수의 주소를 반환합니다. 그래서 그것을 사용하면 정의되지 않은 행동을합니다 (다시 말하면 배열 대신에 벡터를 반환함으로써 쉽게 치료할 수 있습니다). –
맨 위부터'main()'을주의 깊게 살펴본 다음, ** 답을 ** 묻고, 다음 질문을한다.'circuit '함수에 전달되는'Example'의 값은 무엇인가?)'? – WhozCraig
'realloc (0, size)'는'malloc (size)'와 동일합니다. 그래서 처음에는'Matrix'를 널 (NULL)로 만들 수 있고,'Matrix = realloc (Matrix, n); if (! Matrix) oom();' –