سؤال

أحدد هذا الهيكل:

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 (Typedef'd to t_molecule ، ولكن لا يزال).

باستخدام هذا المؤشر يمكنني الحصول على هذا الرمز للعمل:

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.

لمعلوماتك أقوم بتجميع Linux Centos 5.4 مع G ++ واستخدام نظام MakeFile مخصص.

هل كانت مفيدة؟

المحلول 4

مرة أخرى ، تم الرد على هذه المشكلة هنا:مشكلة مؤشر غريبة في C ++بواسطة deadmg. آسف لمنصب مزدوجة.

نصائح أخرى

sbi شكرا على النصيحة الجيدة! أعتقد أنك على صواب - المشغل المفرط في المهمة غير ضروري ويجب إلغاؤه.

لقد اتبعت نهج التعليق على الأشياء وأنا مرتبك للغاية. في الأساس في الوظيفة التي تمرر المؤشر إلى جزيء معين إلى الوظيفة الرئيسية للطباعة ، يمكنني رؤية جميع البيانات في هذا الجزيء (الروابط ، الجسيمات ، الاسم ، إلخ) ، الطباعة مع Cout's.

بمجرد أن أقوم بتمريره إلى MAIN كـ PTR ، إذا كنت أستخدم هذا PTR مع جهاز التكرار ، أحصل على segfault. بعبارات أخرى. أيضًا لسبب ما ، فإن بيانات السندات (التي يمكنني طباعتها بحرية في funct الخاصة بي التي تعود إلى المؤشر) تتسرب أيضًا إذا حاولت طباعتها ، حتى لو كنت أستخدم [] لفهرس ناقل السندات (الذي يعمل من أجل الجسيمات المتجه).

هذه أفضل المعلومات التي يمكنني تقديمها الآن.

تخمين برية: هل تستخدم المكتبات المشتركة. أتذكر أنني أواجه صعوبات في تمرير أجهزة STL ذهابًا وإيابًا عبر حدود المكتبة المشتركة.

سئل جيسون (مرجع سابق) في تعليق من قبل ديفيد رودريغيز:

هل تعيد مؤشر إلى متغير محلي؟

أجاب جيسون:

لا هو PTR لمتغير الفصل. الفئة موجودة إلى حد كبير (تحتوي على الوظيفة التي تُرجع الجزيء).

ما لم تكن تتحدث عن متغير فئة حقيقي (مؤهل مثل static) ، حقيقة أن صف دراسي لا علاقة له بها. حالات من فئة ما ، وربما توقفوا عن الوجود حتى لو اتصلت للتو بوظيفة عليها.

على هذا النحو ، السؤال هو:

  • هل نموذج من الفصل الذي أعاد المؤشر current_molecule مازال موجودا؟
  • أو current_molecule مؤهل static, ، أي كونه متغير الطبقة الحقيقية؟

إذا كانت الإجابة على كلا السؤالين "لا" ، فأنت في مقاطعة غير محددة.

في هذه المرحلة ، يصبح من المهم للغاية نشر التعليمات البرمجية المصدر التي يمكن استخدامها من قبلنا هنا لإعادة إنتاج المشكلة فعليًا ؛ قد تكون موجودة في المصدر الذي لا ترينا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top