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

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

как в билиотеке прописать переменные, структуры, которые описаны в глобальном модуле .ino
и к ним идёт обращение из библиотеки

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

в какой билиотеке?

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

Какой мощный наброс...

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

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

хочу эту функцию вынести в "библиотеку" в файлы .h и .cpp, которые будут находиться в папке с .ino

как это правильно оформить?

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

ну дак написать обьявления в .h файл, реализацию в .cpp файл, в основном .ino написать #include "xxx.h" и сё. 

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

DetSimen пишет:

ну дак написать обьявления в .h файл, реализацию в .cpp файл, в основном .ino написать #include "xxx.h" и сё. 

так и сделал, но при компиляци пишет , что не обявлены в данной области при компиляции этих cpp и h

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

см. ключевое слово extern

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

JonHappy1 пишет:

как в билиотеке прописать переменные, структуры, которые описаны в глобальном модуле .ino
и к ним идёт обращение из библиотеки

Вообще-то, лучше - никак, это пример ужасного говнопроектиирования.

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

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

JonHappy1 пишет:

как в билиотеке прописать переменные, структуры, которые описаны в глобальном модуле .ino
и к ним идёт обращение из библиотеки

Вообще-то, лучше - никак, это пример ужасного говнопроектиирования.

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

вынести из в свои маленькие фыйлики

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

sadman41 пишет:

см. ключевое слово extern

такова в райской Яве нету. 

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

в ,cpp есть
extern STRto9100* st;

где STRto9100 глобальная структура,
компилятор пишет 'STRto9100' does not name a type
как правильно описать структуру?
 

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

#include "my_structures.h"

Полагаю, что название файла отражает идею...

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

sadman41 пишет:

#include "my_structures.h"

Полагаю, что название файла отражает идею...

тогда , наверное , имеет смысл все "глобальные" перемнные вынести в этот файл?

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

Ну тип STRto9100 не объявлен. Ясно же написано. Хотите конкретики - давайте код.

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

госспадя.  ну почитай уже Кернигана, а?  

вот, лиарьна, 90% вопросов отпадут. 

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

Xxx06.h

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

#endif

Xxx06.cpp

#include "Arduino.h"
#include "Xxx06.h"
void xxx06::xxx06() {
  extern  uint8_t data_in[10];
  extern uint8_t* d_in;
  extern byte buf[8];
  extern  uint8_t for_serv[12];
 
  d_in = (uint8_t*)&data_in;
  
  extern STRto9100* st;
  st = (STRto9100*)&buf;
  st->address = d_in[0];
  st->command = 0x03;  
  st->reg = 0xED10;   
  st->data = 0x01;   
  extern  getMBCRC();
  
  memcpy(for_serv, &"xxx06u|     ", 12);

}

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

 

b707
Offline
Зарегистрирован: 26.05.2017

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

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

b707
Offline
Зарегистрирован: 26.05.2017

JonHappy1 пишет:

тогда , наверное , имеет смысл все "глобальные" перемнные вынести в этот файл?

[/quote]

и вся программа в итоге переедет в тот файл :)

А смысл в чем? бред же...

 

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

b707 пишет:

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

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

есть глобальные переменные через, которые передаются данные, в том числе и для "рефлексии"

если всё в одном ino всё работает нормально.

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

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

JonHappy1 пишет:

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

В строке  №11 используется тип STRto9100. Не вижу, чтобы он был где-то описан.

Кстати, в Яве такое делать тоже нельзя (и в Паскле нельзя). Какие языки Вы ещё "знаете"?

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

JonHappy1 пишет:

 

#include "Arduino.h"
#include "Xxx06.h"
void xxx06::xxx06() {
  extern  uint8_t data_in[10];
 ...
}

 

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

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

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

Как правило, в Ардуино "библиотекой" называется обычная пара *.h/*.cpp, которая в стандартном случае является обычной составляющей проекта.

При этом обычено:

- в *.h файле описываются все необходимые классы и структуры, а также функции, которые можно использовать в основной программе (в случае Ардуино - *.ino),

- в файле *.cpp или *.c записывается реализация того, что описано в *.h,

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

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

sadman41 пишет:

Впервые вижу такой экстравагантный способ ...

Определение такому способу я дал в самом последнем слове поста #7. ТС с ним не согласен, но это его проблема. Доказывать что-то я не буду. Зачем, когда человек сам всё знает и так уверен в себе? :)))

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

В строке  №11 используется тип STRto9100. Не вижу, чтобы он был где-то описан.

он описан в ino. вопрос как его описать и где? чтоб тут был понятен?

Определение такому способу я дал в самом последнем слове поста #7.

то, что кто-то дал какое-то опрделение не означает того, что это небудет работать, это означает, что кому-то просто не нравится, или кто-то не может ответить как это сделать

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

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

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

Да я понимаю (думаю, что понимаю) отчего такая акробатика на трубах. Вы свою явовскую рефлексию пытаетесь протащить теми способами, которые на тот момент казались оптимальными - вызываете функцию "по имени", но не знаете, как туда внести данные, которые уже существуют в системе. И вот начинается пляска с extern.

Остановитесь. Сделайте на switch/if и простых вызовах функций с параметрами по ссылке. Заработает - начнете наворачивать диспетчера какие-нить. Я до сих пор сижу на уродском многостраничном switch-e, но он простой и эффективный как палка в условиях ограниченного по ресурсам МК. Надо выключить фичи - отхреначил ему половину ветвей условной компиляцией. Включить - активировал. Отлаживать тоже проще простого. А вот это таскание глобалов по классам и последующий поиск где и что туда вписалось вместо нормальных данных - это какое-то извращение.

Logik
Offline
Зарегистрирован: 05.08.2014

Та уже вынесете же свой STRto9100 в отдельный .h и .c. И подключайте его. И в Xxx06.h, и в .ino и везде где надо. 

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

Остановитесь. Сделайте на switch/if и простых вызовах функций с параметрами по ссылке.

ага вот будет лесенка из 30 switch/if

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

Вы к дачному домику тоже скоростной лифт будете сразу пристраивать?

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

JonHappy1 пишет:

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

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

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

Англичанин мистер Хопп 
Смотрит в длинный телескоп. 
Видит горы и леса, 
Облака и небеса. 
  
Но не видит ничего, 
Что под носом у него. 
Вдруг о камень он споткнулся, 
Прямо в речку окунулся. 

https://45parallel.net/daniil_kharms/plikh_i_plyukh.html

Это я к тому что если у Вас установлена среда Ардуино. То окрывайте и читайте как в ней организованы библиотеки.

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

Та уже вынесете же свой STRto9100 в отдельный .h и .c. И подключайте его. И в Xxx06.h, и в .ino и везде где надо.

покажи пример синтаксиса как это сделать/
у меня ругается
conflicting declaration 'typedef struct STRto9100 STRto9100'
 

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

Это я к тому что если у Вас установлена среда Ардуино. То окрывайте и читайте как в ней организованы библиотеки.

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

Logik
Offline
Зарегистрирован: 05.08.2014

Щя все брошу и пойду показывать как модуль оформлять и подключать. Чюдо! Те тока на заборе хер  писать! Ты ж нулевый в коде не взирая на язык. Вали читать букварь с картинками, реефлектор.

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

Ты ж нулевый в коде не взирая на язык.

я разве спорюс этим? мне надо сделать так, я в инет не нашёл , как это реализовать, вот и спрашиваю, ты здесь у же кучу написал, а напиши кусочек как правльно мне реализовать желаемое , и топик давно б закончился

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

"программист", бл-ть!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone]</p> <p>[quote=JonHappy1 пишет:

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

Точнее наверное регулярно читать чужой правильный код, осталось как-то определиться с этой самой правильностью

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

DetSimen пишет:

"программист", бл-ть!

т.е. ничего сказать по делу? покажи своё мастерство, чего ругаться? ну не делал та никто, это не значит, что так не возможно, я не зню как эта реализовать, ну если ты ПРОГРАММИСТ, тебе должно быть легко это сделать

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

ua6em]</p> <p>[quote=qwone пишет:

JonHappy1 пишет:

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

Точнее наверное регулярно читать чужой правильный код, осталось как-то определиться с этой самой правильностью

я не нашёл правильный код для моего варианта.

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

JonHappy1 пишет:
я просто учусь

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

JonHappy1 пишет:

у меня ругается
conflicting declaration 'typedef struct STRto9100 STRto9100'

Так не учатся.

JonHappy1 пишет:

он описан в ino. вопрос как его описать и где? чтоб тут был понятен?

Я Вас просил показать код. Вы его, оказывается, не показали. Мне доагдываться, что у Вас там и как? Не буду. Хрустальные шары здесь запрещены.

И да, ну, мля, в 100500-ый раз повторяю за коллегами, ну сделайте Вы милость, прочитайте наконец K&R!

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

Цитата:
Я Вас просил показать код. Вы его, оказывается, не показали.

а это не код? http://arduino.ru/forum/programmirovanie/sozdanie-biblioteki-0#comment-376870

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

JonHappy1 пишет:

Цитата:
Я Вас просил показать код. Вы его, оказывается, не показали.

а это не код? http://arduino.ru/forum/programmirovanie/sozdanie-biblioteki-0#comment-376870

JonHappy1
Offline
Зарегистрирован: 11.06.2018
определения в ino

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

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


typedef struct {     //входная комада
  byte ws[2];
  char comm[5];
  char delim ;
  uint8_t data[10];
} in_comm;

typedef struct   {
  byte address;
  byte command;
  uint16_t reg;
  uint16_t data;
  uint16_t crc;
} STRto9100;
byte buf[8];

typedef struct {       
  byte address; //0x01
  byte command; //0x03
  byte size;    //0x02
  byte data_h;
  byte data_l;
  byte crc_h;
  byte crc_l;
} Response;
Response response; 
byte count_in = 0; 

uint8_t data_in[10]; 
uint8_t for_serv[12];  

 

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

код чего тогда?

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

Эти определения в .ino компилируются?

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

Если нет, то какая ошибка?

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

JonHappy1 пишет:

Цитата:
Я Вас просил показать код. Вы его, оказывается, не показали.

а это не код? http://arduino.ru/forum/programmirovanie/sozdanie-biblioteki-0#comment-376870

Простите, но это уже ни в какие ворота не лезет. Вы альтернативно одарены? По поводу того кода я Вам написал

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

В строке  №11 используется тип STRto9100. Не вижу, чтобы он был где-то описан.

Выяснилось, что оно у Вас описано где-то, в каком-то .ino, который Вы и не подумали показать. Как описано - ХЗ. Мне надо догадываться как Вы, с Вашей квалификацией, исхитрились его описать? Это Вы называете "показать код"?

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

не только компилируется, нои  прекрассно работает

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

JonHappy1 пишет:

определения в ino

ну, слава Богу!

Ну и где здесь описан тип данных STRto9100? Переменную с таким именем вижу, типа - нет. Вы тип данных от имени переменной вообще-то отличаете?

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

c 19 по 25 строку

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

Как он тогда "прекрасно работает"? 

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

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

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

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

если всё в одном ino, товсё работает как надо