1

私はこの構造を定義します:

struct s_molecule
{
  std::string res_name;
  std::vector<t_particle> my_particles;
  std::vector<t_bond> my_bonds;
  std::vector<t_angle> my_angles;
  std::vector<t_dihedral> my_dihedrals;

  s_molecule& operator=(const s_molecule &to_assign)
  {
    res_name = to_assign.res_name;
    my_particles = to_assign.my_particles;
    my_bonds = to_assign.my_bonds;
    my_angles = to_assign.my_angles;
    my_dihedrals = to_assign.my_dihedrals;
    return *this;
  }
};

およびこれらの構造:

typedef struct s_particle
{
  t_coordinates position;
  double charge;
  double mass;
  std::string name;
  std::vector<t_lj_param>::iterator my_particle_kind_iter;

  s_particle& operator=(const s_particle &to_assign)
  {
    position = to_assign.position;
    charge = to_assign.charge;
    mass = to_assign.mass;
    name = to_assign.name;
    my_particle_kind_iter = to_assign.my_particle_kind_iter;
    return *this;
  }
} t_particle;

struct s_bond
{
  t_particle * particle_1;
  t_particle * particle_2;
  std::vector<t_bond_param>::iterator my_bond_kind_iter;

  s_bond& operator=(const s_bond &to_assign)
  {
    particle_1 = to_assign.particle_1;
    particle_2 = to_assign.particle_2;
    my_bond_kind_iter = to_assign.my_bond_kind_iter;
    return *this;
  }
};

次に、コードでs_moleculeへのポインターを返します(t_moleculeにtypedefしますが、それでも)。

このポインタを使用して、このコードを機能させることができます。

for  (unsigned int i = 0;
      i < current_molecule->my_particles.size();
      i++)
    {
      std::cout << "Particle " 
        << current_molecule->my_particles[i].name << std::endl
            << "Charge: " 
        << current_molecule->my_particles[i].charge << std::endl
        << "Mass: " 
        << current_molecule->my_particles[i].mass << std::endl
        << "Particle Kind Name: " 
        << (*current_molecule->my_particles[i].my_particle_kind_iter).atom_kind_name 
        << std::endl
        << "x: " << current_molecule->my_particles[i].position.x 
        << " y: " << current_molecule->my_particles[i].position.y
    #ifdef USE_3D_GEOM
        << "z: " << current_molecule->my_particles[i].position.z
    #endif
        << std::endl;
    }

私がそれを置き換える場合:

for  (std::vector<t_particle>::iterator it = current_molecule->my_particles.begin();
      it !=current_molecule->my_particles.end();
      it++)
    {
      std::cout << "Particle " 
        << (*it).name << std::endl
            << "Charge: " 
        << (*it).charge << std::endl
        << "Mass: " 
        << (*it).mass << std::endl
        << "Particle Kind Name: " 
        << (*(*it).my_particle_kind_iter).atom_kind_name 
        << std::endl
        << "x: " << (*it).position.x 
        << " y: " << (*it).position.y
    #ifdef USE_3D_GEOM
        << "z: " << (*it).position.z
    #endif
        << std::endl;
    }

私は今、厄介なsegfaultsを取得します...

ここにあまり多くを入れないでください、しかし私がこれをしようとしたとき、私はまたsegfaultsを得ています:

std::cout << "Bond ATOMS : " 
          << (*current_molecule).my_bonds[0].particle_1->name
          << std::endl

繰り返しになりますが、current_moleculeはs_molecule構造体へのポインターであり、構造体の配列が含まれています。構造体の配列には、直接varsがあるか、ポインターがあります。これらの間接参照の複数のレイヤーを機能させることができません。これらのsegfaultsを修正するための提案。

参考までに、g++を使用してLinuxCentos 5.4でコンパイルし、カスタムmakefileシステムを使用しています。

4

4 に答える 4

0

@sbi良いアドバイスをありがとう!私はあなたが正しいと信じています-割り当てのオーバーロードされた演算子は不要であり、破棄する必要があります。

私はコメントアウトのアプローチに従いましたが、非常に混乱しています。基本的に、特定の分子へのポインタをメイン関数に渡して印刷する関数では、その分子内のすべてのデータ(結合、粒子、名前など)を完全に確認でき、coutを使用して印刷できます。

それをptrとしてメインに渡すと、そのptrをイテレーターで使用すると、セグメンテーション違反が発生します。言い換えると。また、何らかの理由で、[]を使用して結合のベクトル(粒子に対して機能する)にインデックスを付けても、結合データ(ポインターに戻る関数で自由に印刷できます)も印刷しようとするとセグフォールトしますベクター)。

それは私が今のところ与えることができる最高の情報です。

于 2010-06-25T06:41:08.787 に答える
0

大げさな推測:共有ライブラリを使用していますか。共有ライブラリの境界を越えてSTLコンテナを行き来するのに苦労したことを覚えています。

于 2010-06-25T12:15:12.673 に答える
0

ジェイソン(OP)は、デビッド・ロドリゲスのコメントで尋ねられました。

ローカル変数へのポインタを返していますか?

ジェイソンは答えました:

クラス変数へのポインタはありません。このクラスは非常に存在しています(分子を返す関数が含まれています)。

真のクラス変数(として修飾される)について話しているのでない限り、クラスstaticが存在するという事実はそれとはあまり関係がありません。クラスのインスタンスは存在し、関数を呼び出しただけでも存在しなくなった可能性があります。

そのため、質問は次のとおりです。

  • ポインタを返したクラスのインスタンスcurrent_moleculeはまだ存在しますか?
  • または、current_moleculeとして修飾されstaticていますか、つまり、真のクラス変数ですか?

両方の質問に対する答えが「いいえ」の場合、あなたは未定義の郡にいます。

この時点で、問題を実際に再現するためにここで使用できるソースコードを投稿することが非常に重要になります。表示していないソースにある可能性があります。

于 2010-06-25T13:26:37.997 に答える
0

繰り返しますが、この問題はここで回答されました: DeadMGによるC++の奇妙なポインタの問題。二重投稿でごめんなさい。

于 2010-08-27T16:37:34.743 に答える