Cosa devo restituire da una funzione?

1

Ho una funzione in linguaggio C che accetta 3 matrici come argomenti; Esegue la moltiplicazione della matrice delle prime 2 matrici e memorizza il risultato nella 3a.

La mia domanda è cosa devo restituire dalla funzione. Dovrei restituire la matrice risultante da sola (piuttosto il puntatore ad essa) in modo che le chiamate di funzione possano essere concatenate insieme in questo modo:

display_matrix(multiply_matrix(A, B, C));

O dovrei restituire 0 o 1 in base al fatto che l'operazione abbia avuto successo o meno (le dimensioni errate potrebbero restituire un errore)? In questo caso la linea mostrata sopra sarebbe simile a questa.

multiply_matrix(A, B, C);
display_matrix(C);

Quindi, quale sarebbe il modo migliore per farlo? O è solo una questione di scelta?

    
posta Nijraj Gelani 10.05.2017 - 17:31
fonte

3 risposte

9

Poiché la tua operazione può fallire, hai bisogno di un qualche modo per rappresentarlo. Il design di concatenamento è piacevole, ma è possibile solo se non è necessario restituire altro.

Le opzioni sono:

  • restituisce i codici di successo o di fallimento

    • con: in questo caso ovviamente non puoi usare la funzione concatenando lo stile
    • con: devi anche aggiungere il codice al test con i test e la gestione degli errori
    • con: qualsiasi operazione il cui risultato non è controllato può lasciare il parametro out in uno stato imprevisto
    • pro: se alcune operazioni non riescono, sai esattamente dove è successo (supponendo che tu non copi e incolli erroneamente il tuo errore nella gestione di boilerplate ...)

    Il tuo codice di esempio dovrebbe in realtà apparire come:

    if ((rc=multiply_matrix(A, B, C)) != MAT_OK) {
      display_matrix_error(rc, A, B);
    } else {
      display_matrix(C);
    }
    
  • usa un equivalente di matrice di NaN per rappresentare i calcoli falliti e passa semplicemente attraverso la catena di funzioni in silenzio.

    • pro: in questo caso si ottiene la bella funzione concatenando lo stile
    • pro: non è necessario un controllo esplicito degli errori ovunque
    • con: non puoi dire quale fase ha avuto esito negativo se una lunga catena di calcoli ha generato una matrice non valida

    Il tuo codice di esempio sarà davvero come hai postato:

    display_matrix(multiply_matrix(A, B, C));
    

    dove la funzione di visualizzazione deve sapere come gestire un input non valido.

risposta data 10.05.2017 - 18:53
fonte
7

Numero di problemi qui. Lasciatemi stuzzicare.

Per prima cosa, non restituire il risultato con un parametro out e un ritorno. Questo è solo confuso. Scegline uno.

In secondo luogo, c non ha alcuna gestione delle eccezioni . Invece le funzioni c restituiscono errori o le gestiscono / evitino in modo che non vengano salvati errori. Se scegli di restituire i tuoi risultati, allora hai bisogno di un metodo efficace per restituire sempre qualcosa di significativo.

Terzo, se restituisci lo stato di errore e restituisci il risultato in un parametro out, documentalo chiaramente.

    
risposta data 10.05.2017 - 18:29
fonte
1

In C non è raro restituire i puntatori. Restituire un puntatore nullo potrebbe significare un fallimento. Inoltre, la restituzione di un puntatore evita una quantità potenzialmente elevata di copia dei dati.

Quindi puoi avere entrambi i ritorni degli errori e (forse un po 'limitato, a seconda delle altre scelte che fai) il concatenamento delle funzioni. (Notare che le funzioni della matrice dovrebbero accettare anche i parametri di input come puntatori).

Il concatenamento delle funzioni dovrebbe occuparsi di ottenere un puntatore nullo sull'input. Ma questo potrebbe essere trattato in modo analogo ai valori NAN per l'aritmetica in virgola mobile. Se un ptr null viene passato a display_matrix() , verrà visualizzato un messaggio "Not a Matrix". Se multiply_matrix() ha ricevuto un valore null, se restituisce un valore nullo.

Infine, se hai bisogno di più informazioni diagnostiche che solo "non riuscito", potresti utilizzare un approccio come C errno che fornisce un motivo di errore.

    
risposta data 10.05.2017 - 23:30
fonte

Leggi altre domande sui tag