了解如何从函数中检索数据

时间:2017-11-29 21:18:31

标签: arduino

我已经开始为Arduino学习C大约两周了。我有以下代码,我不明白如何从函数ReadLine中检索数据。另外我不明白变量BufferCount如何影响程序以及它的使用原因。我知道它拥有一年中的数字位数,但这就是我对这个变量的所有了解。

到目前为止,我所学到的功能包括:

  • 函数类型说明符
  • 功能名称
  • 函数参数。

我在这个程序中看到的让我觉得该函数也可以使用参数部分返回值。我一直以为函数只能返回与类型说明符相同类型(int,boolean ...)的值。

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.avaible() > 0) {
    int bufferCount;
    int year;
    char myData[20];
    bufferCount = ReadLine (myData);
    year = atoi(myData); //convert string to int
    Serial.print("Year: ");
    Serial.print(year);
    if (IsLeapYear(year)) {
      Serial.print(" is ");
    } else {
      Serial.print(" is not ");
    }
    Serial.println("a leap year");
  }
}

int IsLeapYear(int yr) {
  if  (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
    return 1; //it's a leap year
  } else {
    return 0;
  }
}

int ReadLine (char str[]) {
  char c;
  int index = 0;
  while (true) {
    if (Serial.available() > 0) {
      c = Serial.read();
      if (c != '\n') {
        str[index++] = c;
      } else {
        str[index] = '\0'; //null termination character
        break;
      }
    }
  }
  return index;
}

1 个答案:

答案 0 :(得分:1)

你缺少的基本概念是指针。在像isLeapYear这样的函数的情况下,你对该参数是正确的。它只是调用函数时传入的任何变量的数据副本。

但是对于ReadLine,情况有所不同。 ReadLine正在获取一个指向char数组的指针。指针是一种特殊的变量,它保存另一个变量的内存地址。确实,在这种情况下,您将获得指针的本地副本,但它仍然指向内存中的相同位置。在函数期间,数据不会复制到变量str中,而是复制到它指向的内存位置。由于这是一个属于调用函数范围内变量的内存位置,因此该实际变量的值将被更改。你已经把它写在记忆中了。