Объясните по функциям

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Не могу найти информацию.

Есть отличия в том где объявляется функция ?

А то где то до основного цикла пишут, где то после него.

Разница вообще есть ?

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

Функция должна объявлятся до её вызова.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Однако в обоих случаях работает.

Компилятор исправляет ?

SLKH
Offline
Зарегистрирован: 17.08.2015

Kakmyc пишет:

Однако в обоих случаях работает.

Компилятор исправляет ?

Некоторые компиляторы, которые поумнее, находят функцию в любом месте текста. Другие не находят.

 

 

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

Kakmyc пишет:

Однако в обоих случаях работает.

Компилятор исправляет ?

правильно обьявлять до первого вызова. Тот факт, что в Ардуино "сойдет и так" - это поблажки для чайников.

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

Это не столько поблажки, сколько потенциальный косяк, особенно если функция принимает параметром объект класса описанный в скетче... по крайней мере раньше такая "поблажка" приводила к очень неожиданным ошибкам. Не знаю, может уже поправились, но думаю "вряд ли".

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

Arhat109-2 пишет:

Это не столько поблажки, сколько потенциальный косяк, особенно если функция принимает параметром объект класса описанный в скетче...

вероятнее всего авторы не предполагали, что "чайники" будут передавать обьекты в функции :)

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

ИДЕ пользуются разные люди, не обязательно "чайники". Кофейники и самовары - тоже вполне могут .. а последние и не такое выделывают.. ;)

SLKH
Offline
Зарегистрирован: 17.08.2015

Есть разные ругательные слова типа "препроцессор", "прекомпилятор" и т.п.

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

 

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

SLKH пишет:

Некоторые компиляторы, которые поумнее, находят функцию в любом месте текста. Другие не находят.

Нет, Вы ошиблись. Никакие не находят. Это жёстко прописано в стандарте языка.

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

Kakmyc пишет:

Компилятор исправляет ?

Не компилятор, а ардуино IDE, но не любая. В некоторых версиях такие вольности не проходят.

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

Kakmyc пишет:

Однако в обоих случаях работает.

Компилятор исправляет ?

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

Привикайте делать сразу правильно.

SLKH
Offline
Зарегистрирован: 17.08.2015

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

SLKH пишет:

Некоторые компиляторы, которые поумнее, находят функцию в любом месте текста. Другие не находят.

Нет, Вы ошиблись. Никакие не находят. Это жёстко прописано в стандарте языка.

Ну и плохо. Чем тут гордиться?

Ещё вопрос: в стандарте какого именно языка?

"Язык программирования устройств Ардуино основан на C/C++" - т.е. утвержденный стандарт для этого языка скорее отсутствует?

 

 

SLKH
Offline
Зарегистрирован: 17.08.2015

Jeka_M пишет:

Kakmyc пишет:

Однако в обоих случаях работает.

Компилятор исправляет ?

Нет, это разработчики Arduino IDE сделали "медвежью услугу" новичкам. Они добавили в IDE костыль, который перед компиляцией (вроде препроцессор?) переносит объявление всех функций наверх. И компилятору скармливает уже правильный код. Поначалу этого костыля в IDE не было, потом его добавили, а потом снова убрали в новых версиях... 

в 1.8.6 пока жив.

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

SLKH пишет:

Ну и плохо. Чем тут гордиться?

ну, плохо или хорошо - вопрос спорный, а насчёт "гордиться", а кто тут чем-то гордится? Это язык - он такой и всё тут. Например, в языке JavaScript наряду с операцией "==", есть ещё и "===", а в С++ такого нет. Это, по-Вашему, повод кому-то чем-то гордиться? Это примерно как мальчики гордятся тем, что у них, в отличие от девочек, писька есть.

SLKH пишет:

"Язык программирования устройств Ардуино основан на C/C++" - т.е. утвержденный стандарт для этого языка скорее отсутствует?

Такого языка не существует в природе. Ардуино программируется на С или на С++ (в штатном IDE). А стандаты С и С++ в природе существуют. Причём объективно - т.е. независимо от того знаем мы об этом или нет.

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

SLKH пишет:

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

Если бы она ещё при этом не косячила и делала синтаксически верный код ошибочным. А она, к сожалению, это делает.

SLKH
Offline
Зарегистрирован: 17.08.2015

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

SLKH пишет:

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

Если бы она ещё при этом не косячила и делала синтаксически верный код ошибочным. А она, к сожалению, это делает.

Ну так это конкретные косяки конкретной программы, а не неприемлемая концепция.

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

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

 

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

SLKH пишет:
Я имхую, что текст должен быть удобен для писателя/читателя, а препроцессор на первых проходах должен его транслировать в вид, пригодный собственно компилятору.
Исходник должен быть изначалено удобен для компилирования, а потом уже для чтения. Но если текст не возможно скомпилировать, то точно тогда и программа не заработает. 

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

SLKH пишет:

Ну так это конкретные косяки конкретной программы, а не неприемлемая концепция.

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

SLKH пишет:

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

Значительно больше. Намного.

SLKH пишет:

Одна из сект считает упоминанию функций в тексте программы до их описания в том же тексте смертным грехом, вписала это в свою священную книгу, адепты грозят страшными карами (см. выше). А многие другие конфессии 

А вот это совсем не так. Языки (вернее, группы языков) - это не объект веры, это научные направления и там всё определяется концепциями, заложенными в основу языка, а не субъективным желанием

SLKH пишет:

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

Это пожалуйста. Ради Бога. Пишите прекомпилятор. Это будет сложнее, чем написать компилятор, но это возможно. Если Вы считаете это правильным - делайте. Можете, также, создать свой язык и написать компилятор с него. Всё в Ваших руках.

 

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

qwone пишет:

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

Это Ваше мнение и Вы имеете право его иметь. 

У меня вот - другое. Я скорее согласен с SLKH, программа должна быть в первую очередь понятна человеку.

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

ЕвгенийП пишет:
У меня вот - другое. Я скорее согласен с SLKH, программа должна быть в первую очередь понятна человеку.
Сначало все же пытаются разработать концепцию языка удобную к компиляции, а потом уже понятную обученому человеку. Иначе ну ни как не получится скомпилировать программу. Но человек изначально не заточен учится, вот и приходится создавать среды посредники, что бы человек все же мог написать кое-как рабочий код. 

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

Да, нет, обычно процедура такая: 

1. сначала появляется концепция языка и рождается один-два эзотерических языка - чистая концепция. В большинстве своём такие языки остаются известными только специалистам, но крайне редко всё же вылазят на "публику" (например, Лисп, Хаскел, Питон, Рефал - это как раз языки-концепции). В какой-то мере туда же Паскаль, хотя он много потерял на этапе "выхода в свет" (см. следующий шаг).

2. иногда (весьма нечасто) таким новым языком начинает интересоваться крупная корпорация, желающая оснастить крутой новинкой свой новый суперкомпьютер или ещё чего. Вот здесь у языка появляется реальный шанс стать "общеизвестным", но тут начинает период жестоких торгов и компромиссов. Вот как раз на этом этапе (а не на первом) всплывает требование к быстрой и эффективной компиляции. Обычно маркетологи требуют выбросить из языка то, что невозможно (или трудно) эффективно скомпилировать, а заодно добавить "привычные для разработчиков средства" даже, если последние идут вразрез с концепцией языка и убивают его идею. Примеры таких уродливых компромиссов - появление goto в Паскале и исчезновение прототипного наследования в Java.

3. Бывают, конечно, и исключения. Например, очень повезло Брендону Эйху, его группе поставили задачу сделать простой язык для описания коротких сценариев и в его (его группы) работу не лезли. Не лезли, отчасти потому, что в компании не было специалистов-язычников, способных полезть. И ребята развернулись. Они сделали язык, на котором просто пишутся простые сценарии (чего и хотел заказчик), но если копнуть глубже - в языке столько всего, о чём заказчик и не подозревал, не зная таких слов :) В нём даже не одна концепция, как в эзотерических языках, а несколько. Парни впихнули в него всё, что знали и всё, что им нравилось! Именно поэтому язык называют "мультипарадигменным". То, что они тогда сделали, сегодня известно под именами: JavaScript, ECMA-Script, Action-Script и т.д. - это, на сегодняшний день, самый продвинутый ООП язык из всех имеющих хоть сколько-нибудь широкое распространение. В нём есть всё, что есть во всех этих явах и сиплюсплюсах, и многое другое, что этим языкам и не снилось. Разумеется, такой язык не мог бы появиться, если бы над разработчиками стояли маркетологи с их вечными требованиями эффективности и привычности.

SLKH
Offline
Зарегистрирован: 17.08.2015

qwone пишет:

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

  т.е. правильно так:

0x55 0x89 0xe5 0xe8 0xfc 0xff 0xff 0xff

0x83 0xf8 0x41 0x75 0x0d 0x68 0x00 0x00

0x00 0x00 0xe8 0xfc 0xff 0xff 0xff 0x83
0xc4 0x04 0xb8 0x00 0x00 0x00 0x00 0x89
0xec 0x5d 0xc3
 
А остальное из-за человеческой тупости?
ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

SLKH пишет:
т.е. правильно так:

0x55 0x89 0xe5 0xe8 0xfc 0xff 0xff 0xff

Вы не поверите, на заре моей карьеры я писал именно так (только коды были восьмиричными, а не шестнадцатеричными) для машины М-220 :))))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Я вот заявлю на "правах" ТС :-),
Намного удобнее когда функции идут после основного цикла.
Ибо они всегда проверяются отдельно и в 95% случаях не требуют отладки.
Но при этом иногда растягиваются на 100500 строк кода и тогда крайне неудобно скакать между сетапом и лупом.
Куда приятнее и проще , когда они рядом.
До сих пор не понял, почему в arduino ide нет навигатора.
В мобильной версии есть, очень удобная штука.

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

Kakmyc пишет:
Я вот заявлю на "правах" ТС :-)

Ох, рано Вам такие вещи заявлять. Но я сегодня усталый, ленивый и добрый, так что нет проблем, давайте поболтаем.

Kakmyc пишет:
Намного удобнее когда функции идут после основного цикла.

Удобство вопрос привычки. А вот то, что это противоречит концепции языка С - это да. Пишите на другом языке - на том JavaScript - Вам будет удобно.

Kakmyc пишет:
и в 95% случаях не требуют отладки.

Ой! Я конечно сегодня добрый и усталый, но другим Вы такого не говорите. А то, чего доброго, все куры со смеху передохнут, из чего тогда будете омлет на завтрак делать?

Kakmyc пишет:
при этом иногда растягиваются на 100500 строк кода

Открою Вам страшный секрет, который знают только посвящённые высших степеней, только никому не говорите, что я проболтался: скетч может состоять из нескольких файлов - хоть каждую функцию в свой отдельный файл пихайте. Все файлы будут коротенькими и в каждый момент, Вы будете видеть только тот кусочек кода с котором работаете. Например, любой мой проектик для авр-ки никогда не состоит из менее, чем десятка файлов. В одном живут все опредения пинов (он у меня  всегда называется Pinout.h), в другом просто пачка include'ов, которые нужны везде, так чтобы не таскать их, ну и так далее. Меньше десятка файлов никогда не получается.

Kakmyc пишет:
До сих пор не понял, почему в arduino ide нет навигатора.

Потому что, это простая бесплатная среда. Возьмите Visual Studio (даже бесплатную версию) там есть всё, что можно придумать.

 

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

ЕвгенийП пишет:
Это Ваше мнение и Вы имеете право его иметь. У меня вот - другое. Я скорее согласен с SLKH, программа должна быть в первую очередь понятна человеку.

Любой клиент может получить автомобиль выкрашенный в тот цвет, в который он хочет — до тех пор пока этот цвет — чёрный. 
Генри Форд

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

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

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

Да? Ну-ну. А если вот так, будут программы легко читаться?

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

ЕвгенийП пишет:
Да? Ну-ну. А если вот так, будут программы легко читаться?

Да же так читают 

И не надо показывать тот дряной язык. После языка программирования Программирумых калькуляторов (https://forum.worldofwarships.ru/topic/54036-%D0%BF%D1%80%D0%BE%D0%B3%D1... )приведеный вами язык ясен как толковый словарь.

Или это http://mnc.ru/?path=./cpu/&file=p22.src

SLKH
Offline
Зарегистрирован: 17.08.2015

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

SLKH пишет:
т.е. правильно так:

0x55 0x89 0xe5 0xe8 0xfc 0xff 0xff 0xff

Вы не поверите, на заре моей карьеры я писал именно так (только коды были восьмиричными, а не шестнадцатеричными) для машины М-220 :))))

почему не поверю? у меня было увлекательное программирование 4004 для болгарской счетно-фактурной машины. со стиранием ультрафиолетовой лампой.

 

а потом прошивка ПЗУ на 556РТ для супер-эвм на 8080 (многоплатное чудо по мотивам Радио-86, но круче), тумблерами, по одному на бит.

leks
Offline
Зарегистрирован: 22.10.2017

Прощения, что вклиниваюсь, но по теме возник злободневный вопрос: писал скетч, в нём фунукция, "теперь весь скетч" хочется в функцию - допустима ли такая "матрёшка по ним"?  

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

leks пишет:

Прощения, что вклиниваюсь, но по теме возник злободневный вопрос: писал скетч, в нём фунукция, "теперь весь скетч" хочется в функцию - допустима ли такая "матрёшка по ним"?  

Если сможете ее реализовать и компилятор не даст ошибок, то допустистимо.

Ну и шифровка.  Мне нужна деталька, которая делает ,то что мне надо. Допустимо ли эта деталька  в виде одной детальки или надо куча деталек собраные в один узел.

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

Если вопрос ко мне, то я его не понял.

leks
Offline
Зарегистрирован: 22.10.2017
void f_1 (int k)
{
 void f_2 (int k1) 
{
}
  }

   Вот такая желалка.

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

leks пишет:

void f_1 (int k)
{
 void f_2 (int k1) 
{
}
  }

   Вот такая желалка.

И?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ему самому лень проверить :-)

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

Вы хотите использовать вложенные функции? Вообще-то, в языке такого нет, но GNU-расширение это поддерживает. Хотите - пользуйте. Я даже не спрашиваю, нафига Вам это надо (не моё дело), я только поинтересуюсь, а что засунуть эти две строчки в IDE, запустить и посмотреть, вместо того, чтобы вопросы задавать религия не позволила?

leks
Offline
Зарегистрирован: 22.10.2017

"И" в том смысле пробовать так или не надо потому что нельзя. 

leks
Offline
Зарегистрирован: 22.10.2017
///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч №3 две цифры по установке потенциометром //////////////////////////////
#include <Servo.h> // подключение библиотеки Servo

Servo servo1;//указываем сервопривод основного поворота (при увел. угла - поворот рычага ВЛЕВО)
Servo servo2;//указываем сервопривод дополнительного поворота (при увел. угла - поворот рычага ВПРАВО)
Servo servo3;//указываем сервопривод подъёмника (при увел. угла - поворот рычага ВВЕРХ) 
int a01=70;//начальный угол
int a02=75;
int a03=125;
int da1=15;int da2=50;//переменные задающие изменение углов
int a1;//переменные хранения текущих углов поворота
int a2;
int a3;
int r=1;//счётчик прохода программы в loop()
int n=20;// единица временного интервала
int j;// переменная для выбранной цифры

int tablB[70]={1,1,1,1,1,1,0, 
               0,0,0,1,1,0,0,
               1,0,1,1,0,1,1,
               0,0,1,1,1,1,1,
               0,1,0,1,1,0,1,
               0,1,1,0,1,1,1,
               1,1,1,0,1,1,1,
               0,0,1,1,1,0,0,
               1,1,1,1,1,1,1,
               0,1,1,1,1,1,1,};//коды цифр от 0 до 9 
void setup()
{
servo1.attach(5);// подключаем переменную servo к соответствующему выводу платы Ардуино
servo2.attach(6);
servo3.attach(7);
servo1.write(a01);//начальная установка положения 
servo2.write(a02);
servo3.write(a03);
delay(2000);
}
void loop()
{
if (r<3)// условие числа рисуемых цифр
{int tablA[12]={a01,a02, a01+da2/4,a02+da2/2, a01+da2/2,a02+da2, a01+da2/2-da1,a02+da2, a01+da2/4-da1,a02+da2/2, a01-da1,a02};//данные угловых координат точек сегментов
a3=a03;
j=analogRead(A0)/108;// выбор-считывание установленной на потенциометре цифры
////////////////////////////////   1   ////////////////////////////////
a2=a02;a1=a01;servo2.write(a2);servo1.write(a1);delay(50*n);
if (tablB[(7*j)+0]==1){f_(1);}
while(a2<tablA[3])
{servo2.write(a2);a2=a2+2;a1=a1+1;servo1.write(a1);delay(n);}
a1=tablA[2];a2=tablA[3];
f_(0);delay(50*n);
///////////////////////////////    2    /////////////////////////////////
if (tablB[(7*j)+1]==1){f_(1);}
while(a2<tablA[5])
{servo2.write(a2);a2=a2+2;a1=a1+1;servo1.write(a1);delay(n);}
a1=tablA[4];a2=tablA[5];
f_(0);delay(50*n);
///////////////////////////////    3    /////////////////////////////////
if (tablB[(7*j)+2]==1){f_(1);}
while(a1>tablA[6])
{a1=a1-1;servo1.write(a1);delay(n);}
a1=tablA[6];
f_(0);delay(50*n);
///////////////////////////////    4    /////////////////////////////////
if (tablB[(7*j)+3]==1){f_(1);}
while(a2>tablA[9])
{servo2.write(a2);a2=a2-2;a1=a1-1;servo1.write(a1);delay(n);}
a1=tablA[8];a2=tablA[9];
f_(0);delay(50*n);
///////////////////////////////    5    /////////////////////////////////
if (tablB[(7*j)+4]==1){f_(1);}
while(a2>tablA[11])
{servo2.write(a2);a2=a2-2;a1=a1-1;servo1.write(a1);delay(n);}
a1=tablA[10];a2=tablA[11];
f_(0);delay(50*n);
///////////////////////////////    6    /////////////////////////////////
if (tablB[(7*j)+5]==1){f_(1);}
while(a1<tablA[0])
{a1=a1+1;servo1.write(a1);delay(n);}
a1=tablA[0];
f_(0);delay(50*n);
/////////////////////////////// (1)повтор-проход /////////////////////////////////
while(a2<tablA[3])
{servo2.write(a2);a2=a2+2;a1=a1+1;servo1.write(a1);delay(n);}
a1=tablA[2];a2=tablA[3];
f_(0);delay(50*n);
///////////////////////////////    7    /////////////////////////////////
if (tablB[(7*j)+6]==1){f_(1);}
while(a1>tablA[8])
{a1=a1-1;servo1.write(a1);delay(n);}
a1=tablA[8];
f_(0);delay(50*n);

r=r+1;a01=a01-da1-5;
}
}
//////функция поднимания-опускания маркера (значения аргумента 0 и 1 соответственно)/////
void f_(int k)
{
  while (a3>85&&k==1)
  {servo3.write(a3);a3=a3-1;delay(n);}if(k==1){a3=85;}
   while (a3<125&&k==0)
  {servo3.write(a3);a3=a3+1;delay(n);}if (k==0){a3=125;}
  }

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

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

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

leks
Offline
Зарегистрирован: 22.10.2017

Понял - нельзя... Будем искать с перламутровыми пуговицами...

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

leks пишет:

Понял - нельзя... 

Ну, вообще-то, в посте #36, я Вам писал, что можно, только надо GNU расширения включить (если они не включены).

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Может лучше классы разучить? Квон сейчас подтянется и объяснит...

leks
Offline
Зарегистрирован: 22.10.2017

Ой,.. не знаю... не хрена я не знаю. Проще функции строки навставлять вместо f_(0) и  f_(1), а потом "огород этот в забор пихать".

leks
Offline
Зарегистрирован: 22.10.2017

или классом заморочится? 

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

leks пишет:

Ой,.. не знаю... не хрена я не знаю. Проще функции строки навставлять вместо f_(0) и  f_(1), а потом "огород этот в забор пихать".

leks пишет:

или классом заморочится? 

Это всего лишь инструменты, как пила и молоток. Но для изготовления хотя бы стола надо уметь представить какой стол вы хотите, а не просто пилить и стучать. А там далее куда кривая выведет.

ПС: Да и вашу задачу можно реализовать с помощью .... цифрового автомата. Ведь как просто было бы написать . Printer.print("0123456789");  И все заработало.

leks
Offline
Зарегистрирован: 22.10.2017

Добрался до букав со своей писалкой, гнетёт такой вопрос (в отличии от цифр) - как их задавать переменной, неужели под номерами?

///////////// МАНИПУЛЯТОР ДЛЯ ГРАФИЧЕСКИХ ИЗОБРАЖЕНИЙ скетч №5 буквы алфавита  //////////////////////////////
#include <Servo.h> // подключение библиотеки Servo

Servo servo1;//указываем сервопривод основного поворота (при увел. угла - поворот рычага ВЛЕВО)
Servo servo2;//указываем сервопривод дополнительного поворота (при увел. угла - поворот рычага ВПРАВО)
Servo servo3;//указываем сервопривод подъёмника (при увел. угла - поворот рычага ВВЕРХ) 

int a=60;//начальный угол
int b=75;
int a03=125;

int da=16;int db=50;//переменные задающие величину изменения углов

int A; int B; //переменные для текущих значений углов поворота сервоприводов
int a3=a03;
int i;//счётчик
int r=1;//счётчик числа рисуемых букв
int n=15;// единица временного интервала
int j=0;// переменная для выбранной буквы
int tablA[18]={a,          b,
               a+db/4,     b+db/2,
               a+db/2,     b+db,
               a+db/2-da,  b+db,
               a+db/4-da,  b+db/2,
               a-da,       b,
               a+db/2-da/2,b+db,
               a+db/4-da/2,b+db/2,
               a-da/2,     b }; // координаты узловых точек сегментов

int tablB[528]={0,0,1,0,0,1,0,0,0,1,0,0,1,1,0,0, //А//
                1,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0, //Б//
                1,0,0,1,0,0,1,1,0,0,1,1,1,0,0,1, //В//
                1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0, //Г//
                0,0,1,0,0,1,1,1,0,0,0,0,1,1,0,0, //Д//
                1,0,0,1,0,0,1,1,1,0,1,1,0,0,0,0, //Е//
                0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1, //Ж//
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//коды сегментов-букв 
int K=0;             
void setup()
{
//Serial.begin(9600);
servo1.attach(5);// подключаем переменную servo к соответствующему выводу платы Ардуино
servo2.attach(6);
servo3.attach(7);
servo1.write(a);//начальная установка положения 
servo2.write(b);
servo3.write(a03);
delay(1000);
}
//////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
if (K!=1)
{
  f_(0);
////////////////////////////////   1   ////////////////////////////////
A=tablA[0];B=tablA[1];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+0]);fv_();f_(0);
////////////////////////////////   2   ////////////////////////////////
A=tablA[16];B=tablA[17];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+1]);fv_();f_(0);
////////////////////////////////   3   ////////////////////////////////
A=tablA[10];B=tablA[11];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+2]);fv_();f_(0);
////////////////////////////////   4   ////////////////////////////////
A=tablA[2];B=tablA[3];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+3]);fv_();f_(0);
////////////////////////////////   5   ////////////////////////////////
A=tablA[14];B=tablA[15];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+4]);fv_();f_(0);
////////////////////////////////   6   ////////////////////////////////
A=tablA[8];B=tablA[9];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+5]);fv_();f_(0);

////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////   7   ////////////////////////////////
A=tablA[0];B=tablA[1];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+6]);fg_();f_(0);
////////////////////////////////   8   ////////////////////////////////
A=tablA[16];B=tablA[17];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+7]);fg_();f_(0);
////////////////////////////////   9   ////////////////////////////////
A=tablA[2];B=tablA[3];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+8]);fg_();f_(0);
////////////////////////////////   10   ////////////////////////////////
A=tablA[14];B=tablA[15];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+9]);fg_();f_(0);
////////////////////////////////   11   ////////////////////////////////
A=tablA[4];B=tablA[5];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+10]);fg_();f_(0);
////////////////////////////////   12  ////////////////////////////////
A=tablA[12];B=tablA[13];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+11]);fg_();f_(0);

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////   13  ////////////////////////////////
A=tablA[14];B=tablA[15];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+12]);fdp_();f_(0);
////////////////////////////////   14  ////////////////////////////////
A=tablA[0];B=tablA[1];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+13]);fdp_();f_(0);

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////   15  ////////////////////////////////
A=tablA[14];B=tablA[15];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+14]);fdl_();f_(0);
////////////////////////////////   16   ////////////////////////////////
A=tablA[10];B=tablA[11];
servo1.write(A);servo2.write(B);delay(n);
f_(tablB[16*j+15]);fdl_();f_(0);
////////////////////////////////////////////////////////////////////////
K=1;
}
}
//////функция поднимания-опускания фломастера (значения аргумента 0 и 1 соответственно)/////
void f_(int k)
{
  while (a3>85&&k==1)
  {servo3.write(a3);a3=a3-1;delay(n);}if(k==1){a3=85;}
   while (a3<125&&k==0)
  {servo3.write(a3);a3=a3+1;delay(n);}if (k==0){a3=125;}
  }
  //////функция рисования отрезка вертикально вверх  /////
void fv_()
{
  int K1=0;
  while (K1<=db/2)
  {servo1.write(A);servo2.write(B);B=B+2;A=A+1;K1=K1+2;delay(n);}
  
  }
  //////функция рисования отрезка горизонтально вправо  /////
void fg_()
{
  int K1=0;
  while (K1<=da/2)
  {servo1.write(A);A=A-1;K1=K1+1;delay(n/2);}
  
  }
  //////функция рисования отрезка по диагонали  вправо-вверх  /////
void fdp_()
{
  int K1=0;
  
  while (K1<db/4)
{K1=K1+1;B=B+1;servo2.write(B);delay(n);}

servo1.write(A+db/4-da/2);delay(n);
K1=0;
while (K1<db/4)
{K1=K1+1;B=B+1;servo2.write(B);delay(n);}
  }
   //////функция рисования отрезка по диагонали  влево-вверх  /////
void fdl_()
{
  int K1=0;
  
  while (K1<3*db/16)
{K1=K1+2;B=B+3;A=A+2;servo2.write(B);servo1.write(A);delay(n);}

servo2.write(B);servo1.write(A);delay(n);

K1=0;
while (K1<3*db/16)
{K1=K1+1;B=B+1;A=A+1;servo2.write(B);servo1.write(A);delay(n);}
  }
 

 

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

leks, вы что хотите телеграф Шаппа сделать. http://litresp.ru/chitat/ru/%D0%A1/souchek-lyudvik/tam-gde-ne-slishno-golosa/5

Так его надо через цифровой автомат делать.

leks
Offline
Зарегистрирован: 22.10.2017

qwone пишет:

leks, вы что хотите телеграф Шаппа сделать. http://litresp.ru/chitat/ru/%D0%A1/souchek-lyudvik/tam-gde-ne-slishno-golosa/5

Так его надо через цифровой автомат делать.

Нет, программа буквы рисует по аналогии с 16-сегментным индикатором, переменной-счётчику j задаём 0, рисуем А и т.д. - это не автомат? Просто хотелось задавать русское А (наше родное) :)

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Знаете, что такое таблица ASCII? Вот делайте массив размерностью в количество символов ASCII, загоняйте туда свои инструкции для механических рук и потом все просто: rukaRisui(tablB['A']). Но учитывайте то, что оперативная память у вас сразу испарится (если вы продолжите бит кодировать байтом). А так же то, что ваши родные русские буквы могут приходить в скетч как минимум в трех кодовых страницах.

leks
Offline
Зарегистрирован: 22.10.2017

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

tablA[]; пришлось опустить в loop(), а иначе нет перехода на новую букву - ресурс динамической памяти резко упал, не вижу как проще сделать (как проще сделать?).

https://youtu.be/wylZenmxq4k