Ответы пользователя по тегу Программирование
  • Начало решения задач (глазами новичка)?

    makarenya
    @makarenya
    программист
    Начинать изучение программирования с зазубривания операторов бессмысленно. Для начала нужно выбрать язык. Рекомендую взять любой из списка:

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

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

    c#
    Активно продвигаемый Microsoft язык - является лидером в сфере приложений для Windows. И бэкэнды для сайтов на нём тоже очень здорово делаются. И он такой-же быстрый как и java

    swift
    Основной язык для iOS и macOs. Если у вас нет мака, то не вариант, ибо под другие ОС его не использовать. Он даже более быстрый чем c#/java

    Все перечисленные языки являются на сегодняшний день популярными и востребованными. А в отличии от C/C++ у них приемлемая сложность. Языки для веба в качестве старта не рекомендую, так как что-то вменяемое в веб можно сделать, изучив сразу: яызк для бэкэнда (тот же python или php), javascript для фронтенда а также html и css. И вам будет нужно знать это ВСЁ!

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

    И сам процесс обучения должен состоять из блоков: немгого поучили, попробовали это на практике, поучили - попрактиковались. Начните с hello world и развивайте дальше
    Ответ написан
  • Абсурдное выполнение условных операторов 3 раза в Arduino nanov3, как исправить?

    makarenya
    @makarenya
    программист
    https://www.arduino.cc/en/Serial/Read
    А точнее абзац

    Returns
    the first byte of incoming serial data available (or -1 if no data is available) - int

    метод read() возвращает прочитанные данные, если таковые есть и -1 - если данных нет.

    Исправьте код на следующий

    void loop() {
      analogWrite(col, xCol);
      xBaza = Serial.read();
      if(xBaza >= 0 && xBaza != xBaza0) {
        xBaza0 = xBaza;
        analogWrite(baza, xBaza);
        writes();
      }
    }
    Ответ написан
    Комментировать
  • Я слышал, что goto использовать НЕЖЕЛАТЕЛЬНО. А что насчет while(true)? В функции есть много if'ов, в которых есть return. Моветон ли while(true)?

    makarenya
    @makarenya
    программист
    Последний раз я использовал GOTO в QBasic (можете погуглить). Это был для меня первый язык программирования, а сам я учился в школе, и даже не в старших классах. Без него можно обойтись вообще всегда, хотя иногда это и не так уж и удобно. Но я видел неоднократно его использование в серьёзных проектах. Почти всегда он один единственный на несколько десятков файлов с кодом.

    Отказ от GOTO является одним из принципов структурного программирования. А ещё один его принцип - это единая точка выхода для любой конструкции. По сути - это отказ от return за исключеним случая, когда нужно вернуть какое-то значение в самом конце функции, а ещё и отказ от continue или break в циклах. И... вот так уже не делали ни в одной компании, где мне довелось работать, ни в одном opensource проекте, код которого мне доводилось смотреть.

    Причина, почему один принцип заучивается на зубок всеми программистами, а второй представляет из себя лишь повод посмеяться - это их цена. Программа, богатая на goto, очень быстро становиться нечитаемой, непредсказуемой и неподдерживаемой. Понять - что в ней происходит, становиться невозможно уже после пары сотен строк. А вот с return из середины функции, как и с break из середины цикла - цена невысока. Ими уже так просто программу в трэш не превратить. Читаемость и поддерживаемость не падает, в том числе, и при использовании бесконечных циклов. А в некоторых случаях без них никуда. К примеру, любая программа для микроконтроллера представляет из себя бесконечный цикл и без любой возможности выйти из него.

    Так что часто бесконечный цикл является возможностью сделать программу проще, и не дублировать строки кода лишний раз - то есть упростить понимание и поддерживаемость программы, а это куда как важнее слепому следованию старым принципам. С другой стороны - если вы используете бесконечные циклы едва ли не так часто, как и все остальные - то тут уже начинает появляться вопрос - достаточно ли вы хорошо ознакомлены с циклами в том языке, на котором вы пишите. Ведь очень часто даже самые нетривиальные конструкции и фичи решаются с помощью цикла for - он в данном случае крайне мощный (если разговор о c/c++/c#/...)

    PS. Выход из кучи вложенных циклов при помощи return из функции - самый простой способ ухода от необходимости в GOTO и одновременно отказа от оверхеда на лишние и ненужные условия. Используется всеми и "на ура"
    Ответ написан
    Комментировать
  • Нужно ли программисту изобретать велосипед?

    makarenya
    @makarenya
    программист
    Есть учебные велосипеды. Вы его сделали чтобы понять, как это всё работает. Я сам пару месяцев назад написал нейросетку, просто чтобы понять метод обратного распространения ошибки... Сетка работала весьма тормознуто, но работала же. Но тут речь о том, чтобы сделать, посмотреть и выкинуть.

    А есть ещё и велосипеды промышленные. И про них нужно знать одно - их нужно регулярно смазывать. Всегда хочется его сделать - это, как правило, интересно. Да ещё и решает поставленную задачу зачастую лучше, чем имеющиеся решения. Но:
    1. Это отнимет у вас время, причём гораздо больше, чем вам кажется на первый взгляд. Восхищаюсь теми ребятами, которые умеют правильно просчитывать время до получения реально работающего продукта, а не просто прототипа. Но среди программистов я таких не видел.
    2. Сторонние тулзы и библиотеки, в параллель к которым вы завелосипеделись, будут развиваться. Они будут уметь делать лучше, быстрее, поддерживать самые новые версии ОС и тех продуктов, с которыми вы работаете. Чтобы держаться с ними на равне и не кусать потом локти, что ваше творение ничего по сравнению с ними на текущий день не умеет - придётся тратить время на этот самый велосипед и в дальнейшем. А в случае с вопросами совместимости, то это уже жизненная необходимость. Сделали вы импортёр с Excel, а формат Excel взял и изменился - обновляйте импортёр, а то не будет работать весь ваш продукт, импортёр этот использующий.

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

    Хотя создание велосипеда для веб-проектов - это уже 3-й случай. В реалиях Российского сайтостроения - это велосипед на продажу с последующим убоем. Его сделал - и забыл. Сайт через 2-3 года умрёт сам вместе с велосипедом. Будет заменён новым сайтом, сделанным с нуля. Так что тут уже ответственность за велосипед минимальная - делайте на здоровье, вторую проблему вычёркивайте.

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

    В этом бизнесе выживают либо те, кто специализируется на очень больших и серьёзных проектах (вот только для этого нужно иметь имя и неплохой штат), либо те, кто собирают сайт как конструктор в течении пары дней.
    Ответ написан
    Комментировать
  • Как настроить мк AVR на частоту 1Мгц без кварцевого резонатора?

    makarenya
    @makarenya
    программист
    Если бы вы имели дело с ARM-ами, то могли бы настраивать частоту на лету. Какую захотел, такую и поставил прямо на месте через API CMSIS. Но тут у вас AVR, и частота задаётся через фьюзы. А ещё через фьюзы контроллер влёт превращается в кирпич, да так что без высоковольтного программатора (который та ещё редкость), МК обратно не оживить. И настройка частоты - это одна из тех вещей, неправильно значение которой может убить (почти) МК.
    Поэтому первый момент - никогда не ставьте/снимайте галочки там, где не уверены!

    Вот картинка настройки фьюзов в Atmel Studio
    0NNQy.jpg

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

    Самый нижний носит имя SUT_CKSEL, а через один над ним CKDIV8.

    Для начала SUT_CKSEL - у вас должен стоять один из вариантов INTOSC_8MHZ. И нет значения, какой именно. Все эти KCK, CK и MS указывают на время задержки между подачей питания и стартом МК, нужны лишь для случая работы от полудохлых батареек без контроллера питания. "Ускорить загрузку" ими тоже не удасться, речь идёт о значениях, меньших 0.1 секунды.
    Если у вас и так значение SUT_CKSEL начинается с INTSOC_8MHZ, то не трогайте там ничего. Убить МК вы сумеете, а лучше для вашей задачи вы всё равно не сделаете.
    Теперь проверьте наличие галочки CKDIV8. И вот она вам и нужна. Её нужно установить. Если она стоит, то вот эти самые 8мгц с внутреннего генератора делятся на 8. Итого - 1Мгц, то что вам и нужно!
    Хотя насколько я вспоминаю, эта галка прошивается на заводе, и во фьюзы вам лезть не нужно вообще.
    Если после нажатия на Read вы увидели, что SUT_CKSEL уже показывает на INTOSC_8MHZ..., а галка CKDIV8 уже стоит, то никуда больше не жмите и просто уйдите с этой страницы. Повторять не устану - любые необдуманные манипуляции здесь убъют ваш МК. Особенно опасными являются галки:
    RSTDISBL - поставьте её и без HVPP-программатора вы ничего с МК сделать не сумеете
    SPIEN - а вот её никак нельзя снимать, а то результат будет не менее плачевен.
    Ну и выбор любого EXTXOSC_... источника тактирования приведёт к тому, что ваш МК станет кирпичом до того, как вы подключите данный источник тактирования. Выбрали керамический резонатор - бегите в ЧипДип за таковым и парочкой конденсаторов, чтобы хотябы поставить фьюзы назад!

    А теперь по поводу того, что вы уже сделали:
    прописав:
    #define F_CPU 1000000
    или
    #ifndef F_CPU 1000000UL

    в реальности - совершенно равноправные строчки, вы тем самым указали всяким библиотекам (вроде того-же delay.h), что МК будет работать на частоте в 1Мгц. Дело в том, что метод delay(...) или любые другие методы, завязанные на реальное время или реальные временные интервалы без этой строчки ничего о этом самом времени не знают. Они могут лишь посчитать количество тактов МК. И когда вы указываете, что вам нужно пауза а 1сек, то на основании записи о частоте (на основании F_CPU) библиотека delay.h высчитывает количество тактов, которые нужно провисеть внутри функции, чтобы получить задержку в 1с (в вашем случае, разумеется идёт речь о миллионе тактов).
    Если эта настройка (F_CPU) не выполнена, или если она не отражает реальную частоту МК, то все функции ожидания и прочие будут работать несколько странно - то есть ждать либо большее либо меньшее чем запрошенное время.

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

    И ещё - датчик ds18b20 работает по протоколу single wire, аппаратной реализации на AVR этого протокола банально не существует, да и не нужна она то особо, при условии крайне низкой скорости самого протокола. А программным библиотекам должно быть не так уж и важно, какая там частота у МК. Поэтому мне кажется очень странным ваше желание получить частоту ровно в 1Мгц для взаимодействия с данным датчиком.
    Ответ написан
    Комментировать