Свой тип параметром в функцию из *.h

Есть файл file.h
в нем:

struct Data {
  bool isR, isL;
  int sw;
};

в файле скетча есть

#include file.h

и вот такое:

Data dd;

компилится. Т.е. тип видно из заголовочного файла, а такое:

bool readdata(Data _dd) {

};

Ругается, что Data не определен (was not declared in this scope)

Как сделать функцию с аргументом тип которого описан в *.h файле?

typedef struct {
  bool isR, isL;
  int sw;
} Data;

и так не хочет (redeclared as different kind of symbol)

Версия среды какая?

2.1.1

Где-то одинаково называется переменная и функция, к примеру.
typedef не может не сработать.

Но почему тогда работает (без тайпдеф даже)

Data dd;

viid test(); {
dd.isR = false;
{

bool reфddata (Data _dd) {

}

первые пять строк компилятся без проблем, если закомментировать readdata

bool reфddata (struct Data _dd) {

}

Так ещё можно было с изначальным вариантом.

В общем вопрос остается , но я немного не верно изначально описал.

Если делать *.h файл и <имяпроекта>.ino то так все нормально работает и видится. Но стоит в проекте добавить вкладку и в этой вкладке сделать функцию с параметром типа из *.h то тип перестает быть виден, но замечательно видится, если выше функции создать гл. переменную данного типа.

Приведите пример всех трёх файлов. Где-то фейлите

В общем какая-то ерунда. Сейчас сделал отдельный проект и вынес в него только данный вопрос. И что заметил. В “некоторых” случаях работает, в некоторых нет.

Вариант 1 - Не работает:
проект во всех вариантах TestH.ino

Спойлер

Файл Test.ino

#include "first.h"

Файл first.h

struct TData {
bool isR;
int sw;
};

Файл Dev.ino (созданная вкладка в IDE)

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

bool readdata (TData dd) {

}

Вариант 2 - Работает

Спойлер

Файл Test.ino

#include "first.h"
bool readdata (TData dd) {

}

Файл first.h

struct TData {
bool isR;
int sw;
};

Файл Dev.ino (созданная вкладка в IDE)

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

И третий вариант тоже работает

Спойлер

Файл Test.ino

#include "first.h"
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Файл first.h

struct TData {
bool isR;
int sw;
};

Файл Dev.ino (созданная вкладка в IDE)


bool readdata (TData dd) {

}

Получается не работает только если Setup, Loop и readdata вынести в отдельную вкладку… Немного странно конечно.

Ошибка первого варианта:

Спойлер

E:\ELECTRONICS\MYPROJECT\MK\ARDUINO\SKETCHS!!!TMP!!!\TestH\Dev.ino:11:15: error: ‘TData’ was not declared in this scope

           ^    

E:\ELECTRONICS\MYPROJECT\MK\ARDUINO\SKETCHS!!!TMP!!!\TestH\Dev.ino: In function ‘bool readdata(TData)’:
E:\ELECTRONICS\MYPROJECT\MK\ARDUINO\SKETCHS!!!TMP!!!\TestH\Dev.ino:11:24: error: ‘bool readdata(TData)’ redeclared as different kind of symbol

                    ^

E:\ELECTRONICS\MYPROJECT\MK\ARDUINO\SKETCHS!!!TMP!!!\TestH\Dev.ino:11:6: note: previous declaration ‘bool readdata’

  ^       

exit status 1

Compilation error: ‘TData’ was not declared in this scope

Не надо так делать. Не привыкайте к плохому. Если нужно вынести часть кода в другой файл, используйте файлы *.h и подключайте их к проекту с помощью #include

1 лайк

Для начала, выложить полный скетч. Так, как Вы описали - не бывает. Вы что-то важное сделали не так, а что и как - х Вас знает. Выкладывайте скетч, посмотрим (только скетч маленький - только для примера).

Итак, полный скетч из двух или там трёх файлов, который я могу запустить у себя и увидеть ошибку.

Чуть выше привел три примера (реальных). Вот один (первый) как раз показывает проблему топика. Хотя если это нестандартный глюк (у меня может не работать а у других работать) связанный со вкладками, то хз)))

И в первом примере также (у меня) случай с переменной типа из h так же сохранен. Т.е. Глобальную переменную “этого” типа объявить можно и она работает, а в параметре функции тип не видится.

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

а с заголовочными файлами можно так их использовать?

Сделал так: (тестовый пример). Проект еще не переделывал.

Спойлер

Файл TestH.ino

#include "first.h"
#include "Dev.h"

Файл first.h

struct TData {
bool isR;
int sw;
};

Файл Dev.h

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

TData rr;

bool readdata (TData dd) {
  rr.isR = false;
  dd.sw = 100;
}

Все скомпилировалось. Вопрос Правильно ли так делать?) Ну или не Правильно а Нормально ли…

Извините

Как это не объявленную?? И в данном случае это не переменная а аргумент функции.

Да. Хотя setup() и loop() чисто из принципа лучше оставлять в *.ino файле. Ардуино жи ))

И да, первой строкой *.h файлов должна быть

#pragma once

Во избежание, т.с.