سؤال

ولدي هيكل:

struct pkt_
{
  double x;
  double y;
  double alfa;
  double r_kw;
};

typedef struct pkt_ pkt;

وجدول هذه الهياكل:

pkt *tab_pkt;

tab_pkt = malloc(ilosc_pkt * sizeof(pkt));

ما أريد القيام به هو لفرز tab_pkt التي كتبها tab_pkt.alfa وtab_pkt.r:

qsort(tab_pkt, ilosc_pkt, sizeof(pkt), porownaj);

وأين porownaj هو مقارنة وظيفة، ولكن كيف لكتابة ذلك؟ هنا هو بلدي "رسم" منه:

int porownaj(const void *pkt_a, const void *pkt_b)
{
  if (pkt_a.alfa > pkt_b.alfa && pkt_a.r_kw > pkt_b.r_kw) return 1;
  if (pkt_a.alfa == pkt_b.alfa && pkt_a.r_kw == pkt_b.r_kw) return 0;
  if (pkt_a.alfa < pkt_b.alfa && pkt_a.r_kw < pkt_b.r_kw) return -1;
}
هل كانت مفيدة؟

المحلول

وشيء من هذا القبيل يجب أن تعمل:

int porownaj(const void *p_a, const void *p_b)
{
  /* Need to store arguments in appropriate type before using */
  const pkt *pkt_a = p_a;
  const pkt *pkt_b = p_b;

  /* Return 1 or -1 if alfa members are not equal */
  if (pkt_a->alfa > pkt_b->alfa) return 1;
  if (pkt_a->alfa < pkt_b->alfa) return -1;

  /* If alfa members are equal return 1 or -1 if r_kw members not equal */
  if (pkt_a->r_kw > pkt_b->r_kw) return 1;
  if (pkt_a->r_kw < pkt_b->r_kw) return -1;

  /* Return 0 if both members are equal in both structures */
  return 0;
}

والابتعاد عن الحيل الساذجة مثل:

return pkt_a->r_kw - pkt_b->r_kw;

والتي ترجع قيم الامم المتحدة وتطبيع، والخلط بين القراءة، لن تعمل بشكل صحيح للأرقام النقطة العائمة، وأحيانا حالات زاوية صعبة التي لا تعمل بشكل صحيح حتى بالنسبة للقيم الأعداد الصحيحة.

نصائح أخرى

وهناك جزئين لهذه المشكلة - كيفية كتابة التعليمات البرمجية، وكيفية المقارنة بين أنواع الحزمة. يجب عليك التأكد من أنك دائما إرجاع قيمة. كما ينبغي أن تكون التعليمات البرمجية دائما مثل ما يلي:

porownaj(&pkt_a, &pkt_b) == -porownaj(&pkt_b, &pkt_a)

ومقارنة المخطط التفصيلي لا يعالج حالات مثل:

pkt_a->alfa >  pkt_b->alfa && pkt_a->r_kw <= pkt_b->r_kw
pkt_a->alfa <  pkt_b->alfa && pkt_a->r_kw >= pkt_b->r_kw
pkt_a->alfa == pkt_b->alfa && pkt_a->r_kw != pkt_b->r_kw

وهناك أكثر من مشكلة - هل هو مناسب لمقارنة القيم النقطة العائمة من أجل المساواة بالضبط؟ والتي تعتمد على التطبيق الخاص بك.

وميكانيكيا، لديك لتحويل مؤشرات باطلة CONST إلى مؤشرات هيكل CONST. يمكنني استخدام يلقي صريح - C ++ يتطلب ذلك، وأنا في محاولة لجعل قانون بلدي مقبولة لC ++ مترجم حتى بينما هو في الحقيقة رمز C

.
int porownaj(const void *vp1, const void *vp2)
{
     const pkt *pkt_a = (const pkt *)vp1;
     const pkt *pkt_b = (const pkt *)vp2;

     if (pkt_a->alfa >  pkt_b->alfa && pkt_a->r_kw >  pkt_b->r_kw) return 1;
     if (pkt_a->alfa == pkt_b->alfa && pkt_a->r_kw == pkt_b->r_kw) return 0;
     if (pkt_a->alfa <  pkt_b->alfa && pkt_a->r_kw <  pkt_b->r_kw) return -1;
     return 0;
 }

وهذا لا يتعامل مع بت لا أستطيع أن حل بما أنني ليست طرفا في المعلومات اللازمة. لاحظ أنه في الكائنات العامة متعددة الأبعاد (مثل الأعداد المركبة، أو (س، ص) أو (س، ص، ض) ينسق) لا يمكن ببساطة مقارنة لأكبر من أو أقل من أو يساوي.

نعم، أنا الفرز حسب ألفا وr_kw يقرر إذا PKT هو أولا (القيمة الأولى سيكون لها أكبر (أو أصغر ألفا) وr_kw على ما أظن). كيف لي ان فهم المشكلة، وأنا لست متأكدا 100٪.

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