0

2 次元配列を行列として使用する方法と、boost::ublas::matrix を使用する方法の 2 つの異なる方法でコードを記述しました。最初のケースでこのオブジェクトを追加すると動作しますが、2 番目のケースではセグメンテーション エラーが発生します。私は 2 番目の方法を使用したいので、セグメンテーション違反が発生する理由を誰かが知っていれば、感謝します。

コード:

img.h

#include <Magick++.h>
#include <string>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

using namespace boost::numeric::ublas;
using namespace std;
using namespace Magick;

class Img
{
    public:
        Img();
        Img(const string path2file);

        unsigned int width, height;
        string filename;
    private:
        typedef struct pix
        {
            Quantum R;
            Quantum G;
            Quantum B;
        } pix;

        matrix<pix> p;

        pix **pixels;
    string format;
};

img.cpp

Img::Img(const string path2file)
{
 Image file;
 unsigned int i, j;
 Color pixel;

 file.read(path2file);

 filename = path2file;
 width = file.size().width();
 height = file.size().height();

// begin of first way
 pixels = (pix**)malloc(sizeof(pix*)*height);
 for(i=0 ; i<height ; ++i)
  pixels[i] = (pix*)malloc(sizeof(pix)*width);

 for(i=0 ; i<height ; ++i)
 {
  for(j=0 ; j<width ; ++j)
  {
   pixel = file.pixelColor(j, i);

   pixels[i][j].R = pixel.redQuantum();
   pixels[i][j].G = pixel.greenQuantum();
   pixels[i][j].B = pixel.blueQuantum();
  }
 }
// end of first way

// begin of second way
 p.resize(height, width);
 for(i=0 ; i<height ; ++i)
 {
  for(j=0 ; j<width ; ++j)
  {
   pixel = file.pixelColor(j, i);

   p(i, j).R = pixel.redQuantum();
   p(i, j).G = pixel.greenQuantum();
   p(i, j).B = pixel.blueQuantum();
  }
 }*/
}
// end of second way

このコードがセグメンテーション違反の原因ではないことは確かです。しかし、メインプログラムで使用すると、セグメンテーション違反が発生します(2番目の方法でのみ、最初は機能しています):

main.cpp

#include <iostream>
#include <stdio.h>
#include "img.h"
#include <vector>

using namespace std;

int main(void)
{
 std::vector<Img> files;
 files.push_back(Img("files/mini.bmp"));
 return 0;
}
4

4 に答える 4

2

プログラムを gdb にロードし、クラッシュさせます。gdb コンソールに bt または backtrace と入力すると、行われたすべての呼び出しのスタック フレームが取得され、segfault の原因を確認できます。

于 2011-01-14T21:12:59.803 に答える
1

私が書いたように、問題はの定義にありました。次のようにする必要があります。

vector<Img*> files;

それ以外の

vector<Img> files;

から初期化オブジェクトを変更します

Img tmp("path_to_file");

Img* tmp = new Img("path_to_file");

私は一日中コーディングするのにとても疲れているので、ばかげた間違いを犯します。

ご協力いただきありがとうございます!

于 2011-01-14T22:30:59.133 に答える
0
pixels = (pix**)malloc(sizeof(pix*)*height);

これは奇妙に思えますが、malloc はポインターへのポインターではなく (void) ポインターを返しますが、 [][] 配列に対しては機能する可能性があります。再校正後、それはOKのようです:p

クラス Img と、「file」という名前の変数でインスタンス化する別の Image の両方を使用すると、少し混乱する可能性があります。

一部のコードも欠落しています (「p」など) が、そこにあるものは問題ないようです。私があなただったら、プログラムがクラッシュする場所を絞り込むために、いくつかの printf() をあちこちに配置します。私の最善の策は、p(i,j) インデックスが範囲外である可能性があることです。

幸運を!

于 2011-01-14T21:55:28.723 に答える
0

プログラムをvalgrindの下で実行すると、segfault の原因と場所を見つけるのに役立ちます。

于 2011-01-14T21:33:37.997 に答える