Как получить доступ к значению локальной переменной в функции вне ее? - PullRequest
1 голос
/ 14 января 2020

Когда я запускаю свой код, он говорит, что «скорость» не была объявлена ​​в области видимости. Я попытался добавить в начало объявление для скорости, равной нулю, и код работает, но тогда скорость никогда не обновляется. Как я могу сделать так, чтобы я мог вызывать скорость в моей функции l oop? Код:

const int trigPin = 9;
const int echoPin = 10;
int trials = 0;
bool win = true;

long duration1, distance1, duration2, distance2;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Serial.begin(9600);
}

void getDistance(){
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  long duration1 = pulseIn(echoPin, HIGH);
  long distance1 = (duration1*.0343)/2;

  Serial.print("Distance: ");
  Serial.println(distance1);
  delay(100);

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  long duration2 = pulseIn(echoPin, HIGH);
  long distance2 = (duration2*.0343)/2;

  Serial.print("Distance: ");
  Serial.println(distance2);
  delay(100);

  }


void calculateSpeed(long dist2,long dist1,long time2,long time1){
  long numerator = dist2 - dist1;
  long denominator = time2 - time1;
  long velocity = numerator / denominator;
  return velocity;
}

void loop() {
  while (win == true){
    getDistance();
    calculateSpeed(distance2, distance1, duration2, duration1);
    Serial.println(velocity);

}
}

Ответы [ 2 ]

3 голосов
/ 14 января 2020

Ответ на общий вопрос

Вы не можете получить доступ к локальной переменной в функции из-за пределов функции, однако есть несколько способов получить значение из функции. Вот несколько примеров. Обратите внимание, что я использую переменную int в примерах, но это работает и с другими типами, такими как long.

1. Вернуть значение из функции:

int foo()
{
    int val = 42;
    return val;
}

int main()
{
    // Gets the value from foo()
    int val = foo();
}

2. Создайте глобальную переменную и измените ее в функции (не рекомендуется)

Есть несколько причин, почему это не очень хорошая практика, но я не буду вдаваться в подробности. Просто спросите Google, почему глобальные переменные обычно не очень хороши, и вы найдете достойное объяснение.

// Global variable
int val;

void foo()
{
    val = 42;
}

int main()
{
    // val is accessible from here and is equal to 42
}

3. Передайте переменную в функцию по указателю и измените ее в функции

void foo(int* val)
{
    *val = 42;
}

int main()
{
    int val;
    foo(&val);

    // val now contains 42
}

4. Передайте переменную по ссылке и присвойте значение в функции

void foo(int& val)
{
    val = 42;
}

int main()
{
     int val;
     foo(val);

     // val now equals 42
}

Ваш конкретный c выпуск:

Вы пытаетесь вернуть значение из * Функция 1040 *. Измените calculateSpeed так, чтобы оно возвращало long, а затем используйте возвращенное значение в другой функции:

// Return long
long calculateSpeed(long dist2,long dist1,long time2,long time1){
  long numerator = dist2 - dist1;
  long denominator = time2 - time1;
  long velocity = numerator / denominator;
  return velocity;
}

void loop() {
  while (win == true){
    getDistance();

    // Get the returned value
    long velocity = calculateSpeed(distance2, distance1, duration2, duration1);

    // Use the returned value
    Serial.println(velocity);
  }
}

Однако есть и другие проблемы. Вы объявляете некоторые глобальные переменные с помощью long duration1, distance1, duration2, distance2;, но затем вы объявляете эти переменные локально в функциях.

Например, в getDistance() вам нужно изменить это:

long duration1 = pulseIn(echoPin, HIGH);
long distance1 = (duration1*.0343)/2;

на это :

duration1 = pulseIn(echoPin, HIGH);
distance1 = (duration1*.0343)/2;
0 голосов
/ 14 января 2020

Вы не можете использовать имя локальной переменной как видимое только внутри calculateSpeed.

Но поскольку вы возвращаете его из этой функции, вы можете делать то, для чего возвращаются значения:

Serial.println(calculateSpeed(distance2, distance1, duration2, duration1));

Как scohe001 любезно указал в комментарии (спасибо),
вам нужно сопоставить функциональную головку с фактом, что вы возвращаете что-то:

long calculateSpeed(long dist2,long dist1,long time2,long time1){

В качестве альтернативы, также сделайте исправление возвращаемого значения а затем введите переменную внутри вызывающей функции, заполните ее возвращаемым значением и затем используйте его. Но это необходимо, только если вы хотите продолжать использовать значение.

Я тоже хотел показать код для этого. Но ответ tjwrona1992s уже охватывает это.

...