Errore 119.1 function declared implicit int

  • Lello Guidi
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
12 Anni 11 Mesi fa #1 da Lello Guidi
Errore 119.1 function declared implicit int è stato creato da Lello Guidi
Salve,
il compilatore mi da errore 119.1 function declared implicit int alla riga della funzione ""Scompone_dato", se invece la variabile "numero" la dichiaro all'inizio il compilatore mi da anche errore 96. conflicting declarations for variable "_numero".
Non riesco a capire dove sbaglio, ho allegato il codice.
Come processore uso un 16F877A montato su Freedom II.
Il compilatore e' il Hi-TECH 9.83 e l'MPLAB IDE 8.85.
Grazie per un consiglio
Lello
Code:
//************************************************* // modulo: main_g.c // autore: egi // data: 21 maggio 2012 // Descrizione: mostro il valore di tensione letto dal AD623 // collegato su AN3 sul display LCD. // La funzione "Scompone_dati" serve per scrivere su eeprom esterna // picmicro: PIC16F877A // clock: 20MHz //************************************************ #define _LEGACY_HEADERS #include <htc.h> #define PIC_CLK 20000000 // quarzo a 20MHz __CONFIG (HS & WDTDIS & PWRTEN & BORDIS & LVPDIS & DUNPROT & WRTEN & DEBUGDIS & UNPROTECT); #include "settings.h" #include "delay.c" #include "lcd.c" #include "i2c.c" #include "eeprom_external.c" unsigned int numero=0; unsigned int tensione=0; // valore convertito in tensione unsigned int ByteH=0; // Byte Alto unsigned int ByteL=0; // Byte Basso unsigned char deviceid = 0x00; // Indirizzo del dispositivo eeprom esterna unsigned char address= 0x00; // indirizzo di partenza della cella della eeprom // Scompone il numero in due Byte void Scompone_Dato(unsigned int numero) { // il byte basso (BL) sono gli 8 bit più a destra del valore a 16 bit // il byte alto (BH) sono gli 8 bit più a sinistra del valore a 16 bit // anche se BH e BL sono valori ad 8 bit, li devo comunque definire come se fossero a 16 bit ByteH = numero >> 8; // sposto il valore di 8 bit a destra ByteL = numero & 0xFF; // metto a zero gli 8 bit più a sinistra cicalino=ON; DelayMs(250); cicalino=OFF; } // Funzione di salvataggio del numero nelle variabili ByteH e ByteL su eeprom void Salva_Dati() { I2cInitMaster(); // avvio il modulo MSSP in modalità I2C master //----------------------------------------- // scrittura del dato nella memoria eeprom //----------------------------------------- eee_write_byte(deviceid, address, ByteH); // scrivo la parte alta DelayMs(5); // ogni byte ci mette circa 5mS per essere scritto //address++; // incremento di 1 l'indirizzo della cella eee_write_byte(deviceid, address+1, ByteL); // scrivo la parte bassa nella cella successiva DelayMs(5); // ogni byte ci mette circa 5mS per essere scritto // mi posiziono per scrivere il valore numerico LCD_GOTO(1,1); // scrivo sul display i valori di BH e di BL LCD_PUTS("BL:"); LCD_PUTUN(ByteL); LCD_PUTS(" BH:"); LCD_PUTUN(ByteH); cicalino=ON; DelayMs(250); cicalino=OFF; I2cStop(); //fine trasmissione } // Funzione di lettura dei dati nelle variabili ByteH e ByteL void Legge_Dati( ) { I2cInitMaster(); // avvio il modulo MSSP in modalità I2C master //--------------------------------------- // lettura delle celle di memoria eeprom //--------------------------------------- ByteH = eee_read_byte(deviceid, address); // leggo il valore contenuto nella cella 1 //address--; // decrementa di 1 l'indirizzo della cella ByteL = eee_read_byte(deviceid, address+1); // leggo il valore contenuto nella cella precedente //address--; // decrementa di 1 l'indirizzo della cella // ricompongo il numero a 16 bit partendo dai due valori ByteL e ByteH unsigned int numero_ricomposto = 0; // numero iniziale numero_ricomposto = ByteL | (ByteH<<8); cicalino=ON; DelayMs(250); cicalino=OFF; I2cStop(); //fine trasmissione } //================================== // Programma Principale //================================== void main(void) { extern int numero; // valore da convertire in volt BL=1; // abilito retroilluminazione LCD dove presente LCD_INIT(); // inizializzo l'LCD DelayMs(100); // piccolo ritardo iniziale LCD_CLEAR(); // ripulisco il display LCD_GOTO(2,1); // posiziono il cursore sull'LCD: riga2, colonna1 LCD_PUTS("Tensione :"); while(True) { // do un piccolo ritardo per permettere a CHOLD di caricarsi correttamente, // come spiegato nella parte introduttiva di questo capitolo DelayUs(20); ADGO=1; // avvio la conversione // ciclo di continuo fino a che ADGO non diventa zero, segnalandomi la fine conversione while(ADGO) {continue;} // mi calcolo il valore numerico restituito dal convertitore // tenendo conto che ho scelto la giustificazione a sinistra numero=ADRESL + (ADRESH<<8); Scompone_dato(numero); Salva_Dati(); Legge_Dati(); // mi posiziono per scrivere il valore numerico LCD_GOTO(1,1); // scrivo sul display i valori di BH e di BL LCD_PUTS("BL:"); LCD_PUTUN(ByteL); LCD_PUTS(" BH:"); LCD_PUTUN(ByteH); // scrivo sul display i valori di BH e di BL //LCD_PUTUN(valore); // cancello parte restante, questo per evitare che mi trascino caratteri sull'LCD // quando da un numero a più cifre passo a un numero con meno cifre LCD_PUTS(" "); tensione=numero*5; // valore in millivolt, ricordiamo che ogni bit vale circa 5mV LCD_GOTO(2,11); LCD_PUTUN(tensione/1000); // parte intera dei volts LCD_PUTS("."); LCD_PUTUN(tensione%1000); // parte decimale LCD_PUTS("V "); } }

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
12 Anni 11 Mesi fa - 12 Anni 11 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Errore 119.1 function declared implicit int
perche' definisci la variabile come extern?
Code:
extern int numero;

Numero la definisci come int e nella funzione la dichiari unsigned int.
Non permettere casting inutili.

le variabili byte definiscile come unsigned char e non come int.

per scrivere un int in un byte (ovvero unsigned char) fai uso del casting.
Code:
mio_char = (unsigned char) mio_int

Saluti,

Mauro
Ultima Modifica 12 Anni 11 Mesi fa da Mauro Laurenti.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Lello Guidi
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
12 Anni 11 Mesi fa - 12 Anni 11 Mesi fa #3 da Lello Guidi
Risposta da Lello Guidi al topic Re: Errore 119.1 function declared implicit int

Mauro Laurenti ha scritto: perche' definisci la variabile come extern?

Code:
extern int numero;

Per renderla visibile a tutte le funzioni.

Numero la definisci come int e nella funzione la dichiari unsigned int.
Non permettere casting inutili.

Cosa significa "Casting", so il significato legato alla moda ma nei listati e' un termine nuovo e mi prendi in contropiede

le variabili byte definiscile come unsigned char e non come int.

per scrivere un int in un byte (ovvero unsigned char) fai uso del casting.
Code:
mio_char = (unsigned char) mio_int

Saluti,

Mauro

Grazie dell'aiuto, provvedo alle modifiche.
Saluti
Lello

Ultima Modifica 12 Anni 11 Mesi fa da Lello Guidi. Motivo: errore ortografico

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Lello Guidi
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
12 Anni 11 Mesi fa #4 da Lello Guidi
Risposta da Lello Guidi al topic Re: Errore 119.1 function declared implicit int
Dopo fatte le correzioni, quando lo compilo mi da sempre e solo errore "119.1 function declared implicit int" alla riga della funzione "Scompone_dato".
Il listato modificato e' il seguente:
Code:
//************************************************* // modulo: main_g.c // autore: egi // data: 21 maggio 2012 // Descrizione: mostro il valore di tensione letto dal AD623 // collegato su AN3 sul display LCD. // La funzione "Scompone_dati" serve per scrivere su eeprom esterna // picmicro: PIC16F877A // clock: 20MHz //************************************************ #define _LEGACY_HEADERS #include <htc.h> #define PIC_CLK 20000000 // quarzo a 20MHz __CONFIG (HS & WDTDIS & PWRTEN & BORDIS & LVPDIS & DUNPROT & WRTEN & DEBUGDIS & UNPROTECT); #include "settings.h" #include "delay.c" #include "lcd.c" #include "i2c.c" #include "eeprom_external.c" int numero=0; unsigned int tensione=0; // valore convertito in tensione unsigned char ByteH=0; // Byte Alto unsigned char ByteL=0; // Byte Basso unsigned char deviceid = 0x00; // Indirizzo del dispositivo eeprom esterna unsigned char address= 0x00; // indirizzo di partenza della cella della eeprom // Scompone il numero in due Byte void Scompone_Dato(int numero) { // il byte basso (BL) sono gli 8 bit più a destra del valore a 16 bit // il byte alto (BH) sono gli 8 bit più a sinistra del valore a 16 bit // anche se BH e BL sono valori ad 8 bit, li devo comunque definire come se fossero a 16 bit ByteH = numero >> 8; // sposto il valore di 8 bit a destra ByteL = numero & 0xFF; // metto a zero gli 8 bit più a sinistra cicalino=ON; DelayMs(250); cicalino=OFF; } // Funzione di salvataggio del numero nelle variabili ByteH e ByteL su eeprom void Salva_Dati() { I2cInitMaster(); // avvio il modulo MSSP in modalità I2C master //----------------------------------------- // scrittura del dato nella memoria eeprom //----------------------------------------- eee_write_byte(deviceid, address, ByteH); // scrivo la parte alta DelayMs(5); // ogni byte ci mette circa 5mS per essere scritto //address++; // incremento di 1 l'indirizzo della cella eee_write_byte(deviceid, address+1, ByteL); // scrivo la parte bassa nella cella successiva DelayMs(5); // ogni byte ci mette circa 5mS per essere scritto // mi posiziono per scrivere il valore numerico LCD_GOTO(1,1); // scrivo sul display i valori di BH e di BL LCD_PUTS("BL:"); LCD_PUTUN(ByteL); LCD_PUTS(" BH:"); LCD_PUTUN(ByteH); cicalino=ON; DelayMs(250); cicalino=OFF; I2cStop(); //fine trasmissione } // Funzione di lettura dei dati nelle variabili ByteH e ByteL void Legge_Dati( ) { I2cInitMaster(); // avvio il modulo MSSP in modalità I2C master //--------------------------------------- // lettura delle celle di memoria eeprom //--------------------------------------- ByteH = eee_read_byte(deviceid, address); // leggo il valore contenuto nella cella 1 //address--; // decrementa di 1 l'indirizzo della cella ByteL = eee_read_byte(deviceid, address+1); // leggo il valore contenuto nella cella precedente //address--; // decrementa di 1 l'indirizzo della cella // ricompongo il numero a 16 bit partendo dai due valori ByteL e ByteH unsigned int numero_ricomposto = 0; // numero iniziale numero_ricomposto = ByteL | (ByteH<<8); cicalino=ON; DelayMs(250); cicalino=OFF; I2cStop(); //fine trasmissione } //================================== // Programma Principale //================================== void main(void) { settings(); BL=1; // abilito retroilluminazione LCD dove presente LCD_INIT(); // inizializzo l'LCD DelayMs(100); // piccolo ritardo iniziale LCD_CLEAR(); // ripulisco il display LCD_GOTO(2,1); // posiziono il cursore sull'LCD: riga2, colonna1 LCD_PUTS("Tensione :"); while(True) { // do un piccolo ritardo per permettere a CHOLD di caricarsi correttamente, // come spiegato nella parte introduttiva di questo capitolo DelayUs(20); ADGO=1; // avvio la conversione // ciclo di continuo fino a che ADGO non diventa zero, segnalandomi la fine conversione while(ADGO) {continue;} // mi calcolo il valore numerico restituito dal convertitore // tenendo conto che ho scelto la giustificazione a sinistra numero=ADRESL + (ADRESH<<8); Scompone_dato(int numero); Salva_Dati(); Legge_Dati(); // mi posiziono per scrivere il valore numerico LCD_GOTO(1,1); // scrivo sul display i valori di BH e di BL LCD_PUTS("BL:"); LCD_PUTUN(ByteL); LCD_PUTS(" BH:"); LCD_PUTUN(ByteH); // scrivo sul display i valori di BH e di BL //LCD_PUTUN(valore); // cancello parte restante, questo per evitare che mi trascino caratteri sull'LCD // quando da un numero a più cifre passo a un numero con meno cifre LCD_PUTS(" "); tensione=numero*5; // valore in millivolt, ricordiamo che ogni bit vale circa 5mV LCD_GOTO(2,11); LCD_PUTUN(tensione/1000); // parte intera dei volts LCD_PUTS("."); LCD_PUTUN(tensione%1000); // parte decimale LCD_PUTS("V "); } }

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
12 Anni 11 Mesi fa #5 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Errore 119.1 function declared implicit int
Ciao,

il problema potrebbe essere legato al fatto che tu hai una variabile numero globale e poi dichiari la variabile numero anche nella funzione coprendo la principale.

Prova a chiamare la variabile numero della funzione, come valore.

Saluti,

Mauro

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiStefA

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi