Ошибка компиляции Arduino: xxx не называет тип (несмотря на то, что он был объявлен 10 строками ранее) - PullRequest
1 голос
/ 30 марта 2020

Ссылка на изображение - https://i.stack.imgur.com/u9I3R.png

Освобождение от моего кода (биты опущены, поскольку они не важны)

struct viosReturnType {
  bool done;
  long long int returned;
  bool remapped;
};
viosReturnType viosButtonprompt(char buf1[16], char buf2[16], bool keysp[6] = {0}, String *strar = 0, int *statear = 0) {...}
viosReturnType viosRemapreturn(viosReturnType lreturner, int *indexedarray){...}

viosButtonprompt дал мне 0 проблем, и моя программа некоторое время работала правильно. Добавление viosRemapreturn дает мне

xxx/LVIOS.ino:585:1: error: 'viosReturnType' does not name a type
 viosReturnType viosRemapreturn(viosReturnType lreturner, int *indexedarray){
 ^~~~~~~~~~~~~~

Других проблем нет. Код внутри функций имеет нулевой эффект на все это. Аргументы имеют 0 эффекта на все это. Изображение показывает, что все это не в любой другой функции, все объявлено глобально и что это тот же самый "viosReturnType". Что это, пожалуйста, помогите, я прошу вас. Я попытался поместить вторую функцию над первой, без эффекта, с той же ошибкой, в той же функции, в другой строке.

Кроме того: теперь я попытался объявить пустую функцию, просто скопировав верхнюю строку моего Объявление других функций.

viosReturnType viosRemapReturn(char buf1[16], char buf2[16], bool keysp[6] = {0}, String *strar = 0, int *statear = 0) {/*empty*/}

Работает! Успех! А потом я удалил скопированные аргументы.

viosReturnType viosReturnRemap(){/*still empty*/}

И это вырвало ту же ошибку. Мой разум взрывается.

Представляет:

int SmartPoint() {}
struct viosReturnType {
  bool done;
  long long int returned;
  bool remapped;
};
viosReturnType returner;
viosReturnType viosRemapReturn(viosReturnType lreturner, int *indexedarray) {
  if (lreturner.done)
    return {1, indexedarray[lreturner.returned], 1};
}
void setup() {}
void loop() {}

Вы видите эту «SmartPoint»? Да, если я удаляю его, этот репрезекс компилируется. Но я не могу удалить его где-либо в моем реальном файле, у меня нет таких пустых функций или чего-то такого!

1 Ответ

3 голосов
/ 30 марта 2020

По какой-то причине Arduino считает хорошей идеей автоматически генерировать прототипы функций, если вы определяете функцию, которая принимает пользовательский тип данных. Я предполагаю, что они делают это для «простоты использования», так что вам не нужно беспокоиться о предварительных декларациях? Это вызывает проблемы (как вы заметили), когда эта функция использует пользовательский тип данных. Затем этот прототип помещается перед пользовательским определением типа данных, что приводит к путанице в компиляторе.

Чтобы преодолеть это автоматическое c создание прототипа, вам необходимо явно объявить прототип функции после объявления ваш тип данных. Например,

int SmartPoint() {}
struct viosReturnType {
  bool done;
  long long int returned;
  bool remapped;
};
viosReturnType returner;
// this prototype is to suppress arduino automatic prototype construction
// above viosReturnType definition
viosReturnType viosRemapReturn(viosReturnType lreturner, int *indexedarray);
viosReturnType viosRemapReturn(viosReturnType lreturner, int *indexedarray) {
  if (lreturner.done)
    return {1, indexedarray[lreturner.returned], 1};
}
void setup() {}
void loop() {}

Другое решение состоит в том, чтобы поместить определение структуры в отдельный файл .h и включить его в основной файл, чтобы после включения были включены прототипы.

// vios_return_type.h
#ifndef VIOS_RETURN_TYPE_H
#define VIOS_RETURN_TYPE_H
struct viosReturnType {
  bool done;
  long long int returned;
  bool remapped;
};
#endif // VIOS_RETURN_TYPE_H
#include "vios_return_type.h"

int SmartPoint() {}
viosReturnType returner;

viosReturnType viosRemapReturn(viosReturnType lreturner, int *indexedarray) {
  if (lreturner.done)
    return {1, indexedarray[lreturner.returned], 1};
}
void setup() {}
void loop() {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...