0

申し訳ありませんが、私はC ++に比較的慣れていないので、このコードをデバッグしています。これにより、cout <<が3回呼び出されたときにアクセス違反が発生します(load_arrayが戻った直後)。

#include <cstdlib>
#include <iostream>
#include <fstream>
#define FILENAME "H:\\test.preisach"
#define ROWS 32760
#define COLUMNS 4
using namespace std;

class cPreisach {
public:
    float input;
    float pdf[ROWS][COLUMNS];

    void load_array (){
    char c;
    float value=0;
    int getnum=0, rowno=0, columnno=0, power=0;
    bool decimalpoint=false, exponential=false;
    ifstream pdf_file (FILENAME);
    if (pdf_file.is_open()) {

  while (pdf_file.good()) {
    c=pdf_file.get();
    switch (c) {
      case '0': if (exponential == false) {value = (value*10); if (decimalpoint=true) getnum++;} else power=power*10; break;
      case '1': if (exponential == false) {value = (value*10)+1; if (decimalpoint=true) getnum++;} else power=(power*10)+1; break;
      case '2': if (exponential == false) {value = (value*10)+2; if (decimalpoint=true) getnum++;} else power=(power*10)+2; break; 
      case '3': if (exponential == false) {value = (value*10)+3; if (decimalpoint=true) getnum++;} else power=(power*10)+3; break;
      case '4': if (exponential == false) {value = (value*10)+4; if (decimalpoint=true) getnum++;} else power=(power*10)+4; break;
      case '5': if (exponential == false) {value = (value*10)+5; if (decimalpoint=true) getnum++;} else power=(power*10)+5; break;
      case '6': if (exponential == false) {value = (value*10)+6; if (decimalpoint=true) getnum++;} else power=(power*10)+6; break;
      case '7': if (exponential == false) {value = (value*10)+7; if (decimalpoint=true) getnum++;} else power=(power*10)+7; break;
      case '8': if (exponential == false) {value = (value*10)+8; if (decimalpoint=true) getnum++;} else power=(power*10)+8; break;
      case '9': if (exponential == false) {value = (value*10)+9; if (decimalpoint=true) getnum++;} else power=(power*10)+9; break;
      case '.': decimalpoint=true; break;
      case 'E': exponential = true; break;
      case ' ': if (value != 0){
                  value = value/(10^(getnum-power)); /*cout << rowno << columnno << "\n";*/ pdf[rowno][columnno] = value; value=0; power=0; getnum=0; decimalpoint=false; 
              exponential=false; columnno++;
            } break;
      case '\n': value = value/(10^(getnum-power)); /*cout << "newline" << rowno << columnno << "\n";*/ pdf[rowno][columnno] = value; value=0; power=0; getnum=0; decimalpoint=false; 
        exponential=false; rowno++; columnno=0; break;
    }
  }
  pdf_file.close();
}
}


void do_calculation (float input) {}
};

int main () {
  float input;
  cout << "welcome to the preisach function \n";
  cPreisach Preisach;
  cout << "created object, loading array \n";
  Preisach.load_array();
  cout << "please input magnetic field strength \n";
  cin >> input;
  Preisach.do_calculation (input);
  return 0;
}

coutがアクセス違反を引き起こす可能性がある理由はわかりませんが、その関数がコメント化されている場合はcoutで問題ないため、配列と関係があるはずです。

ありがとう

まだ自分の質問に答えることが許可されていないので編集してください。[1][1]ではなく[0][0]からインクリメントするのを忘れていたため、実際にはバッファオーバーフローでした。なぜそれが私に起こらなかったのか分かりません。かなりばかげています。皆さんありがとう :)

4

1 に答える 1

0

ファイルへのアクセスでエラーが発生したと思います。プログラムがファイルにアクセスできるかどうか、およびファイルが破損していないかどうかを確認する必要があります。

私が目にするもう1つのことは、ファイルを開くことはなく、開いているかどうかを確認することです。

ifstream pdf_file (FILENAME); 
if (pdf_file.is_open()) { 

それはもっと似ているはずです

ifstream pdf_file;
pdf_file.open(FILENAME);
if (pdf_file.is_open()) { 

ファイルがまだ開かれていない場合、プログラムはファイルから読み取ることができず、失敗する必要があります。

于 2012-07-18T11:02:19.780 に答える