#1 2017-10-15 14:37:19

mxigo
Учасник
Зареєстрований: 2017-10-15
Повідомлень: 10

як боротися з обрізанням ++

тільки спробував програмувати Ардуїно і спикнувся з неприятними моментами:
1) ділить на 0.
Наприклад:
int i;
i = 100 / 0;  // i = -1
i = 0 / 0;      // i = 0
i = -1 / 0;     // i = -1
i = -100 / 0; // i = -1

2)  Arduino IDE не підтримує збірку DEBUG версії (роблю це добавляючи -DDEBUG в hardware/arduino/avr/platform.txt).

3) не працює try cath trow, відповідно і с++ бібліотеки.

ЧИ Є ПОВНОЦІННИЙ С++ ДЛЯ ПРОГРАМУВАННЯ АРДУЇНО ?

Неактивний

#2 2017-10-15 16:48:02

Sima
Учасник
Зареєстрований: 2017-09-09
Повідомлень: 40

Re: як боротися з обрізанням ++

Язык программирования Arduino является стандартным C++ (используется компилятор AVR-GCC) с некоторыми особенностями, облегчающими новичкам написание первой работающей программы.
Ну вот скажите, как будет работать C++ библиотеки, возьмем например OpenGL, его не как использовать.

Что такое try cath trow?

Неактивний

#3 2017-10-15 16:51:19

Sima
Учасник
Зареєстрований: 2017-09-09
Повідомлень: 40

Re: як боротися з обрізанням ++

mxigo пише:

тільки спробував програмувати Ардуїно і спикнувся з неприятними моментами:
1) ділить на 0.
Наприклад:
int i;
i = 100 / 0;  // i = -1
i = 0 / 0;      // i = 0
i = -1 / 0;     // i = -1
i = -100 / 0; // i = -1

Скорее вот это что  я виделил красным это баг, а что зеленым то не ошибка

Остання редакція Sima (2017-10-15 16:52:08)

Неактивний

#4 2017-10-16 11:55:28

mxigo
Учасник
Зареєстрований: 2017-10-15
Повідомлень: 10

Re: як боротися з обрізанням ++

Sima пише:

Язык программирования Arduino является стандартным C++ (используется компилятор AVR-GCC) с некоторыми особенностями, облегчающими новичкам написание первой работающей программы.
Ну вот скажите, как будет работать C++ библиотеки, возьмем например OpenGL, его не как использовать.

Что такое try cath trow?


OpenGL - понятно. А наприклад контейнери (vector, list, stack, ..). В даний час змушений писати власний vector.

try catch throw - для обробки виключних ситуацій (зазвичай помилок). Це обрізання - зажорстко. Див.  https://habrahabr.ru/sandbox/28877/

Остання редакція mxigo (2017-10-16 12:01:48)

Неактивний

#5 2017-10-16 12:03:41

mxigo
Учасник
Зареєстрований: 2017-10-15
Повідомлень: 10

Re: як боротися з обрізанням ++

Sima пише:
mxigo пише:

тільки спробував програмувати Ардуїно і спикнувся з неприятними моментами:
1) ділить на 0.
Наприклад:
int i;
i = 100 / 0;  // i = -1
i = 0 / 0;      // i = 0
i = -1 / 0;     // i = -1
i = -100 / 0; // i = -1

Скорее вот это что  я виделил красным это баг, а что зеленым то не ошибка

Де баг? В arduino ide ?

Неактивний

#6 2017-10-16 12:33:55

mxigo
Учасник
Зареєстрований: 2017-10-15
Повідомлень: 10

Re: як боротися з обрізанням ++

І неподобаються мені бібліотеки, які пишуть до Ардуїною Напраклад взяти SoftwareSerial. Конструктор в нього такий:
SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false)
SortwareSerial може працювати тільки з пінами на платі ардуїно. А якшр мені потрібно щоб receivePin був на платі 74HC595. І все - SoftwareSerial ,безкорисна. І так багато чого, наприклад бібліотеки для дисплеїв теж жорстко привязуються лиш до пінів плати ардуїно (пінів то обмежено, а дисплеїв можемо захотіти декілька...).

Чому б не зробити тіпа так:

SoftwareSerial::SoftwareSerial(BinPin* receivePin, BinPin* transmitPin, bool inverse_logic = false);

/** Абстрактний клас для читання/записа значення сигнала з (в) цифрового піна.  */
class BinPin
{
    public:
        /** Повертає стан піна.
          * @return false - при LOW і true при HIGH. */
        virtual bool state() = 0;
   
        /** Встановлює HIGH рівень на піні. */
        virtual void setHigh() = 0;
   
        /** Встановлює LOW рівень на піні. */
        virtual void setLow() = 0;
   
        /** Змінює стан піна. */
        virtual void changeState() = 0;
   
        /** Цифрові порти можуть використовуватися на вхід або вихід сигналів.
        *  Зміна порта з ввода на вивід здійснюється за допомогою даного метода.
        * @param mode INPUT (ввід), OUTPUT (вивід).   */
        virtual void setPinMode(const uint8_t mode) = 0;
};

, тобто щоб SoftwareSerial працював з абстрактними пінами. Тоді в користувача SoftwareSerial буде можливість мати хоть і сотні SoftwareSerial портів в своєму проекті і ті SoftwareSerial порти можуть і незаймати піни плати ардуїно.


На даний час мій висновок про ардуїно такий:
РОЗРОБШИКИ АРДУЇНО ВИКИНУЛИ ВСІ ІНСТРУМЕНТИ (мається на увазі будівельні матеріали для програми), ЗАЛИШИЛИ ЛИШ ТІ, ЩО ПОТРІБНІ ДЛЯ МОРГАННЯ ЛАМПОЧКОЮ !

Остання редакція mxigo (2017-10-16 13:03:51)

Неактивний

#7 2017-10-16 12:37:00

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: як боротися з обрізанням ++

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

Неактивний

#8 2017-10-16 12:47:07

mxigo
Учасник
Зареєстрований: 2017-10-15
Повідомлень: 10

Re: як боротися з обрізанням ++

lkj пише:

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

Тому я і відкрив цю тему. По правилам матиматики ділення на ноль не можливе і каркулятори на ноль не ділять, а аРДУЇНО - ділить на ноль.

Може є хоча б якийсь "прапорець помилки ділення на ноль", про якого я не знаю?

Остання редакція mxigo (2017-10-16 12:49:17)

Неактивний

#9 2017-10-16 12:50:32

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: як боротися з обрізанням ++

Просто загляните http://arduino.ua/ru/prog/

Неактивний

#10 2017-10-16 13:05:08

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: як боротися з обрізанням ++

Да, так и есть. В данном случае компилятор обрабатывает как -1)))

Неактивний

#11 2017-10-16 13:22:07

mxigo
Учасник
Зареєстрований: 2017-10-15
Повідомлень: 10

Re: як боротися з обрізанням ++

Вячеслав Азаров пише:
mxigo пише:
Sima пише:

Язык программирования Arduino является стандартным C++ (используется компилятор AVR-GCC) с некоторыми особенностями, облегчающими новичкам написание первой работающей программы.
Ну вот скажите, как будет работать C++ библиотеки, возьмем например OpenGL, его не как использовать.

Что такое try cath trow?


OpenGL - понятно. А наприклад контейнери (vector, list, stack, ..). В даний час змушений писати власний vector.

try catch throw - для обробки виключних ситуацій (зазвичай помилок). Див.  https://habrahabr.ru/sandbox/28877/

Уважаемые, микроконтроллеры это микроскорические, по нынешеим меркам, компьютеры. А AVR - один из простейших процессоров. И весьма наивно желать иметь все библиотеки кода доступные на персональных компьютерах. Если хотите более детально изучить компиляторы Ардуино то вот они (с документацией): http://www.microchip.com/development-to … compilers)

по англійськи  sad

Неактивний

#12 2017-10-16 13:41:38

mxigo
Учасник
Зареєстрований: 2017-10-15
Повідомлень: 10

Re: як боротися з обрізанням ++

lkj пише:

Да, так и есть. В данном случае компилятор обрабатывает как -1)))

В нас недорозуміння. Я замітив, що коли ардуїно ділить на нуль, то результат буде -1. Но як "відділяти зерно від полови"? -1 може бути результатом ділення на нуль (в такому випадку "полова") а може бути результатом ділення не на нуль ("зерно").

Бачу лиш один вихід: кожну операцію ділення перевіряти чи не ділимо ми на нуль.

Неактивний

#13 2017-10-16 13:52:53

mxigo
Учасник
Зареєстрований: 2017-10-15
Повідомлень: 10

Re: як боротися з обрізанням ++

Вячеслав Азаров пише:
lkj пише:

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

Обычно в процессорах и программах, деление на ноль вызыввет подпрограмму обработки ошибок. В некоторых языках программирования предусмотрены специальные "магические" константы неопределенности и бесконечности. Однако поведение по умолчанию может зависеть от реализации библиотек конкретного компилятора, оставляя эту проблему программисту.
PS: При делении на ноль все калькуляторы показывают "E".


Згідний з Вами. І в Ардуїно потрібний якийсь із інструментів обробки помилок. Похоже його теж скоротили (нафіга, це ж не OpenGL).

Неактивний

#14 2017-10-16 13:53:05

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: як боротися з обрізанням ++

Правильно, перед делением проверять числа

Неактивний

#15 2017-10-16 14:00:17

mxigo
Учасник
Зареєстрований: 2017-10-15
Повідомлень: 10

Re: як боротися з обрізанням ++

lkj пише:

Просто загляните http://arduino.ua/ru/prog/

Дякую! Заглядав, добре що є хоча б Stream і що від нього Serial та ін. Це тішить..

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму