I'm working on a big(is) project and decided to move a load of definitions, constants and functions to a separate file in the same sketch folder expecting the IDE to just link them all together when compiled but am having a problem with a function with an optional parameter.
This single file sketch compiles without problem...
#include <avr/pgmspace.h>
byte cableNum = 0; // Cable number, used to index into PROGMEM cable arrays
#define cableMax 12 // MAX value for cableNum
// Cable Name Strings
prog_uchar cableText00[] PROGMEM = {"UNKNOWN00 \0"};
prog_uchar cableText01[] PROGMEM = {"BD SD01 \0"};
prog_uchar cableText02[] PROGMEM = {"BD SD03 \0"};
prog_uchar cableText03[] PROGMEM = {"UNKNOWN03 \0"};
prog_uchar cableText04[] PROGMEM = {"UNKNOWN04 \0"};
prog_uchar cableText05[] PROGMEM = {"UNKNOWN05 \0"};
prog_uchar cableText06[] PROGMEM = {"UNKNOWN06 \0"};
prog_uchar cableText07[] PROGMEM = {"UNKNOWN07 \0"};
prog_uchar cableText08[] PROGMEM = {"UNKNOWN08 \0"};
prog_uchar cableText09[] PROGMEM = {"UNKNOWN09 \0"};
prog_uchar cableText10[] PROGMEM = {"UNKNOWN10 \0"};
prog_uchar cableText11[] PROGMEM = {"UNKNOWN11 \0"};
//Message String Pointer Table (Needed to access above Message Strings in PROGMEM)
prog_uchar *string_table[cableMax] PROGMEM ={
cableText00,
cableText01,
cableText02,
cableText03,
cableText04,
cableText05,
cableText06,
cableText07,
cableText08,
cableText09,
cableText10,
cableText11
};
void printFS(byte messageNumber, bool CRLF = false) {
if (messageNumber >= cableMax){
return;
}
prog_uchar * messageString = (prog_uchar*)pgm_read_word(&(string_table[messageNumber]));
int counter = 0;
byte myChar = 0;
do {
// read back a char
myChar = pgm_read_byte_near(messageString + counter++);
if (myChar != 0){
Serial.print((char)myChar);
}
}
while (myChar != 0);
if (CRLF)
Serial.println();
}
void setup(){
Serial.begin(115200);
for (byte x = 0; x < cableMax; x++){
Serial.print(x);
Serial.print(F(" = "));
printFS(x, true);
}
}
void loop(){
}
But when split into 2 files...
byte cableNum = 0; // Cable number, used to index into PROGMEM cable arrays
#define cableMax 12 // MAX value for cableNum
void setup(){
Serial.begin(115200);
for (byte x = 0; x < cableMax; x++){
Serial.print(x);
Serial.print(F(" = "));
printFS(x, true);
}
}
void loop(){
}
and
#include <avr/pgmspace.h>
// Cable Name Strings
prog_uchar cableText00[] PROGMEM = {"UNKNOWN00 \0"};
prog_uchar cableText01[] PROGMEM = {"BD SD01 \0"};
prog_uchar cableText02[] PROGMEM = {"BD SD03 \0"};
prog_uchar cableText03[] PROGMEM = {"UNKNOWN03 \0"};
prog_uchar cableText04[] PROGMEM = {"UNKNOWN04 \0"};
prog_uchar cableText05[] PROGMEM = {"UNKNOWN05 \0"};
prog_uchar cableText06[] PROGMEM = {"UNKNOWN06 \0"};
prog_uchar cableText07[] PROGMEM = {"UNKNOWN07 \0"};
prog_uchar cableText08[] PROGMEM = {"UNKNOWN08 \0"};
prog_uchar cableText09[] PROGMEM = {"UNKNOWN09 \0"};
prog_uchar cableText10[] PROGMEM = {"UNKNOWN10 \0"};
prog_uchar cableText11[] PROGMEM = {"UNKNOWN11 \0"};
//Message String Pointer Table (Needed to access above Message Strings in PROGMEM)
prog_uchar *string_table[cableMax] PROGMEM ={
cableText00,
cableText01,
cableText02,
cableText03,
cableText04,
cableText05,
cableText06,
cableText07,
cableText08,
cableText09,
cableText10,
cableText11
};
void printFS(byte messageNumber, bool CRLF = false) {
if (messageNumber >= cableMax){
return;
}
prog_uchar * messageString = (prog_uchar*)pgm_read_word(&(string_table[messageNumber]));
int counter = 0;
byte myChar = 0;
do {
// read back a char
myChar = pgm_read_byte_near(messageString + counter++);
if (myChar != 0){
Serial.print((char)myChar);
}
}
while (myChar != 0);
if (CRLF)
Serial.println();
}
I get
sketch_dec15a.ino: In function 'void setup()':
sketch_dec15a:9: error: 'printFS' was not declared in this scope
error message.
If I change
void printFS(byte messageNumber, bool CRLF = false) {
to
void printFS(byte messageNumber, bool CRLF) {
then it compiles okay.
Is this an error or have I missed some subtle point.