0

次のコードに問題があります (コンパイラは文句を言いませんが、実行時にエラー メッセージが表示されます - R6010 中止)。基本的に、画像からデータを読み取り、動的に割り当てられた配列に格納する Image クラスを作成しました。次に、画像データを int main の anther 配列に渡したいと思います。何らかの理由でこれは機能しません。

class Image
{
private:
    char* charImage;
    int TotRows;
    int TotCol;
    int Size;
    int MaxVal;
    char Magic[2];

public:
    Image();
    Image (const Image& Orig);
    ~Image();
    void operator=(const Image&); //overloaded assignment operator
    void ReadImage();
    char ReturnImage(int i);
    int getSize();
};

Image::Image()//constructor
{
    Size = (3 * TotRows * TotCol);
    charImage = new char [Size];
}

Image::Image (const Image& Orig)//copy constructor
{
    TotRows = Orig.TotRows;
    TotCol = Orig.TotCol;
    Size = Orig.Size;
    charImage = new char [Size];
}

Image::~Image()//destructor
{

    delete []charImage;
}

void Image::operator=(const Image& Orig)
{
    TotRows = Orig.TotRows;
    TotCol = Orig.TotCol;
    Size = Orig.Size;
    charImage = new char [Size];

    for (int i = 0; i < Size; i++)
    {
        charImage[i]=Orig.charImage[i];
    }
}

void Image::ReadImage()
{
    //opening original image
    ifstream OldImage;
    OldImage.open ("image2.ppm", ios::in | ios::binary);

    if (!OldImage)
        cout << "\nError: Cannot open image file! " << endl;

    //reading the header of the original image file
    OldImage >> Magic [0] >> Magic [1];

    //if the image is not in the right format, do not proceed!
    if ((Magic [0] != 'P')||(Magic [1] != '6'))
        cout << "\nError: image is in the wrong format!" << endl;

    else
        OldImage >> TotRows >> TotCol >> MaxVal;

    //reading the image in binary format and storing it in the array of characters
    OldImage.read(charImage, Size);

}

char Image::ReturnImage(int i)
{
    return charImage[i];
}
int Image::getSize()
{
    return Size;
}

int main ()
{
    char* charImage;
    int Size;
    Image myImage;
    myImage.ReadImage();
    Size = myImage.getSize();

    charImage= new char [Size];

    for (int i=0; i<Size; i++)
    {
        charImage[i]=myImage.ReturnImage(i);
    }

    delete [] charImage;

    return 0;
}
4

3 に答える 3

4

明らかなエラーの 1 つは、デフォルトのコンストラクターで画像のサイズを設定していないことです。

Image::Image()//constructor
{
    Size = (3 * TotRows * TotCol);
    charImage = new char [Size];
}

ここでは、TotRowsTotColは初期化されておらず、任意の値を持つことができます。

次に、代入演算子ではcharImage、新しい配列を指すようにする前に、が指す配列の割り当てを解除しないため、リソースがリークします。

于 2013-05-15T11:37:00.480 に答える
0

Image (myImage) のインスタンスを作成すると、TotRows および TotCol メンバーは初期化されません。コンストラクターの「サイズ」の値は誰にもわかりません。

于 2013-05-15T11:36:44.863 に答える
0

他の方のコメントとは別に、

私の理解では、画像が正しい形式でない場合は続行したくありませんが、それでも画像を読み取っています。

  //if the image is not in the right format, do not proceed!
    if ((Magic [0] != 'P')||(Magic [1] != '6'))
        cout << "\nError: image is in the wrong format!" << endl;

    else
        OldImage >> TotRows >> TotCol >> MaxVal;

画像形式に関係なく、画像を読み取ります。

    //reading the image in binary format and storing it in the array of characters
    OldImage.read(charImage, Size);

それがある程度役立つことを願っています。

于 2013-05-15T11:48:57.030 に答える