Возврат структуры из функции порождает ошибку компиляции "does not name a type"

У меня есть файл main.ino, который содержит

struct EulerAngles {
  double roll, pitch, yaw;
};

void setup() {
  EulerAngles angles;
  angles = anglesCalc();
  Serial.print(angles.yaw);
}

void loop() {
  Serial.println("In loop");
  delay(1000);                 
}

и файл angles.ino, содержащий

EulerAngles anglesCalc(){
   EulerAngles a;
   // рассчитать a
   return a;
}

Когда я компилирую программу, я получаю ошибку компиляции в файле main.ino:

   code/so_examples/main.ino:5:1: error: 'EulerAngles' does not name a type
 void setup() {
 ^~~~~~~~~~~
code/so_examples/main.ino: In function 'void setup()':
code/so_examples/main.ino:7:12: error: 'anglesCalc' was not declared in this scope
   angles = anglesCalc();
            ^~~~~~~~~~
code/so_examples/main.ino:7:12: note: suggested alternative: 'angles'
   angles = anglesCalc();
            ^~~~~~~~~~
            angles
[Build] Error occurred.

Как мне это исправить? Обратите внимание, что struct объявляется раньше всего остального, поэтому этот ответ, похоже, неприменим. Я использую плагин Stino для Sublime Text в качестве IDE.

, 👍0

Обсуждение

Первоначальный вопрос был перефразированием гораздо более крупной программы, но в этой программе я переместил структуру наверх, и это не устранило проблему. Теперь я создал фиктивную программу, которая воспроизводит проблему (имеет структуру вверху), и изменил вопрос, чтобы показать этот реальный код, а также реальное сообщение об ошибке компилятора., @Obromios

какую среду разработки вы используете? основной файл ino должен быть назван как папка sketch so_examples.ino, которая будет объединена Arduino builder перед другими файлами ino. файлы объединяются в порядке вкладок Arduino IDE. https://arduino.github.io/arduino-cli/latest/sketch-build-process/, @Juraj

Переименование main.ino в so_example.ino не помогает. Но я использую Sublime Text с плагином Stino. Если я открою переименованный файл с помощью Arduino IDE и скомпилирую, он будет работать нормально. Так что, похоже, это проблема с IDE Stino / Sublime Text., @Obromios

Arduino IDE не позволяет открывать ino, которого нет в папке с тем же именем, @Juraj

Хорошая идея. Проблема с Ardino IDE на Mac, работающем под управлением Big Sur, заключается в том, что она нестабильна, она постоянно падает на меня. Кроме того, похоже, что в редакторе нет никакой проверки синтаксиса, плюс я выполняю всю свою работу по разработке в Sublime Text. Я подниму проблему с плагином Stino и просто перестану пытаться использовать функции, которые возвращают структуры, пока проблема не будет устранена. Спасибо всем, кто помог решить эту проблему., @Obromios

Существует открытая проблема со структурами с плагином Sublime Text. Я добавил ответ с подробностями. Я планирую удалить все свои комментарии к вопросу / ответу, так как они устарели и просто добавляют шума., @Obromios


3 ответа


Лучший ответ:

1

Существует открытая проблема с плагином Stino Arduino для Sublime Text, которая означает, что структуры не обрабатываются должным образом.

Спасибо Юре и Эдгару Боне за то, что помогли мне ответить на этот вопрос.

,

в первоначальном вопросе не упоминался Стино, @Juraj

Я считаю, что окончательная форма вопроса и принятого ответа должна быть максимально ясной и, по возможности, не требовать чтения комментариев, чтобы понять это. Отредактировав вопрос, чтобы добавить уточнение Стино, вы даете понять, что это не лишний вопрос. Удаление ненужных или устаревших комментариев также повышает ясность вопросов и ответов. Тем не менее, я заметил, что у вас гораздо больше опыта работы в этом сообществе, чем у меня (обычно я работаю на SO), поэтому готов воспользоваться вашим советом по этому вопросу. Я добавил благодарность за вашу помощь и помощь Эдгара Бонета в моем ответе., @Obromios


-1

Попробуйте добавить структуру в первую из функций, например:

struct EulerAngles anglesCalc(){
   EulerAngles a;
   // рассчитать a
   return a;
}
,

0

Я бы избегал иметь несколько файлов .ino из-за проблем, поднятых в других ответах. Если вы хотите разделить свой код на несколько файлов, схема, которая работает надежно, должна иметь:

  • один файл .ino, названный так же, как содержащая его папка, содержащая “основную” программу (это специфично для Arduino).
  • пара из них .h/.cpp файлы для каждого “модуля”, реализующего подфункцию программы (это обычная практика C ++).

В пределах .h/.cpp кроме того, файл .h объявляет все , что нужно компилятору для понимания кода, использующего эту функцию: определения типов (включая классы) и прототипы функций. Файл .cpp содержит фактическую реализацию.

Применение этой схемы к вашему случаю даст:

my-sketch.ino (собственно, с именем содержащей папки):

#include "angles.h"

void setup() {
  EulerAngles angles;
  angles = anglesCalc();
  Serial.print(angles.yaw);
}

void loop() {
  Serial.println("In loop");
  delay(1000);                 
}

углы.h:

struct EulerAngles {
  double roll, pitch, yaw;
};

EulerAngles anglesCalc();

angles.cpp:

#include <Arduino.h>
#include "angles.h"

EulerAngles anglesCalc() {
   EulerAngles a;
   // рассчитать a
   return a;
}

Обратите внимание, что включение <Arduino.h> полезно только в том случае, если код использует Arduino core API. В противном случае вы можете опустить его. Основной скетч не должен включать <Arduino.h>, потому что он неявно включен в файл .ino Arduino IDE. Когда IDE обрабатывает файлы .cpp, такого неявного включения не существует.

,

гораздо проще использовать несколько файлов ino, чем поддерживать файлы a .h, @Juraj