Pagina 1 di 1

passare enum come risposta ad una funzione

MessaggioInviato: 8 mar 2015, 10:13
da lelerelele
Buona giornata a tutti.

Visto che uso questa tecnica in programmazione lato PC, mi chiedo se posso usarla anche con mplabx sui PIC.


cioè riesco ad avere come risposta ad una funzione un elenco di enum?

tipo questo

sul file header
Codice: Seleziona tutto
typedef enum Errori_Var
{
NessunErrore,RicezioneAckFallito,ByteNull 
}erroriI2C;


routine chiamata
Codice: Seleziona tutto
erroriI2C AcK_Read(void)
{

.......

     if (k==0xFFFF) return erroriI2C.RicezioneAckFallito;
    else erroriI2C.NessunErrore
   
    };



e sulla routine chiamante
Codice: Seleziona tutto
if (AcK_Read()==erroriI2C.RicezioneAckFallito) return 0;


gli errori che mi da sono questi:

Main.c:58: error: (193) not a variable identifier "erroriI2C"
Main.c:58: error: (196) struct/union required
Main.c:58: error: (206) illegal use of void expression

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ovvio che sbaglio qualcosa.

Se mi potete indicare dove sarebbe ottimo.

intanto saluto tutti. O_/

Re: passare enum come risposta ad una funzione

MessaggioInviato: 8 mar 2015, 11:52
da bobina
che compilatore stai usando XC8, XC16 o XC32?

EDIT
Ho fatto dei test con il gcc e così:

Codice: Seleziona tutto
erroriI2C AcK_Read(void)
{
return RicezioneAckFallito;
}

La compilazione va a buon fine, penso che dovrebbe andare anche sui compilatore XC, faccio dei test e ti dico

EDIT2
Sia con XC8 che con XC32, al momento non riesco ad installare XC16 la compilazione va a buon fine.
Quindi per usare un enum basta usare il nome senza il tipodati definito.
Una volta che viene definito un tipodati andrebbe definita una variabile con quel tipo:

erroriI2C varia;

e poi usato con varia.RicezioneAckFallito ma anche questo modo non va, l'unico modo è usarlo diretto

Re: passare enum come risposta ad una funzione

MessaggioInviato: 8 mar 2015, 14:14
da DirtyDeeds
Gli errori dati dal compilatore ti dicono dov'è il problema: un'enumerazione non è una struttura e la scrittura

Codice: Seleziona tutto
erroriI2C.RicezioneAckFallito


non ha senso.

Il codice

Codice: Seleziona tutto
erroriI2C AcK_Read(void)
{

.......

    if (k==0xFFFF) return erroriI2C.RicezioneAckFallito;
    else erroriI2C.NessunErrore
   
};


deve essere modificato in

Codice: Seleziona tutto
erroriI2C AcK_Read(void)
{

.......

    if (k == 0xFFFF)
      return RicezioneAckFallito;
    else 
      return NessunErrore
};


Il codice

Codice: Seleziona tutto
if (AcK_Read()==erroriI2C.RicezioneAckFallito) return 0;


deve diventare

Codice: Seleziona tutto
if (AcK_Read() == RicezioneAckFallito)
  return 0;

Re: passare enum come risposta ad una funzione

MessaggioInviato: 9 mar 2015, 10:44
da lelerelele
bobina ha scritto:che compilatore stai usando XC8, XC16 o XC32?


Hai perfettamente ragione.....non ho messo il compilatore, uso XC8.

bobina ha scritto:Quindi per usare un enum basta usare il nome senza il tipodati definito.
Una volta che viene definito un tipodati andrebbe definita una variabile con quel tipo:

erroriI2C varia;

e poi usato con varia.RicezioneAckFallito ma anche questo modo non va, l'unico modo è usarlo diretto

In effetti ho letto qualcosa in merito ma non sono riuscito ad applicarlo.

DirtyDeeds ha scritto:Gli errori dati dal compilatore ti dicono dov'è il problema: un'enumerazione non è una struttura e la scrittura

Codice: Seleziona tutto
erroriI2C.RicezioneAckFallito


non ha senso.


Ah. quindi se ho capito questa scrittura sarebbe da utilizzare quando la enum fosse in realtà una struct e quindi al suo interno avrei delle variabili, a cui assegnare de valori.

Ottimo! ho realizzato le modifiche indicate da Foto UtenteDirtyDeeds ed il risultato è stato brillante!
Riesco a gestire gli errori in modo ottimale.

Grande. Non avevo dubbi.

Ringrazio Foto UtenteDirtyDeeds e Foto Utentebobina per l'aiuto fornitomi, è sempre utile imparare cose nuove.

saluti.