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

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

Такая же пляска но через классы

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

verLib.h

/*verLib.h*/
#ifndef verLib_h
#define verLib_h
#include <Arduino.h>
class Cl_ver {
  protected:
    byte v1;
    byte v2;
    byte v3;
  public:
    Cl_ver(byte a, byte b, byte c)
      : v1(a), v2(b), v3(c){}
    void viev();
};
extern Cl_ver ver;
#endif

verLib.cpp

/*verLib.cpp*/
#include "verLib.h"

void Cl_ver::viev() {
  Serial.print("ver:");
  Serial.print(v1);
  Serial.print(".");
  Serial.print(v2);
  Serial.print(".");
  Serial.print(v3);
  Serial.println();
}

Cl_ver ver(1, 8, 0); /*версия*/

 

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

2qwone! у меня несколько другая задача
http://arduino.ru/forum/programmirovanie/sozdanie-biblioteki-0?page=1#comment-377100

есть в памяти byte buf[8], я хочу его заполнить более наглядным образом

  st->address = d_in[0];
  st->command = 0x03;  
  st->reg = 0xED10;     
  st->data = 0x01;      


для этого я опрелелил в ino тип струттуры STRto9100.
и "накладываю" эту структуру на память buf.

дело в том , что типа такого Xxx06.h заголовочных файлов будет много, и прописывать в каждом структуру не ахти как.

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

Так напишите в еще одном структуру, а потом через include включай-те в каждый.

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

qwone пишет:

Так напишите в еще одном структуру, а потом через include включай-те в каждый.

где ты раньше был?????

как всё просто ....

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

Ну... хоть с десятого раза дошло, что все писали.

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

sadman41 пишет:

Ну... хоть с десятого раза дошло, что все писали.

посылали....

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

JonHappy1 пишет:

sadman41 пишет:

Ну... хоть с десятого раза дошло, что все писали.

посылали....

Гониш! Тебе черным по белому написано было.

Logik пишет:

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

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

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

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

в потоке г... трудно разглядеть что-то полезное.

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

JonHappy1 пишет:

в потоке г... трудно разглядеть что-то полезное.

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

andryn
Offline
Зарегистрирован: 08.06.2018

JonHappy1 пишет:

в потоке г... трудно разглядеть что-то полезное.

Откройте для себя препроцессор с++!

Запустите:

arduino-1.8.5\hardware\tools\avr\bin\avr-cpp.exe -CC -mmcu=atmega328p "-I..\..\arduino-1.8.5\hardware\arduino\avr\cores\arduino" "-I..\..\arduino-1.8.5\hardware\arduino\avr\variants\eightanaloginputs" TestLib.ino TestLib.out

И в файле TestLib.out увидите свой, собранный препроцессором код, с которым потом мучается компилятор.

Пожалейте компилятор, он старается как может.

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

давайте не будем дале ругаться.

есть следующий вопрос в продолжении темы.
в каком порядке происходит компиляция файлов подключаемых по include?

у меня есть в ino

#include "WebSocketClient.h"
WebSocketClient wsclient

#include "SendToServer.h"

;

в "SendToServer.h"  тут используется  wsclient.send()
если я правильно понимаю, ток моменту include "SendToServer.h", WebSocketClient- уже должн быть обработан?
и в  SendToServer.h я могу написатьextern  WebSocketClient wsclient; ?
но я получаю - 'WebSocketClient' does not name a type

если другой вариант

в WebSocketClient.h  есть



#ifndef WEBSOCKETCLIENT_H
#define WEBSOCKETCLIENT_H

в "глобальном " файле структур

#ifndef struct_h
#define struct_h
#include "WebSocketClient.h"

typedef struct STRto9100  {
  byte address;
  byte command;
  uint16_t reg;
  uint16_t data;
  uint16_t crc;
} ;


WebSocketClient wsclient;

#endif

 иесть ещё два файла .h в которых производится вызов #include "struct.h"
но тогда я получаю ошибку
 multiple definition of `wsclient'

 

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

JonHappy1 пишет:

я так понимаю - у Вас понтов больше , чем сповобностей что-то объяснять?

Таки да!

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

JonHappy1 пишет:

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

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

JonHappy1 пишет:

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

А вот это как раз совершенно правильное объяснение. И то, что Вы не понимаете базовой терминологии - ну, потому Вам и невозможно ничего объяснить. Вам уже ХЗ сколько раз сказали - читайте учебник от корки до корки. Никакие коды и примеры не помогут тому, что не знает базовых основ. Нужны систематические знания, тогда только коды с примерами смогут помочь.

JonHappy1 пишет:

т.е. Вы не хотите прото объяснить простое

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

JonHappy1 пишет:
я ведь не спорю , что вы знаете больше.
Ну, во первых, спорите. По любому замечанию кидаетесь доказывать свою правоту. Иначе этого топика бы не было после моего поста №7, где Вам прямо сказали, что так делать не нужно. А во-вторых, Вы даже не представляете себе насколько мне пофигу спорите Вы или нет :)))

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

JonHappy1 пишет:
... в каком порядке происходит компиляция файлов подключаемых по include? ..

Не знаю как у кого, а у меня попкорн кончился.

Вам УЖЕ правильно отписали: "откройте для себя ПРЕПРОЦЕССОР".

Препроцессор, это такая примитивная приблуда к компилятору, которая модифицирует ваш исходный ТЕКСТ файла и только ПОТОМ отдает его компилятору. И ТОЛЬКО. Ничего больше он не делает.

В каком порядке происходит компиляция? НИ В КАКОМ, ибо нет "порядка", а есть ОДИН файл с программой, который и компилируется.

Директива #include всего лишь вставляет текст из указанного файла в ЭТО МЕСТО. В результате все равно остается ОДИН файл (тот КУДА вставилось).

Директива #define всего лишь создает кусок текста, заменяющий указанное имя по ВСЕМУ файлу. Что указали в директиве как замену ТАК ОНО И БУДЕТ изменено по всему файлу. Это НЕ переменные или inline функции, это просто КУСКИ ТЕКСТА.

Директивы #ifdef, #elif, #end это всего лишь УСЛОВНЫЙ #include, который вставляет указанное место .. угу, тоже КУСКИ ТЕКСТА.

Есть ещё интересные директивы у препроцессора, которыми можно собирать весьма витееватый результат .. но это уже сами прочтете. И ещё: препроцессор НЕ рекурсивный, хотя так МОЖЕТ показаться.. :)

Отсюда:

Посмотрите на свои поделки и сами скажите какой файл получается видит компилятор (что и куда втыкает препроцессор).

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

вы должны уяснить 3 главных понятия :объявление, определение и вызов. Ну и что за чем должно следовать и что можно переставить местами. http://cppstudio.com/post/5291/     Это касается и структур и классов.

ПС: Это и есть кусочек базовых знаний. Но там еще море таких кусочков.

https://www.linux.org.ru/forum/development/8036747

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Разве в жабе оно не так же про "определения", "объявления" и "вызова"? Чел вроде как жабу знает .. хотя сомнения гложут уже не тока меня.. :)

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

Arhat109-2 пишет:

Р Чел вроде как жабу знает 

В смысле "Hello, world" запускал и вроде работало.

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

Человек хочет чтоб ему не сертификат пожаловали, а именную серебряную пулю в затылок от Российской Федерации. 

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

Arhat109-2 пишет:

Разве в жабе оно не так же про "определения", "объявления" и "вызова"? Чел вроде как жабу знает .. хотя сомнения гложут уже не тока меня.. :)

  Так не все Си-ки знают. Что объявление и определение можно разделить. И что можно объявить, потом вызвать, а затем определить это сравнимо чуду.

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

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

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

arduino-1.8.5\hardware\tools\avr\bin\avr-cpp.exe -CC -mmcu=atmega328p "-I..\..\arduino-1.8.5\hardware\arduino\avr\cores\arduino" "-I..\..\arduino-1.8.5\hardware\arduino\avr\variants\eightanaloginputs" TestLib.ino TestLib.out

как путик библиотекам указать

 

andryn
Offline
Зарегистрирован: 08.06.2018

JonHappy1 пишет:

как путик библиотекам указать

Откройте еще для себя:

arduino-1.8.5\hardware\tools\avr\bin\avr-cpp.exe -v --help

Обратите внимание на:

 -I <dir>                    Add <dir> to the end of the main include path

 

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015
// вставка текста из файла io.h в это место из каталога "по умолчанию" компилятора
// используются УГЛОВЫЕ скобки.
#include <io.h>

// вставка текста из файла my_io.h в это место из того же каталога,
// где лежит компилируемый файл. Используются двойные кавычки:
#include "my_io.h"

Типа так.

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

Arhat109-2 пишет:

// вставка текста из файла io.h в это место из каталога "по умолчанию" компилятора
// используются УГЛОВЫЕ скобки.
#include <io.h>

// вставка текста из файла my_io.h в это место из того же каталога,
// где лежит компилируемый файл. Используются двойные кавычки:
#include "my_io.h"

Типа так.

это понятно из первого открытия ino :)

вопрос был для командной строки препроцессора

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

в ino есть загрузка

#include "WebSocketClient.h"

затем создаюю объект класса

WebSocketClient wsclient;

как сделать доступным именно этот объект в в файлах cpp ?

в ino такой порядок

#include "WebSocketClient.h"
WebSocketClient wsclient;
#include "struct.h"
#include "Xxx06.h"
#include "SendToServer.h"
#include "SendTo9100.h"

а в SendToServer.h прописано extern wsclient;

т.е. к этому месту wsclient должен быть определён.  а компилятор ругается 'wsclient1' was not declared in this scope  при вызове в фале SendToServer.cpp wsclient1.send(.....)

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

перечитайте описание extern еще раз.

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

JonHappy1 пишет:

в ino есть загрузка

#include "WebSocketClient.h"

затем создаюю объект класса

WebSocketClient wsclient;

как сделать доступным именно этот объект в в файлах cpp ?

Блин, ну насколько ж надо лениться прочитать учебник, чтобы с каждой мелочью побираться на форуме?

Да напишите Вы в своём .cpp 

extern WebSocketClient wsclient;

и будьте счастливы. Только #include <WebSocketClient.h> не забудьте.

Только я уже говорил и повторяю - так писать - ужасное говнопроектирование. Готовьтесь ловить глюки в программе до посинения.

 

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

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

 Готовьтесь ловить глюки в программе до посинения.

Представляется мне, что этот крест - наш.

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

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

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

Таки думаете, что одними гвоздями дело не обойдется?

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

у меня в SendToServer.h прописано ещё

void SendToServer();
extern void SendTo9100(); 
extern uint8_t data_in[10];

и на это не ругается

 

перечитайте описание extern еще раз.     -  прочитал кучу, но не нашёл ответа

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

Интересно, как вы вообще на яве пишете. 

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

SendToServer.cpp

#include "SendToServer.h"
#include "WebSocketClient.h"
extern WebSocketClient wsclient;
void SendToServer() {

.......
wsclient.send((uint8_t*)(&for_serv), 13); //отправка буфера на сервер
}

компилятор

c:\Temp\arduino_build_858586\sketch\sketch_jun10a.ino.cpp.o (symbol from plugin): In function `wsclient':
(.text+0x0): multiple definition of `SendToServer()'
c:\Temp\arduino_build_858586\sketch\SendToServer.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

JonHappy1 пишет:

у меня в SendToServer.h прописано ещё

void SendToServer();
extern void SendTo9100(); 
extern uint8_t data_in[10];

и на это не ругается

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

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

JonHappy1 пишет:

SendToServer.cpp

#include "SendToServer.h"
#include "WebSocketClient.h"
extern WebSocketClient wsclient;
void SendToServer() {

.......
wsclient.send((uint8_t*)(&for_serv), 13); //отправка буфера на сервер
}

компилятор

c:\Temp\arduino_build_858586\sketch\sketch_jun10a.ino.cpp.o (symbol from plugin): In function `wsclient':
(.text+0x0): multiple definition of `SendToServer()'
c:\Temp\arduino_build_858586\sketch\SendToServer.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

Как сделать wsclient, доступным я Вам сказал. С ним всё нормально. А нахрена SendToServer() Вы в двух местах определили, хто ж Вас знает?

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

Ворота пишет:

JonHappy1 пишет:

у меня в SendToServer.h прописано ещё

void SendToServer();
extern void SendTo9100(); 
extern uint8_t data_in[10];

и на это не ругается

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

если я функцию SendToServer переношу в ino, причем есть ещё один файл Xxx06.h в котором

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


void xxx06();

extern void SendTo9100();
extern uint8_t data_in[10]; 
extern uint8_t for_serv[12];  
extern byte buf[8];

#endif

то все и компилируется и работает

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

JonHappy1 пишет:

а в SendToServer.h прописано extern wsclient;

т.е. к этому месту wsclient должен быть определён.  а компилятор ругается 'wsclient1' was not declared 

Застрелиться и не встать!

Ну, определён wsclient, а wsclient1 то тут при чём?

Или в Яве можно определить перемнную "a", а всякие "а1" и "а2" она сама доопределяет?

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

это опечатка тут

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

JonHappy1 пишет:

если я функцию SendToServer переношу в ino, причем есть ещё один файл Xxx06.h в котором

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


void xxx06();

extern void SendTo9100();
extern uint8_t data_in[10]; 
extern uint8_t for_serv[12];  
extern byte buf[8];

#endif

то все и компилируется и работает

Опять огрызок кода. Слушай, иди наxyй. Задрал уже.

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

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

Это -> в Сургут()

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

JonHappy1 пишет:

это опечатка тут

В таком случае, так не бывает. Значит Вы как всегда.

1. накосячили в коде
2. не выложили код.

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

Если Вам лень не только читать учебник, но даже выкладывать код, то я присоединяюсь к Воротам.

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

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

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

DetSimen,

в Бельгии есть город Huy (без шуток, реально - можете в гугле проверить). Я там был в 1988 в составе делегации и нас прингласили на прём к мэру. Мэр подарила нам всем серебрянные тарелки и галстуки с крупно написанным названием города. Галстук я тогда тестю передарил. Кажется он его так ни разу и не надевал :))))

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

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

 Галстук я тогда тестю передарил.

Ахах :) Кастую этот галстук в подарок топикстартеру :) :) :)

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

Опять огрызок кода. Слушай, иди наxyй. Задрал уже. это весь файл Xxx06.h

это весь файл Xxx06.cpp

#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;    )
  SendTo9100();
  
  memcpy(for_serv, &"xxx06u|     ", 12);  

}

они отличаются тем что в одном надо исполивать  объект из ino., а этот работает без проблем

есть ещё

SendTo9100.h

#include <Arduino.h>
#ifndef SendTo9100_h
#define SendTo9100_h
#include "struct.h"

void SendTo9100();
extern void SendTo9100();
extern uint8_t data_in[10];  //место для входных данных с сервера
extern uint8_t for_serv[12];  //место для данных отправляемых на сервер
extern byte buf[8];//место для хранения данных для отправки на устройство

#endif

SendTo9100.cpp

#include "SendTo9100.h"


void SendTo9100() {

  ......
  Serial.write(buf, 8);  

}

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

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

Упоротый. Ещё и слепошарый. Не, из принципа по делу ничего писать не буду - буду тупо отсылать читать учебник по С++. Может, проймёт, хотя, судя по всему - навряд ли.

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

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

вот вместо этого

перечитайте описание extern еще раз.

написать это

Да напишите Вы в своём .cpp 

extern WebSocketClient wsclient;

и будьте счастливы. Только #include <WebSocketClient.h> не забудьте.

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

ЕвгенийП! спасибо, вот только такого использования я не нашёл.

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

Читай учебник С++, идиот!

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

JonHappy1 пишет:

вот вместо этого

перечитайте описание extern еще раз.

Свои претензии можете направлять в а/я 666 или на Королёва-12 (передача "В гостях у сказки"). Я вам ничего не задолжал, слава богу.

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

DIYMan пишет:
Страшно жить, пиздец как страшно: когда представишь, что где-то вот так же учится хирург, например. Кругом одни ущербы, поколение пепси, млять.
  Уже не страшно. Сейчас все новые хирурги такие. Так что если хирург сказал в морг, значит в морг.

ПС: Похоже в будущем можно будет доверять операции роботам-хирургам.