Definizione di una funzione
- Kopernico
- Autore della discussione
- Visitatori
-
12 Anni 8 Mesi fa - 12 Anni 8 Mesi fa #1
da Kopernico
Definizione di una funzione è stato creato da Kopernico
Ciao a tutti
Avviso subito i...naviganti che mi sono avvicinato da poco al linguaggio C.
Del resto il mio avatar mostra chiaramente un micro 'chip' senza ali !!!
Il mio problema e' che in un programma main.c devo chiamare una funzione :
Send(Address);
dove Address e' stata dichiarata in setting.h come :
int Address=255;
Sempre in setting.h e' stata messa anche la funzione da eseguire :
void Send(unsigned int Address)
{
RCIE=0; // interrupt di ricezione su seriale disattivato
EN=1;//abilito la trasmissione RS485
printf("%d \n",Address);
DelayMs(3);//tempo di attesa per terminare la trasmissione dei dati
EN=0;//disabilito la trasmissione RS485
RCIE=1; // interrupt di ricezione su seriale attivato
}
Quando compilo da MPLAB IDE, il risultato che mi restituisce e':
Warning [361] C:\....\settings.h; 124.1 function declared implicit int
Error [987] C:....\stdio.h; 207.37 arguments redeclared
Error [1098] C:\Program Files\HI-TECH Software\PICC\9.83\include\stdio.h; 207.37 conflicting declarations for variable "printf" (C:\.....\settings.h:124)
Warning [344] C:\....\usart.c; 23.7 non-void function returns no value
a parte i due warning, dove sbaglio sbaglio?
Grazie
Avviso subito i...naviganti che mi sono avvicinato da poco al linguaggio C.
Del resto il mio avatar mostra chiaramente un micro 'chip' senza ali !!!
Il mio problema e' che in un programma main.c devo chiamare una funzione :
Send(Address);
dove Address e' stata dichiarata in setting.h come :
int Address=255;
Sempre in setting.h e' stata messa anche la funzione da eseguire :
void Send(unsigned int Address)
{
RCIE=0; // interrupt di ricezione su seriale disattivato
EN=1;//abilito la trasmissione RS485
printf("%d \n",Address);
DelayMs(3);//tempo di attesa per terminare la trasmissione dei dati
EN=0;//disabilito la trasmissione RS485
RCIE=1; // interrupt di ricezione su seriale attivato
}
Quando compilo da MPLAB IDE, il risultato che mi restituisce e':
Warning [361] C:\....\settings.h; 124.1 function declared implicit int
Error [987] C:....\stdio.h; 207.37 arguments redeclared
Error [1098] C:\Program Files\HI-TECH Software\PICC\9.83\include\stdio.h; 207.37 conflicting declarations for variable "printf" (C:\.....\settings.h:124)
Warning [344] C:\....\usart.c; 23.7 non-void function returns no value
a parte i due warning, dove sbaglio sbaglio?
Grazie
Ultima Modifica 12 Anni 8 Mesi fa da Kopernico.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Kopernico
- Autore della discussione
- Visitatori
-
12 Anni 8 Mesi fa #2
da Kopernico
Risposta da Kopernico al topic Re: Definizione di una funzione
Ciao
il problema e' che tu (io) stai cercando di chiamare una variabile 'Address' che si trova in un altro file.
Dovresti utilizzare il comando 'extern' in modo da avvisare il compilatore che deve effettuare il link con il file main.c o piu' semplicemente puoi creare un file send.c dentro il quale metti la tua funzione così:
void Send(unsigned char Address)
{
RCIE=0; // interrupt di ricezione su seriale disattivato
EN=1;//abilito la trasmissione RS485
printf("%d \n",Address);
DelayMs(3);//tempo di attesa per terminare la trasmissione dei dati
EN=0;//disabilito la trasmissione RS485
RCIE=1; // interrupt di ricezione su seriale attivato
}
Nota la variante: l'argomento di send non viene identificato come una variabile, ma come un testo.
Ora puoi includere il file all'inizio del programma main.c (#include "send.c")
e utilizzarla nel programma chiamandola con
send(Address);
dove Address ha il valore che vuoi.
Qualcuno non vede spuntare una piccola ala ?

Morale: guarda, chiediti perche' e impara!!!
il problema e' che tu (io) stai cercando di chiamare una variabile 'Address' che si trova in un altro file.
Dovresti utilizzare il comando 'extern' in modo da avvisare il compilatore che deve effettuare il link con il file main.c o piu' semplicemente puoi creare un file send.c dentro il quale metti la tua funzione così:
void Send(unsigned char Address)
{
RCIE=0; // interrupt di ricezione su seriale disattivato
EN=1;//abilito la trasmissione RS485
printf("%d \n",Address);
DelayMs(3);//tempo di attesa per terminare la trasmissione dei dati
EN=0;//disabilito la trasmissione RS485
RCIE=1; // interrupt di ricezione su seriale attivato
}
Nota la variante: l'argomento di send non viene identificato come una variabile, ma come un testo.
Ora puoi includere il file all'inizio del programma main.c (#include "send.c")
e utilizzarla nel programma chiamandola con
send(Address);
dove Address ha il valore che vuoi.
Qualcuno non vede spuntare una piccola ala ?



Morale: guarda, chiediti perche' e impara!!!
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Mauro Laurenti
-
- Moderatore
-
Less
Di più
12 Anni 8 Mesi fa #3
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Definizione di una funzione
...un aquilotto! 
ma il file setting.h non e' incluso nel file main.c?
#include "send.c" e' posto dopo #include "setting.h"
Non usare lo stesso nome di variabile Address sia per una variabile globale che variabile locale per la funzione Send.
Non e' una buona pratica di programmazione a causa del differente scope delle variabili.
Saluti,
Mauro

ma il file setting.h non e' incluso nel file main.c?
#include "send.c" e' posto dopo #include "setting.h"
Non usare lo stesso nome di variabile Address sia per una variabile globale che variabile locale per la funzione Send.
Non e' una buona pratica di programmazione a causa del differente scope delle variabili.
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Kopernico
- Autore della discussione
- Visitatori
-
12 Anni 8 Mesi fa #4
da Kopernico
Risposta da Kopernico al topic Re: Definizione di una funzione
:lol: :lol: :lol:
in ordine:
Si
Si
Ok, ma e' incredibile come mi manca la fantasia quando c'e' da dare un nome alle variabili!
Credo di essere stato colpito da pigrizia acuta.
Ma la variabile locale della funzione fa definita nel setting.h?
...eccolo, un altro attacco di pigrizia...
in ordine:
Si
Si
Ok, ma e' incredibile come mi manca la fantasia quando c'e' da dare un nome alle variabili!
Credo di essere stato colpito da pigrizia acuta.
Ma la variabile locale della funzione fa definita nel setting.h?
...eccolo, un altro attacco di pigrizia...
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Ifrit_Prog
-
- Premium Utente
-
Less
Di più
- Messaggi: 124
- Ringraziamenti ricevuti 7
12 Anni 8 Mesi fa - 12 Anni 8 Mesi fa #5
da Ifrit_Prog
Risposta da Ifrit_Prog al topic Re: Definizione di una funzione
Ciao Kopernico 
Allora, io non ho ben capito quale sia il tuo problema... in qualsiasi caso provo a rispondere dal poco che ho capito:
Posso consigliarti di chiamare gli argomenti delle funzioni con nomi del tipo arg_1, arg_2, etc etc... e subito dopo ci fai un blocco di commento in cui descrivi cosa queste variabili devono contenere....
Ovviamente è una cattiva abitudine utilizzare questo stile, è preferibile dare nomi con un senso alle variabili, ma comunque è una possibilità
Apettiamo i sorgenti ^^ buon lavoro

Allora, io non ho ben capito quale sia il tuo problema... in qualsiasi caso provo a rispondere dal poco che ho capito:
- Warning [361] C:\....\settings.h; 124.1 function declared implicit int
Senza tutti i file sotto mano è difficile dire perche' è uscito questo warning... indi ti invito a postare i file, o usare siti come pastebin.com/ per incollarci tutto il codice - Error [987] C:....\stdio.h; 207.37 arguments redeclared
Mai uscito un errore simile.. sopratutto in una libreria standard... forse hai chiamato una variabile globale con lo stesso nome di una usata in questa libreria, qppena ho tempo vedo la riga della libreria e ti dico - Error [1098] C:\Program Files\HI-TECH Software\PICC\9.83\include\stdio.h; 207.37 conflicting declarations for variable "printf" (C:\.....\settings.h:124)
Idem come il problema numero uno, postaci i sorgenti - Warning [344] C:\....\usart.c; 23.7 non-void function returns no value
credo che te abbia usato la funzione send(...) su una riga in cui si richiede l'emissione di un valore di tale funzione... ad esempio:Code:... if ( send( 0x15) ) { .... } ...
Code:... int cnt_1 = 10 * send( cnt_0 ) ...
Posso consigliarti di chiamare gli argomenti delle funzioni con nomi del tipo arg_1, arg_2, etc etc... e subito dopo ci fai un blocco di commento in cui descrivi cosa queste variabili devono contenere....
Ovviamente è una cattiva abitudine utilizzare questo stile, è preferibile dare nomi con un senso alle variabili, ma comunque è una possibilità
Apettiamo i sorgenti ^^ buon lavoro

Ultima Modifica 12 Anni 8 Mesi fa da Ifrit_Prog.
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, StefA
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- Strana anomalia LT lib module_EEPROM
- da marcoilgrande
-
- Nuova versione Kicad 9
- da Mauro Laurenti
-
- MODULO GSM SIM900A
- da embedded
-
- Freedom III e compilazioni fallite
- da Black
-
- LTerminal - nuove funzioni
- da Mauro Laurenti