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 文件在 Ubuntu 11.10(使用 g++)中编译没有任何问题,但是当我尝试执行 a.out 文件时出现此错误:

* 检测到 glibc./a.out: realloc(): 无效指针: 0x003c2ff4 * *

======= 回溯:=========

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

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

./a.out[0x8048835]

./a.out[0x8048ca9]

./a.out[0x8048b2a]

/lib/i386-linux-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 08:06 1311674 /lib/i386-linux-gnu/libgcc_s.so.1

等等

谁能帮我?

4

2 回答 2

0
   if(circuitSize==1)
       Matrix=(circuitTypes **)malloc(circuitSize*sizeof(circuitTypes *));
   else
       Matrix=(circuitTypes **)realloc(Matrix,circuitSize*sizeof(circuitTypes *));

我不明白if这里的条件。应该是if (Matrix == 0)吧?否则,您将冒着尝试从一开始realloc就从未做过的事情的风险malloc

但我同意@JerryCoffin 的观点,你应该把它扔掉并使用std::vector.

于 2013-02-26T02:09:31.887 回答
0
  1. 设置 Matrix = realloc 是不好的,因为如果 realloc 失败,您将永远无法释放它。但是无论如何您都会立即退出,因此代码不会泄漏,但这仍然是不好的做法。
  2. 您只是在声明 circuitTypes **Example 并在 circuit(Example, i, j) 中使用它,而不给它分配内存。您可能想为此使用 Matrix。
  3. 这是一个纯粹的猜测:你的代码的结构方式让我认为你想让 Matrix 成为静态并使用它而不是 Example。
于 2013-02-26T02:17:40.263 回答