مؤشر من عدد صحيح ث / س يلقي تحذير عند استدعاء Lfind

StackOverflow https://stackoverflow.com/questions/1283246

  •  16-09-2019
  •  | 
  •  

سؤال

أنا أكتب متجه في C. دالة CVectorSearch تستخدم BSearch إذا تم فرزها، و Lfind إذا كان غير ممتع. لماذا أحصل على المهمة "المهمة" تجعل المؤشر من عدد صحيح دون إيصال "عندما أتصل ب Lfind؟ يبدو أنه يعمل بشكل جيد حتى عند استخدام LFIND.

typedef struct
{
  void *elements;
  int logicalLength;
  int allocatedLength;
  int elementSize;
} CVector;

typedef void (*CVectorFreeElemFn)(void *elemAddr);


int CVectorSearch(const CVector *v, const void *key, 
          CVectorCmpElemFn comparefn, 
          int startIndex, bool isSorted)
{

    void * found;
    int elemSize = v->elementSize;
    int length = v->logicalLength;
    void *startAddress = (char*)v->elements + startIndex*elemSize;

    if(isSorted)
        found = bsearch(key, startAddress, length, elemSize, comparefn);
    else
        found = lfind(key, startAddress,  &length,  elemSize, comparefn);


    if(found)
        return ((char*)found - (char*)v->elements) / elemSize;
    else
        return -1;
}

تعديل: الآن بعد أن قمت بتضمين البحث. أنا أحصل على:

warning: passing argument 3 of 'lfind' from incompatible pointer type

لا يزال البرنامج يعمل بشكل صحيح.

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

المحلول

الحجة الثالثة إلى Lfind () هي مؤشر ل size_t ليس int كما كنت تمر. ال size_t قد يكون النوع من حجم مختلف من int في بعض البنيات (خاصة X86-64) وهي أيضا غير موقعة. عليك تغيير نوع length عامل.

نصائح أخرى

هل شملت <search.h> الذي يحدد lfindب إذا تم استدعاء وظيفة بدون نموذج أولي، فقد يفترض التحويل البرمجي الخاص بك إرجاعه int.

لا أعتقد أن الأسئلة المذكورة أعلاه تحل المشكلة حقا كما كان لدي هذه المشكلة. الإجابة الحقيقية التي أعتقد أنها التمييز بين النموذج الأولي BSearch و Lfind النموذج الأولي. لنلقي نظرة

 void *bsearch(const void *key, const void *base, size_t nmemb,
              size_t size, int (*compar)(const void *, const void *));

عكس

void *lfind(const void *key, const void *base, size_t *nmemb,
              size_t size, int(*compar)(const void *, const void *));

إذا لاحظت أن المعلمة الثالثة لوظيفة LFIND هي مؤشر إلى نوع Size_T غير (كما في وظيفة BSearch) قيمة نسخ مباشرة.

فقط تأكد من المرور في عنوان الحجم وسوف يكون على ما يرام.

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