2

プログラムでセグメンテーション違反が発生したときに、デバッグを試みていました。私はそれを巻き戻しが呼ばれるところまで追跡しました。

ISBNPrefixオブジェクトが作成されると、ファイルが開かれます

ISBNPrefix::ISBNPrefix(const char* filename) 
{

   file = fopen( filename, "r" );

}

ファイルはISBNPrefixクラスのメンバーです。

class ISBNPrefix {
FILE* file;
public:
    ISBNPrefix(const char* filename);
    bool isRegistered(int area) const;
    int minNoDigits(int area) const;
    bool isRegistered(int area, const char* publisher) const;
    ~ISBNPrefix();
};

ISBNPrefixオブジェクトを作成する行は次のとおりです。

ISBNPrefix prefixList("prefixRanges.txt");

prefixRanges.txtは、私のディレクトリ内のファイルの名前です

現在、このセクションでセグメンテーション違反が発生しています。

//-------------------------------
cout << "MADE IT 1" << endl;
//-------------------------------
   rewind( file );
//-------------------------------
cout << "MADE IT 2" << endl;
//-------------------------------

どの出力:

MADE IT 1
Segmentation fault

デコンストラクター:

ISBNPrefix::~ISBNPrefix()
{
   if( file != NULL )
   {
      fclose(file);
   }
}

ファイルが閉じられる唯一の場所です

編集:いくつかのトラブルシューティングの後、解決策が見つかりませんでした、そして私がすべてを投稿することが提案されました。私の評判は低く、2つ以上のリンクを投稿することはできないので、ペーストビンのリンクはコメントセクションにあります。

4

2 に答える 2

4
if(file != NULL)
cout << "ITS NOT NULL";
   rewind( file );

になるはずだった

if(file != NULL)
{
    cout << "ITS NOT NULL";
    rewind( file );
}

最初のバージョンでは、次の行をどれだけインデントしても、 ourput ステートメントだけが条件付きでした...

このような単純なものを避けるために、単一のステートメント ブロックであっても常に角かっこ ({}) を含めることをお勧めします。また、コードを適切にフォーマットし、インデントが実際のコード構造に従っていることを確認してください。例えば:

if(file != NULL)
    cout << "ITS NOT NULL";
rewind( file );  // it would have been more obvious this way
于 2013-03-16T20:20:24.393 に答える
3

あなたが見ている問題はわかりませんが、深刻な問題が見られます。私のシステムでは、終了時にプログラムがクラッシュします。たぶん、あなたのシステムでは、それが問題の原因です。

ISBN ヘッダーのこのコード

class ISBN{
        char area[5];
        char publisher[7];
        char title[6];
        bool registered;
        char ISBNstr[11];
        bool isRegistered(const ISBNPrefix& list);

そしてISBNコンストラクターのこのコード

ISBN::ISBN()
{
   for(int i=0;i<=5;i++)
   {
   area[i] = '\0';
   }

   for(int i=0;i<=7;i++)
   {
   publisher[i] = '\0';
   }

   for(int i=0;i<=6;i++)
   {
   title[i] = '\0';
   }

   for(int i=0;i<=11;i++)
   {
   ISBNstr[i] = '\0';
   }
   registered = false;
}

これらのループはすべて 1 周しすぎます。たとえば、エリア ループ内にあってはなりi<5ませんi<=5

   for(int i=0;i<5;i++)
   {
   area[i] = '\0';
   }

このバグが原因でメモリが壊れており、それが問題を引き起こしやすいのです。

于 2013-03-16T21:51:55.580 に答える