Создание библиотеки

JonHappy1
Offline
Зарегистрирован: 11.06.2018

DetSimen пишет:

Я - все. Помогите мне развидеть эту тему. Афтар, пока не прчтешь K&R, не ходи сюда больше. 

Пойду я, лучше, закусь пожарю. Удачи.

спасибо, с одной ошибкой рзобрался. только с этой ошибкой работало.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JonHappy1 пишет:

c 19 по 25 строку

В этих строках описана переменная с таким именем, а там используется тип данных с таким именем - т.е. там это слово используется как имя класса. Повторяю вопрос - Вы отличаете имя переменной от имени класса? Или Вы и в Яве так делали? В общем, Вы меня окончательно убедили, что знания Ява у Вас на уровне цикла for и не больше.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

ЕвгенийП пишет:

JonHappy1 пишет:

c 19 по 25 строку

В этих строках описана переменная с таким именем, а там используется тип данных с таким именем - т.е. там это слово используется как имя класса. Повторяю вопрос - Вы отличаете имя переменной от имени класса? Или Вы и в Яве так делали? В общем, Вы меня окончательно убедили, что знания Ява у Вас на уровне цикла for и не больше.

да с этим разобрался.
вынес требуемые пременные в отдельный  файл .h - компилируется, работает.

создаю два файла .h и .cpp следую этому уроку http://mypractic.ru/urok-9-sozdanie-biblioteki-dlya-arduino.html

Xxx06.h

#ifndef Xxx06_h
#define Xxx06_h
#include "Global.h"
#include "Arduino.h"
class Xxx06 {
  public:
   void xxx06();
};

#endif

Xxx06.cpp


#include "Arduino.h"
#include "Xxx06.h"
void Xxx06::xxx06() {
  uint8_t* d_in = (uint8_t*)&data_in;
  
  STRto9100* st = (STRto9100*)&buf;
  st->address = d_in[0];
  st->command = 0x03;   
  st->reg = 0xED10;    
  st->data = 0x01;      
 extern void getMBCRC(); //так правильно?
  getMBCRC();   // эта функция в ino как её правильно описать?

  memcpy(for_serv, &"xxx06u|     ", 12);  

}

в ino добавляю такое

#include "Global.h"
#include "Xxx06.h"
Xxx06 xxx06_;

const  FunctionPointer list_command[] = {xxx04, xxx05, xxx06_.xxx06};

 

 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

при наличии фалов Xxx начинает ругаться на такие строки в файле Global.h (куда вынесены переменные)
byte count_in = 0;

'byte' does not name a type

 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

а рекомендации с дополнительным файлом с глобальными переменными - говорит о том , что и среди знатоков есть ..

а именно если сделать #include "Global.h" в файле Xxx06.h то получится ошибка редефайн...

вот такоt extern byte buf[8]; в файле Xxx06.h на этапе компиляции пока прокатывает, но возникают проблемы со структурами , кк их сделать extern?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JonHappy1 пишет:

при наличии фалов Xxx начинает ругаться на такие строки в файле Global.h (куда вынесены переменные)
byte count_in = 0;

'byte' does not name a type

Ну, поставьте в начале #include <arduino.h> ... и ... прочитайте, наконец, учебник по языку.

JonHappy1 пишет:

а рекомендации с дополнительным файлом с глобальными переменными - говорит о том , что и среди знатоков есть ..

Да, нет, это показывает только то, что Вы не умеете правильно на файлы разбивать и ничего больше.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну сколько можно . Всем известная библиотека LiquidCrystal_I2C.h https://github.com/marcoschwartz/LiquidCrystal_I2C

А библиотека Wire.h для нее глобальная.  Запустите поиск этого файла на своем компьютере. Найдите и посмотрите.

Опять же "C:\Program Files\Arduino\libraries" находятся библиотеки Ардуино.

А здесь ядро файлов Ардуино "C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino"

JonHappy1
Offline
Зарегистрирован: 11.06.2018

Да, нет, это показывает только то, что Вы не умеете правильно на файлы разбивать и ничего больше.

еслиб я умел, я б не спрашивал....
тут http://microsin.net/programming/arm-troubleshooting-faq/how-use-extern.html есть  подобное, но честно - я не  смог разобраться в применении к моему варианту. мне было б проще если б на на моих файлах показали. написать пример трудно, а  разводить ругань

sadman41
Offline
Зарегистрирован: 19.10.2016

Программиста учить - только портить.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

JonHappy1 пишет:

Да, нет, это показывает только то, что Вы не умеете правильно на файлы разбивать и ничего больше.

еслиб я умел, я б не спрашивал....

Что бы понять ответы вам нужно знать некую базу. И это не я разбил. Это и есть тот код которым пользуются и который работает.  Можно много раз жаловаться на качество дороги, но другой дороги нет, вот и жалуются и едут. А суперские дороги они только в вашей бошке и нигде больше.

sadman41 пишет:

"Программиста" учить - только портить.

себе нервы.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

sadman41 пишет:

Программиста учить - только портить.

ты самоучка? https://github.com/marcoschwartz/LiquidCrystal_I2C и не нашёл того что требется

там нет струтур

sadman41
Offline
Зарегистрирован: 19.10.2016

Я вообще не программист, если что. 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

sadman41 пишет:

Я вообще не программист, если что. 

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Я уже написал, как у себя сделал. Не подошло? Что ж... А в извращениях с рефлексией у меня участвовать желания нет. 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

sadman41 пишет:

Я уже написал, как у себя сделал. Не подошло? Что ж... А в извращениях с рефлексией у меня участвовать желания нет. 

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

b707
Онлайн
Зарегистрирован: 26.05.2017

JonHappy1 пишет:

а рекомендации с дополнительным файлом с глобальными переменными - говорит о том , что и среди знатоков есть ..

рекомендация абсолютно верная, именно так это и делается - глобальные определения выносятся в отдельный файл, который потом подключается ко всем остальным файлам проекта. А чтобы не было повтороных определений и ошибок редефайна - файл заключается в директивы препроцессора #ifdef, чтобы определения подключались только один раз

JonHappy1
Offline
Зарегистрирован: 11.06.2018

Цитата:
рекомендация абсолютно верная, именно так это и делается - глобальные определения выносятся в отдельный файл, который потом подключается ко всем остальным файлам проекта. А чтобы не было повтороных определений и ошибок редефайна - файл заключается в директивы препроцессора #ifdef, чтобы определения подключались только один раз
но тогда получается , что это раносильно простому отсутствию этого файла? 

sadman41
Offline
Зарегистрирован: 19.10.2016

Семён по трезвянке еще сболтнул про #pragma once. Вычитал в своем Страуструпе, поди.

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

b707
Онлайн
Зарегистрирован: 26.05.2017

JonHappy1 пишет:

но тогда получается , что это раносильно простому отсутствию этого файла? 

с чего бы это?

b707
Онлайн
Зарегистрирован: 26.05.2017

sadman41 пишет:

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

сорри, я имел в вижу переменные.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

b707 пишет:

JonHappy1 пишет:

но тогда получается , что это раносильно простому отсутствию этого файла? 

с чего бы это?

тогда пожалуйта покажи правильное использование такого, если я делаю так

#include "Xxx06.h"
#ifndef Global.h
#define Global_h

void Xxx06::xxx06() {
  uint8_t* d_in = (uint8_t*)&data_in;  // тут   'data_in' was not declared in this scope

  STRto9100* st = (STRto9100*)&buf;
  st->address = d_in[0];
  st->command = 0x03;   
  st->reg = 0xED10;     
  st->data = 0x01;     
  getMBCRC();

  memcpy(for_serv, &"xxx06u|     ", 12);  //зполняем буфер командой что будет обрабатывать это сообщение на сервере

}
#endif

 

sadman41
Offline
Зарегистрирован: 19.10.2016

В define guard заключается всё содержимое .h файла.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

sadman41 пишет:

В define guard заключается всё содержимое .h файла.

а у меня как?

sadman41
Offline
Зарегистрирован: 19.10.2016

Давайте посмотрим на строку №1

b707
Онлайн
Зарегистрирован: 26.05.2017

JonHappy1 пишет:

тогда пожалуйта покажи правильное использование такого, если я делаю так

#include "Xxx06.h"
#ifndef Global.h
#define Global_h


}
#endif

 

[/quote]

потому что это бред. Ты проверяешь на существование макрос "Global.h", а потом определяешь  "Global_h", в результате ничего не работает.  Макрос должен быть один и тот же.

Ну и дальше - где у тебя директива #include ? Кто за тебя будет подключать файл-то?

Чтобы не добавлять это в каждый файл, этот #ifdef вставляют в сам файл Global.h - так проще.

 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

файл Xxx06.cpp

#include "Xxx06_h"
#include "Global.h"
void Xxx06::xxx06() {
...
}

файл Xxx06.h
 

#ifndef Xxx06_h
#define Xxx06_h


class Xxx06 {
  public:
   void xxx06();
};

#endif

файл Global.h

#ifndef Global_h
#define Global_h

#include "Arduino.h"
.....
#endif

файл .ino

...
#include "Global.h"
#include "Xxx06.cpp"
Xxx06 xxx06_;
....
const  FunctionPointer list_command[] = {xxx04, xxx05, xxx06_.xxx06};// cannot convert 'Xxx06::xxx06' from type 'void (Xxx06::)()' to type 'const FunctionPointer {aka void (* const)()}'
...

 

 

что не правильно?

b707
Онлайн
Зарегистрирован: 26.05.2017

JonHappy1 пишет:

что не правильно?

 я выше расписал, что неправильно. почему снова макросы разные? Ты вообще понимаешь, как пара #ifndef #define работает?

JonHappy1
Offline
Зарегистрирован: 11.06.2018

работает так

Директива #ifndef проверяет, определено ли имя CPPSTUDIO_H, если нет, то управление передаётся директиве #define и определяется интерфейс класса. Если же имя CPPSTUDIO_H уже определено, управление передаётся директиве #endif. Таким образом, исключается возможность многократного определения класса CPPSTUDIO_H.
Обратите внимание на то, как написано имя класса, используемое в сочетании с директивами препроцессорной обёртки — CPPSTUDIO_H.

#ifndef /*ИМЯ ЗАГОЛОВОЧНОГО ФАЙЛА_H*/
#define /*ИМЯ ЗАГОЛОВОЧНОГО ФАЙЛА_H*/
 
// определение класса
 
#endif /*ИМЯ ЗАГОЛОВОЧНОГО ФАЙЛА_H*/

 

чем отличается от моего?

у меня сейчас такая ошибка cannot convert 'Xxx06::xxx06' from type 'void (Xxx06::)()' to type 'const FunctionPointer {aka void (* const)()}'

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

JonHappy1 пишет:
у меня сейчас такая ошибка cannot convert 'Xxx06::xxx06' from type 'void (Xxx06::)()' to type 'const FunctionPointer {aka void (* const)()}'

Разумеется вы должны понять, чем методы статические от не статических отличаются. Вот и компилятор говорит - не могу нестатический метод в статический перевести. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JonHappy1 пишет:

у меня сейчас такая ошибка cannot convert 'Xxx06::xxx06' from type 'void (Xxx06::)()' to type 'const FunctionPointer {aka void (* const)()}'

Слушайте, я Вам искренне хочу помочь, но мое терпение иссякает.

Если хотите помощи, давайте вы будете выклдывать тексты ЦЕЛИКОМ (для особо тупых - Ц Е Л И К О М). Вы нелостаточно квалифицированны, чтобы грамотно выделить нужный кусок. Поэтому только целиком. Не умничайте!

Вот в Вашем вопросе. Вы выложили текст в котором НЕТ описания типа FunctionPointer , а ругань идёт именно на него. Ну, и как Вам помогать, скажите на милость? Ну, как?

Я сегодня уже второй раз Вам пишу - выкладывайте код целиком. Третий раз писать не буду - лень выдложить, значит не очень-то и надо разбираться.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

вот

#include "Xxx06.h"
Xxx06 xxx06_;


typedef void (*FunctionPointer) (void);
typedef struct STR {
  char x1[6];
} ;


 FunctionPointer list_command[] = {xxx04, xxx05, xxx06_.xxx06};
STR  str[] = {"xxx04", "xxx05", "xxx06"};

если всё в одном ino - всё работает. не только компилируется, а работает как надо.

хотя я думал, что одног раза выкладывания достаточно http://arduino.ru/forum/programmirovanie/sozdanie-biblioteki-0#comment-3...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JonHappy1 пишет:

хотя я думал, что одног раза выкладывания достаточно 

Недостаточно. Вы не думайте, а с каждым новым вопросм - выкладывайте заново.

С того мометна как Выложили, Вы уже несколько раз заявляли, что что-то меняли. Ну, а раз меняли - выкладывайте. Доверия к правильности Ваших изменений - 0.

В том коде, на который Вы ссылаетесь (кстати, и он неполный), тип FunctionPointer описан как указатель на функция типа 

void f(void)

А применять Вы его пытаетесь к методу класса, отсюда и ошибка.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ЕвгенийП пишет:

А применять Вы его пытаетесь к методу класса, отсюда и ошибка.

Евгений - человек тыкается как слепой котёнок, пытаясь угадать слово. Что вы хотите при таком раскладе? Послать его нахер читать основы С++ - самый лучший вариант, а то так и будет дичь тут нести.

Грубо, зато правда.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

ЕвгенийП пишет:

JonHappy1 пишет:

хотя я думал, что одног раза выкладывания достаточно 

Недостаточно. Вы не думайте, а с каждым новым вопросм - выкладывайте заново.

С того мометна как Выложили, Вы уже несколько раз заявляли, что что-то меняли. Ну, а раз меняли - выкладывайте. Доверия к правильности Ваших изменений - 0.

В том коде, на который Вы ссылаетесь (кстати, и он неполный), тип FunctionPointer описан как указатель на функция типа 

void f(void)

А применять Вы его пытаетесь к методу класса, отсюда и ошибка.

 

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

полный или не полный, но в таком виде работает, когда все в одном ino.

А применять Вы его пытаетесь к методу класса, отсюда и ошибка. как переделать? все что там перечислено({xxx04, xxx05, xxx06_.xxx06};)должно бвть разнесено по разным файлам.

 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

DIYMan пишет:

ЕвгенийП пишет:

А применять Вы его пытаетесь к методу класса, отсюда и ошибка.

Евгений - человек тыкается как слепой котёнок, пытаясь угадать слово. Что вы хотите при таком раскладе? Послать его нахер читать основы С++ - самый лучший вариант, а то так и будет дичь тут нести.

Грубо, зато правда.

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

JonHappy1 пишет:

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

Бла-бла. Приведу простую аналогию: прежде, чем прочитать книгу - изучают алфавит по букварю. Ты же - пытаешься даже не прочитать, а написать книгу, не изучив букварь. Верхоглядка ты наша.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JonHappy1 пишет:
если вы прови , то вам длжно быть просто
Понимаете, просто написать самому, а вот объяснить что-то человеку. имеющему нулевой уровень ... попробуйте объяснить слепому границу, между натурализмом Сезанна и экзистенциализмом Моне, если он никогда не видел ни того, ни другого.

У Вас недостаточный уровень, чтобы Вам можно было что-то объяснить, а читать учебник Вы отказываетесь. Ну, что ж, сам себе злобный буратино.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

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

Понимаете, просто написать самому, а вот объяснить что-то человеку. имеющему нулевой уровень .

когда один объясняет другому - есть две стороны, та которая объясняет и та которая слушает объяснения . если слушающая сторона не может понять объясняющую - так может в этом есть и вина объясняющей, что не может правильно донести знаний?
но пока я не одного обяснения не прочитал, пока только посылают.

я не отказываюсь читать книги, но на примерах, по конкретным вопросам изучать намного качественнее.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

JonHappy1, человеку, имеющему нулевой уровень, бесполезно объяснять, его можно только обучать. Т.е. бесполезно отвечать на его вопросы. Чтобы добиться успеха, обучающий должен сам выбирать для него задания, а не идти на поводу у ученика. 

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

Есть и еще один важный момент: все люди разные, и у каждого свои способности по обучению. Средний человек обычно способен освоить что-то самостоятельно, пользуясь литературой, а сегодня еще и видеоуроками. Если человек этого не может, то и попытки обучать его наверняка окажутся тяжелыми, нудными и малопродуктивными.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

разобрался сам, но остался вопрос

Xxx06.h

#include <Arduino.h>
#ifndef Xxx06_h
#define Xxx06_h

typedef struct STRto9100_  { как избавиться от этого описания структуры 
  byte address;
  byte command;
  uint16_t reg;
  uint16_t data;
  uint16_t crc;
} ;
void xxx06();
extern void getMBCRC();
extern uint8_t data_in[10];  
extern uint8_t for_serv[12];  
extern byte buf[8];
#endif
#include "Xxx06.h"

void xxx06() {
  uint8_t* d_in = (uint8_t*)&data_in;
 
  STRto9100_* st = (STRto9100_*)&buf;
  st->address = d_in[0];
  st->command = 0x03;  
  st->reg = 0xED10;     
  st->data = 0x01;      
  getMBCRC();
  
  memcpy(for_serv, &"xxx06u|     ", 12);  /
}

typedef struct STRto9100_   дублирует структуру  STRto9100, описанную в ino. как от этого избавиться?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JonHappy1 пишет:

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

Так и есть

JonHappy1 пишет:

как от этого избавиться?

Прочитать, наконец, учебник.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

Цитата:
Прочитать, наконец, учебник.

ткни на место в учебнике.

вот есть ответ на подобный вопрос
http://qaru.site/questions/2082614/c-error-a-storage-class-can-only-be-s...
но только "вероятно"

такое можно прочитать в учебнике?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JonHappy1 пишет:

ткни на место в учебнике.

вот есть ответ на подобный вопрос

Ваше "вот здесь" не имеет никакого отношения к Вашему вопросу от слова абсолютно.

Тыкать в место можно того, кто в целом знаем и надо освежить в памяти конктретную вещь. Вы же не знаете ничего от слова совсем (и про знания Явы с Паскалем - тоже сказки, Вы их тоже не знаете от слова совсем).

Поэтому тыкаю: первая страница. Читать подряд. Выполняя на компьютере все примеры и разбирая их. С первой страницы до последней.

JonHappy1
Offline
Зарегистрирован: 11.06.2018

ЕвгенийП! я так понимаю - у Вас понтов больше , чем сповобностей что-то объяснять?
сложно было сказать, что для выноса функции не нужно использовать классы?  а не городить такое:

В том коде, на который Вы ссылаетесь (кстати, и он неполный), тип FunctionPointer описан как указатель на функция типа void f(void). А применять Вы его пытаетесь к методу класса, отсюда и ошибка.

т.е. Вы не хотите прото объяснить простое, а с понтами показываете своё превосходство? я ведь не спорю , что вы знаете больше.

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Б-ть, феерический дебил. Заслужил, получи.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Берем такую программу 

/**/
//-------------------------------
byte ver = 10;/*версия*/
//-------main----------------------
void setup() {
  Serial.begin(9600);
  Serial.print("ver:");
  Serial.print(ver);
  Serial.println();

}

void loop() {


}
/**/

И делаем из нее библиотеку

.ino

/**/
//-------------------------------
#include "verLib.h"
//-------main----------------------
void setup() {
  Serial.begin(9600);
  Serial.print("ver:");
  Serial.print(ver);
  Serial.println();

}

void loop() {


}
/**/

verLib.h

/*verLib.h*/
#ifndef verLib_h
#define verLib_h
#include <Arduino.h>
extern byte ver;/*версия*/
#endif

verLib.cpp

/*verLib.cpp*/
#include "verLib.h"
byte ver = 10;/*версия*/

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

развиваем дальше .ino

/**/
//-------------------------------
#include "verLib.h"
//-------main----------------------
void setup() {
  Serial.begin(9600);
  vievVer();
}

void loop() {


}
/**/

verLib.h

/*verLib.h*/
#ifndef verLib_h
#define verLib_h
#include <Arduino.h>
extern byte ver;/*версия*/
void vievVer();
#endif

verLib.cpp

/*verLib.cpp*/
#include "verLib.h"
byte ver = 10;/*версия*/
void vievVer() {
  Serial.print("ver:");
  Serial.print(ver);
  Serial.println();
}

 

JonHappy1
Offline
Зарегистрирован: 11.06.2018

2qwone! спасибо, но как использовать структуры?

sadman41
Offline
Зарегистрирован: 19.10.2016

JonHappy1 пишет:

ЕвгенийП! я так понимаю - у Вас понтов больше , чем сповобностей что-то объяснять?
сложно было сказать, что для выноса функции не нужно использовать классы?  

А нахера их вообще было использовать изначально. Вам что, ЕвгенийП их посоветовал использовать или еще кто-то?

Если вы броситесь в окно, то будете лететь и орать "сложно было сказать, чтобы не бросался, а спустился по лестнице"? 

С какого х... все виноваты в ваших бедах? Выбрали неправильный подход изначально, теперь мозги всем полоскаете тут сутками.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

И наконец это файл .ino

/**/
//-------------------------------
#include "verLib.h"
//-------main----------------------
void setup() {
  Serial.begin(9600);
  vievVer();
}
void loop() {
}
/**/

verLib.h

/*verLib.h*/
#ifndef verLib_h
#define verLib_h
#include <Arduino.h>
typedef struct {
  byte v1;
  byte v2;
  byte v3;
} ver_t;
extern ver_t ver;/*версия*/
void vievVer();
#endif

verLib.cpp

/*verLib.cpp*/
#include "verLib.h"
ver_t ver = {1, 8, 0}; /*версия*/
void vievVer() {
  Serial.print("ver:");
  Serial.print(ver.v1);
  Serial.print(".");
  Serial.print(ver.v2);
  Serial.print(".");
  Serial.print(ver.v3);
  Serial.println();
}