Как постичь непостижимое

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DetSimen пишет:

Слава Богу, сподобился таки я на старости лет узнать, что такое декомпозиция. Теперь понял хоть. :-)

Да ежелип ты был не за 5 тыщ км от Москвы, я б еще и самогончика налил!  На бооярышнике и рябинке, для сердца пользительного.

TD27T
Offline
Зарегистрирован: 08.04.2016

wdrakula пишет:

Ты ведь начинающий программист (и электронщик)

Два из двух мимо. Программист не начинающий. Не электронщик вообще, ковыряюсь в ардуинках изредка.

wdrakula пишет:

Так какого же хера ты влез со своим мнением? Оспорить профессионала? То, что тебе не стыдно, это ясно, это возрастное, ...но хоть смешно?
А что так агрессивно-то? Цивилизованные люди же, как-никак... 
Во-первых, в общем случае, если профессионал несёт херню, то почему бы его и не оспорить. Во-вторых, профессионалы - они на то и профессионалы, что новичками были довольно давно и забыли каково это.
 
Теперь по теме.
Грамотно писать читаемый и сопровождаемый код можно только медодом ДЕКОМПОЗИЦИИ, основы которого любезно изложил Евгений.
 
 
Я что-то где-то говорил против метода декомпозиции как такового? Я говорил, что не надо советовать его новичкам, потому что процедура эта не то чтобы очень простая. И требует весьма неплохо ориентироваться в возможностях и ограничениях и .... писал уже это всё там выше, поищите. Если бы это было не так, то почему слой икры на хлебе архитекторов потолще, чем у кодеров.
 
В функции выделяют не только повторяющиеся части кода, но даже однократно используемые, ради логики и простоты чтения блока кода верхнего уровня.
 
Опять же, не надо кричать. Я понимаю, что так делают и даже и не возражаю не разу. Возражаю я против того, чтобы ограничение на количество строк в функции влияло на структуру приложения.
 
Доступный твоему мозгу пример из практики Ардуино - это вызов (наприммер) lcd.init(). Он производится ровно ОДИН раз в коде. По твоей логике его нужно заменить на содержимое, так ;) 

Не так.

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

TD27T пишет:

А самый большой SQL-запрос, в котором доводилось ковыряться, был порядка 5000 строк. Вот это ад был, да.

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

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

TD27T пишет:

wdrakula пишет:

Ты ведь начинающий программист (и электронщик)

Два из двух мимо. Программист не начинающий.

Это твоя цитата , отсюда.

 -- Не умею. Плюсы для меня не родной язык. Стараюсь постигать.

Для программиста не бывает "плюсы не родной". Бывает для других АйТи профессий, веб...прости Господи...дизайнер, СУБД-шник, или еще зверек какой редкий, но не программист. И даже не потому, что С/С++ основна любого программирования, а просто потому, что для програмиста нет вообще разницы, на каком языке писать.

Хотя, если тебе нравится называть себя програмистом, то кто я такой, что запрещать? ;)

Запрещателя у нас запретили ...злые админы :(((.

------------------------

И запомни одну маленькую особенность человеческого восприятия: на форумах чаще всего два статуса: "нуб" и "грамотный". Если хоть раз "зашкварился" , задав вопрос - всё, ...хана! (это шутка конечно! ...но доля правды в ней есть ;) ;) ;) )

TD27T
Offline
Зарегистрирован: 08.04.2016

wdrakula пишет:

Это твоя цитата , отсюда.

 -- Не умею. Плюсы для меня не родной язык. Стараюсь постигать.

Для программиста не бывает "плюсы не родной". Бывает для других АйТи профессий, веб...прости Господи...дизайнер, СУБД-шник, или еще зверек какой редкий, но не программист. И даже не потому, что С/С++ основна любого программирования, а просто потому, что для програмиста нет вообще разницы, на каком языке писать.

Хотя, если тебе нравится называть себя програмистом, то кто я такой, что запрещать? ;)

Запрещателя у нас запретили ...злые админы :(((.

В дипломе написано инженер-программист. Разрабатываю программы - приложения СУБД. Стало быть, программист, как ни крути. Про "не родной" - не так выразился наверное. Скорее, основательно подзабытый. От плюсов отошёл году в 2002-2003 где-то и с тех пор не касался, пока не взялся за дуинку.

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

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

Пример хорошего, просто очень хорошего кода - это современное ядро Линуха. Скачай и посмотри. Это чистый, процедурный Си, не С++. Раньше были куски на С++, теперь их нет.

Если Плюсы  - то примеров классного кода полно, собственно Qt, или Гном. Это и читается и сопровождается. Код отточен вынужденно, поскольку разработка большой командой.

Конечно там есть и длинные функции. Это бывает необходимо для целостности.

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

Знаешь поговорку: "Старайся делать хорошо, плохо - оно само получится!".

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

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

TD27T пишет:

Во-первых, в общем случае, если профессионал несёт херню, то почему бы его и не оспорить. 

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

Но это не для тебя - у тебя ж "в дипломе написано".

В общем, написано у тебя может быть всё что угодно, но после "в ардуино нет полиморфизма", sql-запроса в 5 тыс. строк и прочих перлов ... программист из тебя, как из меня фуболист(а футболист из меня ... хотя мяч от судейского свистка отличаю довольно уверено!)

TD27T
Offline
Зарегистрирован: 08.04.2016

wdrakula пишет:

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

Учусь по-маленьку, угумс.

wdrakula пишет:

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

Поясню немного специфику приложений СУБД. Частенько, блок кода имеет такую структуру: выбираем данные из таблиц, обрабатываем, компонуем, отдаём пользователю; забираем данные от пользователя, обрабатываем, записываем. Так вот это "обрабатываем" - оно специфично для конкретной выборки в конкретной точке бизнес-логики. И всё что могло быть абстрагировано - оно уже абстрагировано,  остальное смысла нет - всё равно больше нигде не понадобится. Ну и смысл огород с лишними вызовами городить?

TD27T
Offline
Зарегистрирован: 08.04.2016

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

после "в ардуино нет полиморфизма" ...

Так его и нет. rtti нет, да и нафиг он в МК не упал. А без него какой полиморфизм? Одно название...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

TD27T пишет:

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

после "в ардуино нет полиморфизма" ...

Так его и нет. rtti нет, да и нафиг он в МК не упал. А без него какой полиморфизм? Одно название...

Мда. В ардуино мошт полиморфизма и нет ( што это в данном контексте?). А вот в GCC C++ есть. И никакой RTTI, на который шарпокодеры неистово дрочут, для этого не надо. Совсем.

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

TD27T пишет:

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

после "в ардуино нет полиморфизма" ...

Так его и нет. rtti нет, да и нафиг он в МК не упал. А без него какой полиморфизм? Одно название...

Вот именно об этом я и говорил. После таких заявлений, не остаётся никаких сомнений в том, что программист из тебя, как из говна пуля, прости, Господи.

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

wdrakula пишет:

Для программиста не бывает "плюсы не родной". Бывает для других АйТи профессий

Теперь буду знать, что программистов на Фортране не бывает.

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

TD27T пишет:

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

после "в ардуино нет полиморфизма" ...

Так его и нет. rtti нет, да и нафиг он в МК не упал. А без него какой полиморфизм? Одно название...

О, ещё один с дипломом "Осторожно, специалист!". Скрестили ужа с ежом, млять. Инженер-программист оно, эвона как, оказывается.

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

andriano пишет:

Теперь буду знать, что программистов на Фортране не бывает.

Как и водителей "жигулей". Таковым можно быть по ситуации, но не по профессии.

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

Ну, жигули не очень удачная аналогия. Форд - я бы еще понял...

Chichay
Offline
Зарегистрирован: 12.03.2018

Ну Вы блин даете! ))) Не поленился ипрочитал все что вы тут понаписали))) 

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

Не ссорьтесь))) Предлагаю всем вместе сегодня за ужином по стопочке бахнуть "за програмизм!"

Ну а я, если со своими глупыми вопросами буду сюда писать, сильно ругаться не будете?

Chichay
Offline
Зарегистрирован: 12.03.2018

Максимальная длинна вроде 82 символа!!!

//  Если строка не начинается с "$GNGLL",
078     // то она нам не нужна выходим
079     //
080     const char * prefix = "$GNGLL";
081     if (strncmp(str, prefix, strlen(prefix))) return false;


Евгений, разбираю по частям Ваш урок,

можете ответить на мой вопрос, если не трудно?

 

Я правильно понимаю, что заменив $GNGLL на $GNL, можно читать другую строку?

почему-то теперь в потоке нет строки начинающейся с $GNGLL

 

И как вставлять код на форум, что бы он был изначально свернут?

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

Правильно, только Вам бы лучше знать что эти символы обозначают и искать правильные строку и в ней правильные данные. Описание протокола на русском есть вот здесь - там собственно весь формат описан

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

Chichay пишет:

Координаты присутствуют:
5511.32245,N
06119.48690,E
 
 
 
Челябинск, курчатовский район? )))

 

sansanich
Offline
Зарегистрирован: 12.04.2018

Друзья! подскажите балбесу...))

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

получаю только 2 числа после точки

double A = gps.location.lng();
 
В строку тоже самое, 46.01 вместо 46.012947   
чувствую что не сложно, но пока не смог найти решение в сети, пните плиз мну в нужную сторону
 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

dtostrf(...);

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

sansanich пишет:

получаю только 2 числа после точки

double A = gps.location.lng();
 
В строку тоже самое, 46.01 вместо 46.012947   
 

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

sansanich
Offline
Зарегистрирован: 12.04.2018

DetSimen - спасибо! то что нужно

 

ЕвгенийП - код из примера библиотеки Fullexample, но всё уже работает, спасибо

 

такая строка получилась

dtostrf(gps.location.lng(),10, 6, outstr);  

такой результат

46.012624
 
sansanich
Offline
Зарегистрирован: 12.04.2018

Нашёл более удобное решение своей задачи

int A = gps.location.lng()*10000;

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

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

sansanich пишет:

Нашёл более удобное решение своей задачи

int A = gps.location.lng()*10000;

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

ну а теперь перевидите по своему удобному решению выше приведенные челябинские координаты

Chichay пишет:

Координаты присутствуют:

5511.32245,N
06119.48690,E

sansanich
Offline
Зарегистрирован: 12.04.2018

xDriver - да какая разница Челябинск суровый или голодный Саратов ))

Мы просто приводим в удобный вид умножая (передвигая точку) -  мне хватает четыре числа после точки, определяет до 1 дома

У вас 55.159902, 61.402554 цифры, по крайней мере яндекс так говорит - сделайте так же и получите чельночисловой результат

nt A = gps.location.lng()*10000; - если нужно ещё точнее увеличьте значение множителя

мой код

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const int RXPin = D5, TXPin = D6;
static const uint32_t GPSBaud = 9600;

TinyGPSPlus gps;

SoftwareSerial ss(RXPin, TXPin);

void setup()
{
  Serial.begin(115200);
  ss.begin(GPSBaud);
}

void loop()
{

  int A = gps.location.lng() * 10000;
  Serial.println(A);
  Serial.println();
  smartDelay(1000);

  if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("No GPS data received: check wiring"));
}


static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i = flen; i < len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);
}

static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i = strlen(sz); i < len; ++i)
    sz[i] = ' ';
  if (len > 0)
    sz[len - 1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}

static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
    Serial.print(sz);
  }

  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
    Serial.print(sz);
  }

  printInt(d.age(), d.isValid(), 5);
  smartDelay(0);
}

static void printStr(const char *str, int len)
{
  int slen = strlen(str);
  for (int i = 0; i < len; ++i)
    Serial.print(i < slen ? str[i] : ' ');
  smartDelay(0);
}

 

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

в INT не влезает

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

sansanich пишет:

У вас 55.159902, 61.402554 цифры, по крайней мере яндекс так говорит - сделайте так же и получите чельночисловой результат

nt A = gps.location.lng()*10000; - если нужно ещё точнее увеличьте значение множителя

допустим нужно + 1 знак и все вы приехали

int A = 55.159902 * 100000; 

чему по вашему А равно будет?

sansanich
Offline
Зарегистрирован: 12.04.2018

парни, всё нормально работает, я пробовал ещё больше, касательно примера выше

5157625
4601283
 
 вот такие цифры у меня - т.е прибавили по символу и получили уже 5 после точки - как я писал выше для меня это чрезмерно потому остановился на 4 после точки
код немного почистил от ненужного, цифры веше получил из него
 
// --- ДАННЫЙ КОД ДЛЯ ESP8266 !!!!!!!!!!!!!!!!
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const int RXPin = D5, TXPin = D6;
static const uint32_t GPSBaud = 9600;

TinyGPSPlus gps;

SoftwareSerial ss(RXPin, TXPin);

void setup()
{
  Serial.begin(115200);
  ss.begin(GPSBaud);
}

void loop()
{

  int A = gps.location.lat() * 100000;
  int B = gps.location.lng() * 100000;
  Serial.println(A);
  Serial.println(B);
  Serial.println();
  smartDelay(1000);

  if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("No GPS data received: check wiring"));
}


static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

 

 

sansanich
Offline
Зарегистрирован: 12.04.2018
ну и если ещё прибавим нолик
 
  int A = gps.location.lat() * 1000000;
  int B = gps.location.lng() * 1000000;
 
получим уже 6 после точки, всё что приходит от модуля
51576151
46012795
 
по поводу "не влезает" возможно дело в плате, я не спец, но может разные характеристики - я использую не ардуино. а esp8266
xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

я чет не понимаю или в ардуино инт стал четыре байта?

проясните мужики, а то придется напится!

sansanich
Offline
Зарегистрирован: 12.04.2018

 я использую не ардуино. а esp8266

xDriver - нужен иной повод ))

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ну так, ептать, шош ты молчиш...

все равно пойду дерябну.

sansanich
Offline
Зарегистрирован: 12.04.2018

))) дерябну и я пожалуй за решение )))

не молчу - написал три раза об этом))) в первом и двух предыдущих постах  - да. надо немного расслабить мозги нам )))

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

sansanich пишет:

))) дерябну и я пожалуй за решение )))

не молчу - написал три раза об этом))) в первом и двух предыдущих постах  - да. надо немного расслабить мозги нам )))

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sansanich пишет:

 я использую не ардуино. а esp8266

xDriver - нужен иной повод ))

дак, в ESP памойму уже полноценный double есть, или я ашыбаюс?

 

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

sansanich, мне немного смешно с тебя...

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

ты просто не умеешь их выводить правильно.

sansanich
Offline
Зарегистрирован: 12.04.2018

ua6em - Ок

DetSimen - есть, попробовал - получил два знака после точки - дальше копать не стал

b707 -  аналогично )) - как уже говорил выше - мне удобнее без точек юзать переменные

 

Друзья! спасибо за помощь и общение - сам бы я думал долго))

Скоро ещё возникнут вопросы, планирую на днях собрать прототип своей поделки

Светодиодное табло(простой монохром) выводящий контент в зависимости от места положения и веб интерфейсом для настроек, делаю на 8266 т.к ранее уже мастерил поделки на них, да и на стм32 пока нет времени(а хотелось бы поюзать библиотеку от сообщества). позже, когда нужно будет что то посложнее или как вариант есп32 ещё попробовать приспособить...

 

 

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

sansanich, Ваи уже не раз пытались объяснить, что Вы занимаетесь мастурбацией.

Ну, хорошо, вот Ваш код

sansanich пишет:

  int A = gps.location.lat() * 100000;
  int B = gps.location.lng() * 100000;
  Serial.println(A);
  Serial.println(B);

А теперь выбросьте этот онанизм с умножением и просто напишите

  Serial.println(gps.location.lat(), 5);
  Serial.println(gps.location.lng(), 5);

И как? Сколько знаков?

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

Chichay пишет:

Теперь хочу сделать автопилот для лодки.

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

sansanich
Offline
Зарегистрирован: 12.04.2018

ЕвгенийП -  тема онанизма вам не даёт покоя? - но ничего, с годами пройдёт ))

я писал выше и даже не раз о том что мне нужны именно целые цифры в переменные, для манипуляций с ними

а вы мне про вывод в сериал числа с точкой)) да, четыре числа.... после точки)) если вы комментируете -  потрудитесь прочесть о чём речь то

 

ещё раз благодарю всех не равнодушных за помощь - мой вопрос решён. 

 

 

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

sansanich пишет:

тема онанизма вам не даёт покоя? - но ничего, с годами пройдёт ))

Раньше тоже так думал, но годы уходят, а тема остаётся. Как вижу топик типа этого, так  ... :-(