error: 'LcdString' was not declared in this scope

Senhos, Boa Noite

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()

 void setup()
  {
  Wire.begin(10);
  Wire.onReceive(receiveEvent);
  #ifdef Debug
    Serial.begin(9600);
  #endif
  pinMode(PINO_BLINK, OUTPUT);
  LcdInitialise();
  LcdClear();
  LcdString("Iniciando");  
  Timers.onOverTime(OverTime);
  TimerWaitData = Timers.addDog(20000);
  TimerBlink = Timers.addDog(1000);
  TimerBeep = Timers.addDog(2000);
  analogWrite(PINO_BLINK, 128);
  }

Em outras partes do projeto ela é reconhecida normalmente.
Há alguma coisa q possa ser feita? Ou eu que não estou fazendo corretamente.

A função LcdString, está em outro arquivo "tab" na IDE do arduino, mas quando a chamo no setup() ocorre esse erro.

Estas a fazer o #include "outraTab.h" no teu projecto principal?

HugoPT:

A função LcdString, está em outro arquivo "tab" na IDE do arduino, mas quando a chamo no setup() ocorre esse erro.

Estas a fazer o #include "outraTab.h" no teu projecto principal?

Não é uma biblioteca, é uma daquela "orelhas" na IDE.

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.

lcdstring não é um objecto que tens de declarar?

bubulindo:
lcdstring não é um objecto que tens de declarar?

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.

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:

//Prototype functions____________
void clearSerialBuffer(); 
void setupModem();
void dialNumber(char * number);
boolean checkSerialData();
void readIncomingSMS();

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

HugoPT:

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 :smiley:

Eu estava a suspeitar de algo assim também.

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 tem como falhar.

Ou então, escreves as funções todas no início:

void func() {
//Doing nothing really
}

int main() {
//do comething
func();
}

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.

Depois é escolher o que preferes. :slight_smile:

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.

Terá a ver com o C++ em si? Ou alguma opção do compilador?