Не работает код из процедуры

Тема в разделе "Arduino & Shields", создана пользователем Makhonin, 1 окт 2012.

  1. Makhonin

    Makhonin Гик

    Есть два кода, которые включают gprs shield:
    Код (Text):
    void setup() {
      pinMode(9,OUTPUT);
      digitalWrite(9,LOW);
      delay(1000);
      digitalWrite(9,HIGH);
      delay(2000);
      digitalWrite(9,LOW);
      delay(3000);
    }
     
    void loop() {
     
    }
    В одном из них включение шилда прописано просто в setup(), а в другом для этого отведена отдельная процедура, которая аналогично выполняется в setup(). В первом случае все работает, во втором никаких действий не происходит.

    Код (Text):
    void gprs_power() {
      pinMode(9,OUTPUT);
      digitalWrite(9,LOW);
      delay(1000);
      digitalWrite(9,HIGH);
      delay(2000);
      digitalWrite(9,LOW);
      delay(3000);
    }
    void setup() {
      gprs_power;
    }
     
    void loop() {
     
    }

    В чем может быть проблема? Ведь с точки зрения компилятора код получается один и тот же?
     
  2. Unixon

    Unixon Оракул Модератор

    Вы же не на паскале пишете, в сях то вызов функции как gprs_power(); оформлять надобно.
     
    nailxx нравится это.
  3. nailxx

    nailxx Официальный Нерд Администратор

    Поясню почему это скомпилировалось. Представьте себе код:

    Код (Text):

    int x = 42;
    x;
     
    В C++ просто `x` — это допустимое выражение. В данном случае вторая строка — просто получение значения 42. Ну да, ничего мы с ним не делаем, просто 42 и всё тут.

    Но и функции в C++ являются полноценными rvalues (т.е. могут участвовать в выражениях справа от знака =, т.е. участвовать в вычислениях). Упоминание имени функции — это получение её адреса. Поэтому:

    Код (Text):

    void foo() {}
     
    void setup()
    {
        foo;
        foo();
    }
     
    в первом случае означает получение указателя на `foo`. Ну да, 0x0badbeef, ничего с ним не делаем, это нормально. А вот во втором случае, когда пишем () мы говорим, что хотим вызвать функцию, лежащую по адресу `foo`. В простонародии: вызываем функцию foo.
     
    Unixon нравится это.