Estou recebendo essa mensagem quando tento compilar meu projeto
error: 'LcdString' was not declared in this scope
A função LcdString, está em outro arquivo "tab" na IDE do arduino, mas quando a chamo no setup() ocorre esse erro.
As funções LcdInitialise() e LcdClear() estão na mesma "tab" que a LcdString()
Não é uma biblioteca, é uma daquela "orelhas" na IDE.
Nao interessa tem de ser incluido na mesma senao o compilador nao tem forma de saber que essa funçao existe no programa.
Certifica-te que a inclui com "xxx.x " e nao com <xxx.x>
Outra coisa que te podes ter esquecido é nao teres criado as prototype Functions dentro desse header file
Assim ele nao tem forma de a encontrar se a chamares antes de a implementares.
Não, tão todas estão em outra tab da IDE, por isso to intrigado porque algumas são reconhecidas e outras não.
Nao querendo ser chato mas tens a certeza que tens as Prototype Functions declaradas?
É que se nao estiverem é mesmo isso que acontece.Tenta declarar as funcoes que estas a implementar nessa TAB para o compilador saber que elas existem antes de serem usadas.
A IDE do arduino faz isso automaticamente mas se adicionares uma parte do programa noutra TAB nao o faz!
Nessa TAB tens de declarar as funçoes que la implementas algo assim:
Depois mais abaixo é que fazes a tua implementaçao da funçao:
void dialNumber(char * number)
{
Serial.print("ATD"); //ATD is the command to Dial a Number
Serial.print(number); //Print the Number
Serial.write(0x3b); //Put a ; at the end
Serial.write(0x0d); // Give an Enter to confirm the command
delay(modemDelay);
}
Se eu remover as prototype functions do meu codigo e tentar correr algumas funçoes que la existem dao erro tambem
Tem tudo a ver com a ordem das funçoes.O que se passa é que tu estas a dizer para executar uma funçao que ele inda nao sabe que existe pois no momento da compilaçao a funçao inda nao foi lida e pára a compilaçao dando erro que a funçao nao é visivel.
As Prototype functions devem ser escritas logo no inicio do programa(neste caso no teu ficheiro adicional) para que no momento da compilaçao ele passe a saber que deve contar com essas funçoes.Se nao as criares ele só sabera que elas existem quando correr todo o teu codigo.
Um pouco de info: http://opencbp.sourceforge.net/en_US.ISO8859-1/books/opencbook/func.prototypes.html
All identifiers in C need to be declared before they are used. This is true for functions as well as variables. For functions the declaration needs to be before the first call of the function. A full declaration includes the return type and the number and type of the arguments. This is also called the function prototype
Não, tão todas estão em outra tab da IDE, por isso to intrigado porque algumas são reconhecidas e outras não.
Nao querendo ser chato mas tens a certeza que tens as Prototype Functions declaradas?
É que se nao estiverem é mesmo isso que acontece.Tenta declarar as funcoes que estas a implementar nessa TAB para o compilador saber que elas existem antes de serem usadas.
Agora coloquei a Prototype Function do LcdString() no inicio do código e compilou, o que queria entender é o porque de algumas funções serem reconhecidas e outras não. Será que o compilador criou algumas e deixa de fazer outras? Pois precisei apenas colocar a da LcdString, a LcdInitialise() não, será que seria que a LcdInitialise() não tem parâmetros?
Obrigado HUGOPT
Normalmente ou escreves todas as funções por baixo da Main e declaras as funções todas no início do ficheiro:
void func();//Isto diz ao compilador que existe uma função com este nome e tipo definida mais abaixo...
int main() {
//do something
func(); //o compilador viu que esta função está definida algures, logo sabe que depois apenas tem de fazer um salto para ela.
}
void func() { //quando esta função for chamada "salta" para aqui.
//Doing nothing really
}
E assim não é garantido que funcione. Principalmente se tiveres funções encadeadas.
Nota que o Main é equivalente ao setup e loop.
Outra solução, que me agrada mais ao fazer projectos "grandes" ou fora do Arduino... é criar ficheiros de código separados e não declarar funções nenhumas no ficheiro principal. Assim serei obrigado a declarar as funções no ficheiro .h que quero incluir no ficheiro principal e estes problemas desaparecem.
No Arduino, podes sempre criar bibliotecas para teres a mesma funcionalidade que indiquei e um sketch limpo. Com C++ existem mais mecanismos para conseguires isto de maneira eficiente e "bonita" que só com C puro.
Esta questao das prototype functions é mascarada na IDE e leva os utilizadores a pensar que as funçoes podem ser criadas onde se desejar.Se apenas se usar um skeetch sem ficheiros adicionais pode-se criar as funçoes em qualquer parte do codigo :~ inda nao tentei descobrir como mas ja me perguntei como ele o faz.
No entanto isto pode levar os utilizadores a quando querem algo mais avançado a nunca suspeitar disso pois antes nunca precisaram de ter atençao a isso.Para quem programa em C fora da ide do arduino o uso das prototypes é uso comum e necessario.