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 を設定するのは良くありません。とにかくすぐに終了するので、コードが漏れることはありませんが、それでも悪い習慣です。
  2. circuitTypes **Example を宣言し、メモリを割り当てずに circuit(Example, i, j) で使用しています。おそらくそのために Matrix を使用したいと思うでしょう。
  3. これは純粋な推測です。コードの構造から、Matrix を static にして、Example の代わりに使用したいと思われます。
于 2013-02-26T02:17:40.263 に答える