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

Есть такая присказка, про занятие сексом стоя, на лыжах, в гамаке!
Не знаю - почему я вспомнил? :cowboy_hat_face:

Извините

т.с. - это что?
Прагма онс - я знаю для чего. Это что бы этот заголовочный “загружался” только один раз. Ну или как раньше делали оборачивали весь код файла в дефайн…

“так сказать”

1 лайк

Гораздо удобнее работать с проектом, когда он разбит на логические блоки
В чем тут секс стоя? :slight_smile:

Для ленивых повторю ПРАВИЛА сборки скетча, принятые в Ардуино ИДЕ.

  1. ВСЕ файлы с расширением “.ino” собираются в один файл следующим образом: ПЕРВЫМ ставится текст из файла с наименованием ПАПКИ скетча. Затем из остальных - ПО АЛФАВИТУ! Затем добавляются прототипы всех функций у которых нет прототипов, из этой кучи. Затем всё это передается компилятору.
    Файлы .cpp - компилируются как положено. Вся “кухня” касается исключительно файлов .ino.
    :wink:

Доходит ли теперь, что Dev.ino вписано в кучу РАНЬШЕ, чем Test.ino? Test.ino окажется первым ИСКЛЮЧИТЕЛЬНО тогда, когда сама ПАПКА скетча так называется, а у ТС она называется TestH.


Это всё - общеизвестные для Ардуино вещи и следует ИЗБЕГАТЬ многих ino в своих проектах!

А протопип функции обявить не пробовали?

В том, что в твоем проекте несколько “.ino”, а должен быть один. Остальные нужно делать “.cpp” и “.h”.

Нет там никакой проблемы, Вы просто в файле Dev.ino забыли написать #include "first.h"

Здесь нет и не может быть нестандартных глюков - Вы говорите об элементарных вещах, которые работают и не могут не работать.

Примерно про добавление по алфавиту я знал. И да, Вы смотрели примеры ваше? Я привел в одном сообщении три примера. Один(первый) НЕ рабочий и два рабочих. И как-то там не понятно все равно с “вашей теорией”…

Но как же тогда без #include "first.h" работает в том же файле(Dev.ino) объявление переменной типа из h???

Это не моя теория. Дискутировать - в саду, за углом, около аптеки и не с о мной. Я написал то, что есть на самом деле и объяснил, почему это произошло. Трахаться стоя и в гамаке - далее предлагаю самостоятельно.

Ок. Буду приучаться к этому.

Ну и ладно… просто хотел разобраться :slight_smile:

Никак не работает.

Знаете, что, в посте уже 32 сообщения, а простейший вопрос до сих пор не решён и знаете почему? Потому что Вы выносите всем мозг вместо того, чтобы сделать простую вещь.

Вот давайте Вы сейчас вставите ОДИН ПОЛНЫЙ скетч в котором видна проблема. Ещё раз для альтернативно одарённых - ОДИН ПОЛНЫЙ СКЕТЧ демонстрирующий проблему без всякого бла-бла и заумных теорий про нестандартные глюки.

Тут всё настолько элементарно, что это постараться надо так засрать мозги себе и всем остальным.

Пожалуйста:

TestH.ino:

#include "first.h"

first.h:

struct TData {
bool isR;
int sw;
};

Dev.ino:

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;
}

Потому что Dev.ino объединяется с TestH.ino
Объединяется - значит тексты обоих файлов сливаются в один. Т.е. компилятору предъявляется файл

#include "first.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 c readdata в разные вкладки - то работает.

Работает. Но с одной поправкой (см. строку 19 на скриншоте) - функция

bool readdata (TData dd)

должна что-то возвращать. А у вас не возвращает ничего. Нужно внимательно читать сообщения об ошибках ))

Итак, у Вас два файла .ino Собственно проблема именно в этом - в том, что Вы не умеете их правильно использовать. Там очень много тонкостей и объяснять их Вам сейчас бесполезно, Вы не готовы воспринять это. Поэтому, запомните следующие вещи и они помогут Вам делать всё и всегда правильно

  1. В папке должен быть один (прописью - один) файл c расширением .ino)
  2. Выражение #include <имя файла> полностью и абсолютно эквивалентно тому, как если бы Вы просто вставили в это место содержимое того самого файла. Никаких других тонкостей тут нет. Это просто вставка содержимого в это место.

Исходите из этого и проблем никогда не будет.

Вот как у Вас должно быть.

///// Файл Dev.ino
///
#include "first.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;
  return dd.isR;
}

.

///// Файл first.h
///
#ifndef	FIRST_H
#define	FIRST_H

struct TData {
	bool isR;
	int sw;
};

#endif

.

///// Файл testh.cpp
///
#include "first.h"