puntatore dalla intero w / o di avvertimento quando si chiama fusione lfind

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

  •  16-09-2019
  •  | 
  •  

Domanda

Sto scrivendo un vettore in funzione di C. La CVectorSearch usa bsearch se è ordinato, e lfind se è non differenziati. Perché mi appare il messaggio di avviso "Assegnazione fa puntatore da interi senza un cast" quando sto chiamando lfind? Sembra funzionare bene anche quando si utilizza 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;
}

modifica Ora che ho incluso search.h sto ottenendo:

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

Il programma è ancora funziona correttamente, però.

È stato utile?

Soluzione

Il terzo argomento di lfind () è un puntatore a size_t non int come si sta passando. Il tipo size_t può essere di dimensioni diverse rispetto int su alcune architetture (particolarmente x86-64) ed è anche senza segno. È necessario cambiare il tipo di variabile length.

Altri suggerimenti

È stato incluso <search.h> che definisce lfind? Se una funzione viene chiamata, senza un prototipo, il compilatore può assumere restituisce int.

Non credo che queste domande veramente risolvere il problema come ho avuto questo problema. La vera risposta a mio avviso è la distinzione tra prototipo e bsearch prototipo lfind. Diamo un'occhiata takea

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

Versus

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

Se si noterà che il terzo parametro della funzione lfind è un puntatore a un tipo size_t non (come nella funzione bsearch) un valore diretto copiato.

Basta fare in modo che si passa l'indirizzo della dimensione e andrà tutto bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top