Devo passare array o puntatore?

2

Sto scrivendo una libreria C ++ (ma preferisco le funzioni dell'interfaccia in stile C) e una delle funzioni restituisce array di float. Non sono sicuro di dover passare il puntatore o l'array fisso per ottenere questi dati?

// in the library header file
#define MAX_ITEMS_SIZE   1000

int getData(float * data, int &size );

o

int getData(float (&data)[MAX_ITEMS_SIZE], int & size )

Se sto passando il puntatore, il client dovrebbe allocare MAX_ITEMS_SIZE per questo. È un'aspettativa ragionevole ed equa? Passarlo come array forza il client a passare la memoria massima richiesta. Qual è il migliore?

Qualche altro background, MAX_ITEMS_SIZE è il numero massimo di oggetti che possono essere restituiti. In realtà, l'array conterrà meno elementi che vengono riempiti nel parametro size. La funzione restituisce int che è un codice di errore dove zero significa nessun errore.

Il mio obiettivo generale è come restituire i dati che sono array di float in modo facile e comprensibile. Anche se sto usando il C ++, vorrei attenermi alle funzioni dell'interfaccia C in modo che la libreria possa essere usata più ampiamente.

    
posta zadane 28.03.2014 - 15:56
fonte

3 risposte

9

I am writing a C++ library

Quindi perché non usi C ++ invece di C?

   getData(std::vector<float> &data);

è molto probabilmente quello che vuoi. E anche quando programmate in C, fatevi un favore ed evitate di usare limiti fissi come MAX_ITEMS_SIZE , quel numero sarà quasi troppo grande (spreco di risorse) o troppo piccolo (il che significa che il vostro programma potrebbe non funzionare come previsto).

    
risposta data 28.03.2014 - 16:07
fonte
5

In genere vedresti

size_t getDate(float* buffer, size_t bufferSize);

Il valore restituito è la quantità di dati restituiti e si passa alla dimensione effettiva del buffer.

MODIFICA: nei tuoi commenti vuoi avere un codice di errore e rimanere compatibile con C, in tal caso ti suggerisco di fare come Doc brown suggerito:

int getDate(float* buffer, size_t bufferSize, size_t &dataSizeReturned);
    
risposta data 28.03.2014 - 16:03
fonte
2

I miei pochi centesimi ... Dal momento che si desidera mantenere la compatibilità con C, direi ... nessuno dei due. C non ha un concetto di "riferimento" e non consente il passaggio dell'array per riferimento. Inoltre, C ++ ha nome mangling così a meno che la funzione non sia dichiarata con C-linkage, non sarebbe essere possibile chiamarlo da un codice C in modo semplice.

Pertanto, direi che ai fini della compatibilità con C, la firma dovrebbe apparire così:

#ifdef __cplusplus
extern "C" {
#endif

int getData(float *data, int* size)

#ifdef __cplusplus
}
#endif
    
risposta data 28.03.2014 - 21:50
fonte

Leggi altre domande sui tag