Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопросы по С/С++ (СИ)

Сообщение Reflector »

[uquote="NStorm",url="/forum/viewtopic.php?p=3826141#p3826141"]Я в курсе как оно на английском произносится, но тогда уж скорее всего "ивэнт". А "эвент" это просто англицизм, а не попытка передать звучание английского слова на кириллице )[/uquote]
В оригинале читаться будет скорее "ывэнт", но так практически никто не пишет, иначе "ы" будет в каждом втором слове :) Кроме того есть правила транслитерации, по ним начальная английская "E" передается русской "И", это, кстати, ответ из Института русского языка РАН, конкретно по этому слову, соответственно в Русский орфографический словарь PAH тоже попал "ивент".
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Eddy_Em »

[uquote="NStorm",url="/forum/viewtopic.php?p=3826141#p3826141"]"ивэнт".[/uquote]
"ивент" правильней. Потому что там не звук 'æ', а звук 'e'!
[uquote="ARV",url="/forum/viewtopic.php?p=3826103#p3826103"]я как-то исторически организую свою программу не в виде автомата состояний в чистом виде, а именно по событийной модели[/uquote]
А я стараюсь классических автоматов придерживаться. Если нужно что-то сделать в прерывании, то выставляю вспомогательные флаги, а уж в процедуре-автомате их обрабатываю с возможной сменой состояния.
Последний раз редактировалось Eddy_Em Пн апр 13, 2020 08:51:03, всего редактировалось 1 раз.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Eddy_Em »

ARV, одичал народ из-за незаконного ограничения своих конституционных прав. Вот и переквалифицируется теперь из политологов в вирусологов, филологов и т.п. ☺
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Вопросы по С/С++ (СИ)

Сообщение NStorm »

[uquote="NStorm",url="/forum/viewtopic.php?p=3826118#p3826118"]Так не надо заранее. Можно в процессе добавлять. Состояния и эвенты в любое время добавлять можно. Это просто enum, для именования. Для примера:

Код: Выделить всё

typedef enum {ST_NONE, ST_IDLE, ST_CALIBRATION, ST_NORMAL, ST_BYPASS, ST_OVERFLOW, ST_RESTORATION, ST_MAINTAINCE, ST_LAST} eState;
typedef enum {EV_NONE, EV_BTN_SHORT, EV_BTN_LONG, EV_BAT_LOW, EV_AC_SHORTAGE, EV_TIMEOUT, EV_LAST} eEvent;
[/uquote]
Хмм, а если еще добавить некий ST_ANY и переписать обработчик переходов как-то так:

Код: Выделить всё

// Run the transition based on event
eRetCode fsTransition() {
    if ((state.event < EV_ANY) && (trans[state.cur_state][state.event] != NULL || trans[ST_ANY][state.event] != NULL)) {
        if (trans[state.cur_state][state.event] != NULL)
            state.cur_state = trans[state.cur_state][state.event](); // run the transition
        else if (trans[ST_ANY][state.event] != NULL) // Catch on any state handler
            state.cur_state = trans[ST_ANY][state.event]();
        return RET_OK;
    }
    return RET_ERROR;
}
То в таблицу можно добавлять общий обработчик перехода из любого состояния для определенных ивентов, чтобы не рисовать всю таблицу. Опять же это чуть лишней оперативки в угоду читаемости и удобства.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Вопросы по С/С++ (СИ)

Сообщение dosikus »

[uquote="ARV",url="/forum/viewtopic.php?p=3826255#p3826255"]ну вот... были же нормальные программисты, стали филологи...[/uquote]

Это возраст...
Да и лучше филологи чем "философы" от теорий заговора...
Trully
Встал на лапы
Сообщения: 118
Зарегистрирован: Вс авг 18, 2019 13:22:01

Re: Вопросы по С/С++ (СИ)

Сообщение Trully »

Чтобы не возникало лишних споров по произношению/транскрипции, пишите лучше англ.термины на English (это слово - тоже с "проблемой произношения"). Либо переведите на русский. Event = событие.
to be or not to be = -1
Аватара пользователя
Starichok51
Модератор
Сообщения: 19043
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Вопросы по С/С++ (СИ)

Сообщение Starichok51 »

а может он не знает, как это слово называется по русски?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
matrex
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 24, 2012 14:02:39

Re: Вопросы по С/С++ (СИ)

Сообщение matrex »

Всем привед!

Как правильно использовать глобальные переменныйе. В проекте (Arduino, PlatformIO) использую библиотеку для работы с дисплеем U8glib. Объявляю так:

Код: Выделить всё

main.cpp

#include <Arduino.h>
#include "U8glib.h"

U8GLIB_ST7920_128X64_1X u8g(10);

void setup()
{
}
void loop()
{
}
В принципе все работает. Сейчас хочу разнести функциональность при работе с дисплеем по разным модулям, например для работы с меню в menu.cpp, для рисования графиков - chart.cpp, для рисования таблиц - table.cpp и т.д. Делал примерно так:

Код: Выделить всё

chart.cpp
 
#include <Arduino.h>
#include "U8glib.h" 

U8GLIB_ST7920_128X64_1X screen;

void chartInit(U8GLIB_ST7920_128X64_1X v_screen)
{
    screen = v_screen;
}

void chartUint8(uint8_t v_x, uint8_t v_y, const uint8_t v_s)
{
    u8g.setPrintPos(v_x, v_y);
    u8g.print(v_s);
}

void chartUint8_v1(U8GLIB_ST7920_128X64_1X v_screen, uint8_t v_x, uint8_t v_y, const uint8_t v_s)
{
    v_screen.setPrintPos(v_x, v_y);
    v_screen.print(v_s);
}
Как достучаться до переменной u8g, объявленной в модуле main.cpp из модуля chart.cpp? Испробовал три варианта - работает только chartUint8_v1, но такой подход меня не очень устраивает. Я хочу или на старте задать ссылку на класс (chartInit) и потом его использовать, или использовать переменю глобально (chartUint8).
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

Ключевое слово extern в заголовочном файле спасёт отца программирования.
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение da-nie »

Как правильно использовать глобальные переменныйе.
Лучше через функции доступа к ним. Инкапсуляция всё же полезна.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

Это и так уже объекты.
matrex
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 24, 2012 14:02:39

Re: Вопросы по С/С++ (СИ)

Сообщение matrex »

Если бы было все так просто, то отец программирования уже бы давно бы кушал в ресторанах во фраке и белых перчатках ))) Я может ересь ща скажу, но main не имеет заголовка. Указание в заголовке chart.h дает ошибку... Если extern объявить в main.cpp - тоже ошибка.
СпойлерИзображение
Кстати, я нигде примера не нашел подобного. Все тупо юзают майн и не парятся...
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

extern "обещает" компилятору, что переменная такого типа есть где-то в другой единице трансляции. Там где объект определяется extern не нужен. Ну это же основы, читаем K&R на ночь до просветления.

Кстати, вы так лихо объекты присваиваете и передаёте в функции. Там накладные расходы просто ужас. Не надо так делать. Создайте один глобальный объект и работайте с ним.
Последний раз редактировалось VladislavS Пт апр 24, 2020 17:29:23, всего редактировалось 1 раз.
matrex
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 24, 2012 14:02:39

Re: Вопросы по С/С++ (СИ)

Сообщение matrex »

[uquote="da-nie",url="/forum/viewtopic.php?p=3832660#p3832660"]
Как правильно использовать глобальные переменныйе.
Лучше через функции доступа к ним. Инкапсуляция всё же полезна.[/uquote]

Это как? Создать модуль, в котором создать класс работы с дисплеем, в модуле сделать функцию на получение ссылки на класс и ее юзать в других модулях? Что то типа

Код: Выделить всё

lcd.cpp

#include <Arduino.h>
#include "U8glib.h" 

U8GLIB_ST7920_128X64_1X screen;

U8GLIB_ST7920_128X64_1X  getLCD()
{
    return screen;
}
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение da-nie »

Это и так уже объекты.
Так всё равно. Сами-то они доступны вне модуля станут. А модуль лучше бы сделать закрытым, чтобы его состояние менять только функциями, специально для этого предназначенными.
Я может ересь ща скажу, но main не имеет заголовка.
И слава богу. :) Вы нужному модулю подключите модуль, где этот ваш объект определён и описывается и укажите сам объект как extern.

А вместо объектов в функции ссылки (уж не знаю, что у вас за язык - Си или С++ там) или указатели на объекты передавайте.
Это как? Создать модуль, в котором создать класс работы с дисплеем, в модуле сделать функцию на получение ссылки на класс и ее юзать в других модулях? Что то типа
Да. Только лучше в вашем случае либо ссылку, либо указатель возвращать. Правда, модуль отдельный для этого можно и не создавать, ограничившись созданием объекта в одном из существующих модулей.
Но если есть желание, можно и синглетон сделать (посмотрите этот паттерн, хорошая штука в данном случае). Я правда, не знаю, много ли у вас памяти на такие фокусы.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

Нельзя так делать!!! U8GLIB_ST7920_128X64_1X это класс. При его копировании, передаче в и возврате из функции создаются его копии, вызываются конструкторы копирования и присваивания, деструкторы. Любой микроконтроллер можно "положить" на лопатки.

PS: Ага, синглтон человеку, который про extern не слышал. И С++ там, неужели не видно создание объектов и вызов их методов?
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение da-nie »

И С++ там, неужели не видно создание объектов и вызов их методов?
Меня очень смущают указание на arduino и Си++ в проекте одновременно. :oops: Потому я и не понимаю, что там такое за мутация. Может, ардуино ide что-то своё умеет, похожее на Си++? Я с ней не работал никогда и ничего про неё не знаю. И я ещё AVR с килобайтом ОЗУ на Си++ не запускал. Вот STM - другое дело.
Последний раз редактировалось da-nie Пт апр 24, 2020 17:42:23, всего редактировалось 1 раз.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопросы по С/С++ (СИ)

Сообщение VladislavS »

Ардуина на С++ написана. Это новость?
Аватара пользователя
da-nie
Говорящий с текстолитом
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение da-nie »

Ардуина на С++ написана. Это новость?
Для меня - да. Я же говорю, я именно с ардуиной дел никогда не имел. И не слышал, чтобы ардуинщики, скажем, winavr запускали - строго некую arduino ide. esp-шники, например, тоже не спешат ставить SDK и Си - все практически пользуются lua, at-командами и микропитоном. Плюс некая привязка к ардуине.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Ответить

Вернуться в «Разные вопросы по МК»