After this question i starteted going deep with the theory, and started studyng step-by-step with the "Beginning C, for Arduino " Jack Purdum.
I finished to study the functions chapter, but i still have some doubts on the code, i hope this will be not a dumb question.
Why there is a Method "Print" not a Data Type inside the Function Argument List?
static void printImuData(Print &printer, int16_t Time0,
int16_t AcX, int16_t AcY, int16_t AcZ,
int16_t GyX, int16_t GyY, int16_t GyZ)
{
printer.print(Time0); printer.print(",");
printer.print(AcX); printer.print(",");
[...]
}
[...]
printImuData(dataFile, Time0, AcX, AcY, AcZ, GyX, GyY, GyZ);
if (Serial_plus_SD)
printImuData(Serial, Time0, AcX, AcY, AcZ, GyX, GyY, GyZ);
I though the answer was "because you can pass data to a function by-value or by-reference" in fact the first input in the argument list is the left value (memory address) of a Method, but i am very confused.
Function arguments are used to pass data to the function that it may need to perform its task.
I tried to answer to the following questions to understand the code.
1. What task does this function perform?
The function will print some data on a Serial Monitor or SD Card
2. What data do i need to send to the function?
I need to send one Method through the left value of a pointer and 7 intergers. I can't understand why a method.
3. What data do I get back from it?
Nothing because is a void, it will perform some task inside the function (print inside the object thas is pointed?) but nothing will return to the caller.
In the book basic example is a function that returns the value 0 or 1 if is a Leap Year.
The function argument is an int and returns an int.
void loop()
{
if (Serial.available() > 0) {
int bufferCount;
int year;
char myData[MAXCHARS + 1]; // Save room for null
bufferCount = ReadLine(myData);
year = atoi(myData); // Convert to int
Serial.print("Year: ");
Serial.print(year);
Serial.print(" is ");
if (IsLeapYear(year) == 0) {
Serial.print("not ");
}
Serial.println("a leap year");
}
}
/*****
Purpose: Determine if a given year is a leap year
Parameters:
int yr The year to test
Return value:
int 1 if the year is a leap year, 0 otherwise
*****/
int IsLeapYear(int yr)
{
if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
return 1; // It is a leap year
} else {
return 0; // not a leap year
}
}
/*****
Purpose: Read data from serial port until a newline character is read ('\n')
Parameters:
char str[] character array that will be treated as a null-terminated string
Return value:
int the number of characters read for the string
CAUTION: This method will sit here forever if no input is read from the serial port
and no newline character is entered.
****/
int ReadLine(char str[])
{
char c;
int index = 0;
while (true) {
if (Serial.available() > 0) {
index = Serial.readBytesUntil('\n', str, MAXCHARS);
str[index] = '\0'; // null termination character
break;
}
}
return index;
}
Like in my the last question, I have a civil engineer background and i am a self-taught, so is my first time with coding :)
Thank you for your patience.
I need to send one Method through the left value of a pointer and 7 intergers
. The first arguments is actually a pointer to an object.Print
class to this function.HardwareSerial
(the class of theSerial
object) derives from thePrint
class. (Actually it derives fromStream
which derives fromPrint
).