0

だから私は、例えば、3つの列を持つファイルを持っています:

1 1 750

これらは、x、y、強度値です。

次に、この長いファイルを配列に読み込もうとします。これまでのコードは次のとおりです。

using std::cout;
using std::endl;
using std::string;

string fOutFileName("gaintest.root"); 


int main()
{

  std::ifstream file1("data_p30.dat");

  double intensity;
  int i;
  int j ;
  double c[1000][1000];
if (file1.is_open()) {
    file1.seekg(0);
    while (!file1.eof()) {
      file1 >> i >> j >> intensity;
      c[i][j]=intensity;
      cout<<c[i][j]<<'/n'; 
    }
    file1.close();
  } else cout << "Error, cannot open file 1";
}

最終的には、強度にリンクされた 2D 配列を使用できるようにしたいと考えています。なぜ私が失敗しているのかについてのアイデアはありますか? 正常にコンパイルされますが、実行すると次のようになります。

root [0] 
 *** Break *** segmentation violation



===========================================================
There was a crash.
This is the entire stack trace of all threads:
===========================================================
#0  0x0000003701098c05 in waitpid () from /lib64/libc.so.6
#1  0x000000370103c481 in do_system () from /lib64/libc.so.6
#2  0x00002b036f5ebc6a in TUnixSystem::StackTrace() ()
   from /batchsoft/root/root528-x86_64-slc5-43/lib/libCore.so
#3  0x00002b036f5eb63c in TUnixSystem::DispatchSignals(ESignals) ()
   from /batchsoft/root/root528-x86_64-slc5-43/lib/libCore.so
#4  <signal handler called>
#5  0x00002b0370acd515 in TRint::Run(bool) ()
   from /batchsoft/root/root528-x86_64-slc5-43/lib/libRint.so
#6  0x000000000040106d in main ()
===========================================================


The lines below might hint at the cause of the crash.
If they do not help you then please submit a bug report at
http://root.cern.ch/bugs. Please post the ENTIRE stack trace
from above as an attachment in addition to anything else
that might help us fixing this issue.
===========================================================
#5  0x00002b0370acd515 in TRint::Run(bool) ()
   from /batchsoft/root/root528-x86_64-slc5-43/lib/libRint.so
#6  0x000000000040106d in main ()
===========================================================
4

2 に答える 2

2

C++ の場合

double c[1000, 1000];

最初の 1000 は破棄され、コンパイラは次のコードを生成します。

double c[1000];

あなたが書いた [1000, 1000] は Pascal では多次元配列ですが、C++ ではそうではありません。C++ では、次のように使用します。

double c[1000][1000];
于 2013-03-06T13:37:31.630 に答える
0

表示されたエラーは、ROOT によって生成されたものです。これは ROOT フォーラムではないため、ROOT は CERN の科学者によって開発された C++ データ分析フレームワークです。好奇心旺盛な方のために、彼らのウェブサイトはこちらです。ただし、問題はROOTとは関係ありません。

2D 配列は次のように宣言されます。

double a[2][2];

これはあなたのために働くでしょう。

おそらくより安全なのは、テンプレート クラスを使用することです。

std::vector<double> v;

2D アプリケーションの場合、これは次のようになります。

std::vector<std::vector<double> > v2;

これの利点は、必要に応じてサイズを調整できることです。

v.push_back(d);

ベクトルの最後に要素を追加し、必要に応じて延長します。要素には、次のような配列構文でアクセスすることもできます

v[1] 

また

v2[1][2]
于 2013-04-09T00:18:56.377 に答える