Нужна помощь по синтаксису языка Ардуины

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
Товарищи, нужна помощь. Ардуино увлекаюсь не так давно, поэтому прошу совета.

Наткнулся на вот такой код из проекта про радиоуправление:

Transmitter code:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

const uint64_t pipeOut = 0xE7E7F0F0E1LL; //Remember to keep this exactly the same for the receiver code also

RF24 radio(9, 10);

struct MyData {
  byte throttle;
  byte yaw;
  byte pitch;
  byte roll;
  byte AUX1;
  byte AUX2;
};

MyData data;

void resetData()
{

  data.throttle = 0;
  data.yaw = 127;
  data.pitch = 127;
  data.roll = 127;
  data.AUX1 = 0;
  data.AUX2 = 0;
}

void setup()
{

  radio.begin();
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.openWritingPipe(pipeOut);
  resetData();
}

int mapJoystickValues(int val, int lower, int middle, int upper, bool reverse)
{
  val = constrain(val, lower, upper);
  if ( val < middle )
    val = map(val, lower, middle, 0, 128);
  else
    val = map(val, middle, upper, 128, 255);
  return ( reverse ? 255 - val : val );
}

void loop()
{
  data.throttle = mapJoystickValues( analogRead(A0), 13, 524, 1015, true );
  data.yaw      = mapJoystickValues( analogRead(A1),  1, 505, 1020, true );
  data.pitch    = mapJoystickValues( analogRead(A2), 12, 544, 1021, true );
  data.roll     = mapJoystickValues( analogRead(A3), 34, 522, 1020, true );
  data.AUX1     = digitalRead(4); //The 2 toggle switches
  data.AUX2     = digitalRead(5);

  radio.write(&data, sizeof(MyData));
}
То, что структура в строке 9 - это и так понятно: структура упаковывает несколько переменных в общую кучу для дальнейшего использования.

Но вот что делает 18-я строка (вроде 18-я) мне не понятно:
MyData data;

Что это такое и для чего? Спасибоо.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,279
1,304
Москва
Это объявление переменной data с типом MyData
Т.е. data это экземпляр структуры, далее можно к полям обращаться как в 53 строке и далее
 

poty

★★★★★★✩
19 Фев 2020
3,268
950
@Старик Похабыч рассказал всё правильно, но правильная терминология (хоть и обязательна), новичкам не всегда понятна. Чтобы было проще - на примере:
В девятой строке объявляем тип "кошка" и говорим, что она состоит из лап, хвоста, глаз, ушей, рта, тела, меха... Это пока только название типа, реально пока у нас ничего нет.
Вот теперь у нас возникает кошка, называем её Мурка, чтобы это описать пишем:
кошка Мурка
И вот это уже будет объект, с которым нам потом жить.
 

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
Всем большое спасибо за ответ. Хоть я мало что и понял, но, уже понятно, в какой области стоит гуглить.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,279
1,304
Москва
C++:
int n1; // обычные переменные...
int n2; //обычные переменные...
MyData data; // НЕобычные переменные, переменная типа  [B]MyData , который определяется структурой![/B]
 

derungebundener

✩✩✩✩✩✩✩
18 Июл 2020
117
3
C++:
int n1; // обычные переменные...
int n2; //обычные переменные...
MyData data; // НЕобычные переменные, переменная типа  [B]MyData , который определяется структурой![/B]

В общем, пока что я понял одну вещь - учебник по С в зубы и вперед :)
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,162
414
Москва
wan-derer.ru
Угу...
Подвоха нет? вроде обычные переменные...
Обычные переменные, каждая хранит целое число.
А теперь, допустим, ты хочешь хранить данные человека. У него есть имя и фамилия.
Можно сделать так:
C++:
String firstName1 = "Иван";
String lastName1 = "Иванов";
String firstName2 = "Сидор";
String lastName2 = "Сидоров";
Нормально, но неудобно, особенно когда людей много. Лучше бы хранить человека как единую сущность. Но у которой есть различные данные (поля):
C++:
// описываем некоего человека (структура (состав) всех человеков одинаковый)
struct person     //Создаем структуру!
{                   
    String firstName;       // имя
    String lastName;        // фамилия 
};

// описываем конкретного человека
person person1;    // тип данных person (как int, String и пр.), имя переменной person1
person1.firstName = "Иван";
person1.lasName = "Иванов";

person person2;   
person1.firstName = "Сидор";
person1.lasName = "Сидоров";
Теперь в любом месте нашей программы мы можем получить человека и он прилетит к нам в полном составе - с именем и фамилией. Мы даже можем сделать массив из человеков:
C++:
  person crowd[100500];
и получить доступ к каждому человеку по индексу.

Дальше - больше. У нас есть классы! Класс может хранить не только данные (поля) объекта, но и действия (методы) которые он (или с ним) может совершать.
C++:
car redCar;
car blueCar;
car greenCar;

redCar.go();            // красная поехала
blueCar.stop();            // голубая встала
greenCar.turnLeft();    // зелёная ушла налево!
Естественно, все эти методы надо сначала определить в классе car.
 
  • Лойс +1
Реакции: kostyamat

Владлэн

✩✩✩✩✩✩✩
28 Авг 2023
24
7
Копался в коде ESP32 и попалась такая функция.
C++:
bool WiFiAPClass::softAPdisconnect(bool wifioff)
{
    bool ret;
    wifi_config_t conf;
    wifi_softap_config(&conf);

    if(WiFiGenericClass::getMode() == WIFI_MODE_NULL){
        return false;
    }

    ret = esp_wifi_set_config((wifi_interface_t)WIFI_IF_AP, &conf) == ESP_OK;

    if(ret && wifioff) {
        ret = WiFi.enableAP(false) == ESP_OK;
    }

    return ret;
}
Что за синтаксис такой?
ret = WiFi.enableAP(false) == ESP_OK;