Restituzione di più valori da una funzione c mediante puntatori; stile della lista dei parametri

3

Che cos'è un buono stile di programmazione per scrivere funzioni in linguaggio C e chiamate di funzioni a funzioni che restituiscono puntatori?

Ad esempio, se ho una funzione my_function che restituisce due interi attraverso gli argomenti del puntatore. Come dovrei chiamare questa funzione, in modo che sia facile per una persona che non ha familiarità con il mio codice, vedere che restituisce due valori?

E come dovrei scrivere la definizione della funzione?

Ad esempio, potrei sempre inserire i valori di ritorno nella lista dei parametri, e quando chiamo la funzione, potrei aggiungere dello spazio in più per separare gli argomenti di input dai valori di ritorno.

Inoltre, per la definizione della funzione, potrei aggiungere una riga vuota con un commento tra i parametri di input e i valori di ritorno. Ad esempio:

void my_function(
   int a,
   int b,
/* return values */
   int *c,
   int *d)
{
   /* do something */
}

int main()
{
   int a = 1;
   int b = 2;
   int c;
   int d;

   my_function(a,b,   &c, &d);
}
    
posta Håkon Hægland 02.03.2015 - 10:52
fonte

2 risposte

4

Potresti notare il flusso di informazioni nella definizione della funzione:

void my_function(
   /*  in */ int  a,
   /*  in */ int  b,
   /* out */ int* c,
   /* out */ int* d)
{
   /* do something */
}

In questo modo, è facile vedere cosa succede. Se esporti questa funzione, includerai anche i commenti nel prototipo in modo che tutti possano vedere la direzione del flusso di informazioni.

Inoltre, aderisci a uno stile nelle tue funzioni. Ad esempio, se scrivi i valori di ritorno sempre alla fine della lista dei parametri e qualcuno ti vede chiamare

whatever(p1, p2, p3, &p4);

uno saprà che c'è un'alta probabilità che p4 sia il valore di ritorno della tua funzione.

    
risposta data 02.03.2015 - 11:05
fonte
3

Vorrei usare uno strumento per documentare il codice. Per esempio. con doxygen puoi scrivere:

/**
 *  \brief Performs something and stores result in \a c and \a d
 *
 *  \param[in]  a ...
 *  \param[in]  b ...
 *  \param[out] c ...
 *  \param[out] d ...
 *
 *  Detailed description here.
 */
void my_function(int a, int b, int *c, int *d)
{
   /* do something */
}

Il blocco dei commenti speciali ha una struttura semplice (è un blocco di commenti C con alcuni segni aggiuntivi). Quindi è facile da leggere e, allo stesso tempo, consente di estrarre la documentazione.

Ordinare i parametri della funzione in modo che tutti i parametri di solo input siano prima che qualsiasi parametro di output sia abbastanza comune in C ma non è l'unica opzione (ad esempio memcpy ).

In ogni caso l'aspetto più importante è uno stile di codice uniforme.

Come regola generale, cerco di evitare i parametri OUT ogni volta possibile.

Considera anche che:

  • nello standard C ci sono dei precedenti per restituire le strutture che contengono tutti i risultati (le funzioni div / ldiv / C99 lldiv da <stdlib.h> );
  • la miscelazione del valore di ritorno e dei parametri di ritorno è solitamente l'opzione meno pulita (ma avere una funzione che restituisce uno stato e restituire i dati tramite i parametri OUT è ragionevole in C).

Parzialmente correlato:

risposta data 02.03.2015 - 13:16
fonte

Leggi altre domande sui tag