Ви не увійшли.
Якщо ваша проблема вирішується через регекспи - значить у вас 2 проблеми регексп для перевірки коректності email це кілька рядків.
А кінцеві автомати якось пройшли мимо. Учили, але як від діаграми перейти до коду я так і не врюхав.
Якщо ваша проблема вирішується через регекспи - значить у вас 2 проблеми
регексп для перевірки коректності email це кілька рядків.
Ви про цей вираз? Так і формат адреси відповідно до RFC 822 непростий. До того ж, такі вирази не пишуться вручну, а генеруються з простіших частин. Ви ж не звинувачуєте компілятор C++, що він генерує машинний код, який людині складно розібрати? Регулярний вираз - той же "машинний код" для КА.
А кінцеві автомати якось пройшли мимо. Учили, але як від діаграми перейти до коду я так і не врюхав.
"Звичайна" програма з розгалуженнями і циклами - це теж КА (як мінімум).
Неактивний
Я правильно розумію, що якщо на мові yacc описати правила для формату email, то можна отримати regexp? Цікава методика, але як дебажити помилки? Тестами хіба що.
Я правильно розумію, що якщо на мові yacc описати правила для формату email, то можна отримати regexp?
Не regexp, а код, який реалізує алгоритм, еквівалентний regexp. Тільки у yacc можливостей на порядок більше, він може генерувати парсер для будь-якої Тьюринг-повної мови.
але як дебажити помилки? Тестами хіба що.
Тестами помилки тільки виявляються, як і скрізь. Зміни вносяться в опис граматики. Мабуть є якісь опції і для дебага. Я далеко не експерт в парсер-генераторах, тільки краєм вуха бачив.
Неактивний
Ну, мабуть існують задачі, які простіше описати на декларативній мові. Але csv - навряд чи цей випадок
Ну, мабуть існують задачі, які простіше описати на декларативній мові.
Мені здається, навпаки, для більшості задач, які намагаються вирішувати за допомогою ардуіни (в тому числі і тут на форумі), декларативна парадигма так і проситься. Але то таке, філософія.
Але csv - навряд чи цей випадок
Це поки самі value не містять в собі comma, які можуть бути не тільки екрановані, а і в складі літералів у одинарних або подвійних лапках, наприклад.
Неактивний
>> декларативна парадигма так і проситься.
Ну так то воно так. А є приклади реалізації, щоб не по уродськи ? Всякі yml воно прикольно, але вся імперитивщина закопана під капотом, крок вбік і починається цирк з конями.
А є приклади реалізації, щоб не по уродськи ?
Мені поки що не зустрічались. А самому розробляти - часу на це немає, та і для однієї людини воно розтягнеться на роки. Воно ж одне тягне за собою інше.
Від існуючих ардуінівських бібліотек доведеться відмовитись одразу, а кому воно потрібне без бібліотек? Найбільш розповсюджені ще якось більш-менш реалістично портувати під нову парадигму, але ж тисячі їх. Ще й уніфікація HAL'а для різних архітектур.
На виході генерувати код на C? Сучасні компілятори не дуже підходять для embedded з обмеженими ресурсами. Наприклад, з LTO практично неможливо передбачити, скільки стеку потрібно тій чи іншій задачі. Інші налаштування оптимізації - все, приїхали. Потрібно розробляти свій компілятор з блекджеком і повіями, та ще й щоб підтримував зоопарк цільових архітектур. Невдячна це справа.
Неактивний
От ж.. суперцикл по ардуїнівскі це просто, але чим більше елементів в системі тим незрозуміліше.
rtos нахвалюють, і навіть під atmega воно є. Але ще не пробував.
rtos нахвалюють, і навіть під atmega воно є.
Так правду кажуть, мультипоточність - для тих, хто не зрозумів конечні автомати
Це зручно, але кожній задачі потрібен стек, як мінімум щоб зберігати контекст. На Attiny13 ОЗУ 64 байта, а контекст регістрів - 32 байта. На Attiny15 взагалі ОЗУ нема
Неактивний
Для використання attiny повинна бути дуже поважна причина
Мені китайські stc8 сподобались. 8 ніг, обв'язки немає. Програмуються трохи по наркоманськи, ага.
Мені китайські stc8 сподобались. 8 ніг, обв'язки немає. Програмуються трохи по наркоманськи, ага.
Цікаво. Цих не доводилось щупати.
Трохи грався з CH32V. Наче нічо, але в "продакшн" їх брати поки б не ризикував. Документація мізерна, є питання щодо надійності в довгостроковій перспективі. Ну і треба розуміти, що кілобайт на AVR8 і кілобайт на RV32 - це дещо різний кілобайт.
Неактивний
Кілобайти то такоє.. Там мабуть і периферія трохи незвична, і тактування..
І програматор свій, китайський, ні з чим не сумісний
Якось так ....
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
#define TFT_CS 10
#define TFT_RST 8 // Or set to -1 and connect to Arduino RESET pin
#define TFT_DC 9
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
#include <SoftwareSerial.h>
#include <string.h>
SoftwareSerial gpsSerial(4, 3); // (RX, TX Arduino)
String nmeaSentence = ""; // Переменная для хранения NMEA-строки
const int timezoneOffset = 3; // Часовой пояс (например, +3 для EEST)
boolean valid = false; // флаг валидности координат
boolean drive = false; // флаг движения
boolean overtime = false; // флаг время/скорость
// char tokenKnot[] = "10.5"; // Пример тестового значения
void setup() {
// Serial.begin(9600);
gpsSerial.begin(9600);
tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab
tft.setRotation(3); // Установка ориентации экрана
tft.fillScreen(ST77XX_BLACK); // Установка начального цвета фона
}
void loop() {
while (gpsSerial.available()) {
char c = gpsSerial.read(); // Считать один символ из GPS
if (c == 'n') { // Проверить, является ли символ концом NMEA-строки
GPS_run(nmeaSentence); // Передать строку в GPS_run() для обработки
nmeaSentence = ""; // Очистить строку для следующей NMEA-строки
} else if (c != 'r') { // Игнорировать символ возврата каретки
nmeaSentence += c; // Добавить символ к строке NMEA
}
}
}
void GPS_run(String nmea) {
if (nmea.startsWith("$GPRMC")) { // Проверка на идентификатор строки
// Serial.println("______________________________");
// Serial.println("_______ вход в $GPRMC ***1*** ");
char nmeaCStr[nmea.length() + 1];
nmea.toCharArray(nmeaCStr, nmea.length() + 1);
int fieldIndex = 0;
char *token = nmeaCStr;
char *commaPos = strchr(token, ','); // Найти первую запятую
while (fieldIndex <= 13) {
if (commaPos) {
*commaPos = '