مؤشر من عدد صحيح ث / س يلقي تحذير عند استدعاء Lfind
سؤال
أنا أكتب متجه في 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) قيمة نسخ مباشرة.
فقط تأكد من المرور في عنوان الحجم وسوف يكون على ما يرام.