Arlleex 178 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 2 минуты назад, Forger сказал: Чтобы избежать конкретизации области видимости, придется выносить объявление в глобальную область. Хоспаде, они >30 лет пилят язык, и как мне уже кажется, совершенно не туда пилят... Цитата Кстати, а почему в C++11 используете такую странную форму объявления? Не понял. А как должно быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 3 minutes ago, Arlleex said: Не понял. А как должно быть? Как минимум в вашем случае слов class там избыточно. Я применяю using (см. мои примеры), мне оказалось гораздо удобнее ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба Вообще не понял, где Вы увидели у меня typedef... enum class отличается от enum более строгой типизацией и проверкой соответствия типов при неявном преобразовании, что очень удобно. Вот буквально недавно читал, дескать, "вах как это удобно в этих наших C++" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 1 minute ago, Arlleex said: где Вы увидели у меня typedef А я и не говорил, что у вас там где-то typedef ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба Ну я неявно кастовал сие выражение 15 минут назад, Forger сказал: от себя рекомендую переходить на using. Благодаря ей, отказался от typedef как от страшного кошмара )) на свой лад Что и ввело меня в замешательство, т.к. я не понимаю, почему using будет удобнее enum class. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 1 minute ago, Arlleex said: enum class отличается от enum более строгой типизацией и проверкой соответствия типов Может и так, вот только вот какие там сложные конструкции можно применить в enum, чтобы были проблемы? )) Это ж надо постараться, чтобы с enum разложить грабли. Не подумайте, я не придираюсь, просто впервые вижу enum class вместе ) 3 minutes ago, Arlleex said: почему using будет удобнее Потому что using дает как минимум единую схему для объявления всех типов: после using идет название типа, а потом вся "борода и вода". Мне лично так намного проще читать код. Опять-таки не навязываю. Попробовал, оценил, теперь постепенно перевожу на такую схему старые проекты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 10 минут назад, Forger сказал: Не подумайте, я не придираюсь, просто впервые вижу enum class вместе ) Ну я в том числе опирался на примеры и философию применения отсюда. P.S. Частично можно сократить названия полей как-то так (но все равно не совсем то) using eDMAMod = cUARTDMARx::eDMAMod; using eDMAStr = cUARTDMARx::eDMAStr; cUARTDMARx fifo(eDMAMod::DMA1n, eDMAStr::STR0n); Хотелось то ведь, чтобы среда при открытии скобочки у fifo сама давала список выпадающий DMA1n/DMA2n и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 9 minutes ago, Arlleex said: P.S. Частично можно сократить названия полей как-то так... Можно и так, но по-моему это будет сильно захламлять код. В таких ситуациях, если вы заметили, стараюсь сокращать число параметров до одного. Это вынуждает придумывать осмысленные названия методам (функциям), что очень положельно сказывается на читаемости кода. При этом уходит "проблема" детализации области видимости - как раз наоборот, видно откуда "ноги растут" )) К примеру, как понять, что тут происходит без доп. комментов? По мне - только хуже становится cUARTDMARx fifo(eDMAMod::DMA1n, eDMAStr::STR0n); 9 minutes ago, Arlleex said: опирался на примеры и философию применения отсюда. По мне - спорная философия: ни разу не сталкивался с нуждой проводить сравнения enum друг с другом. Даже не знаю где бы такое приходилось бы применять Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 1 минуту назад, Forger сказал: К примеру, как понять, что тут происходит без доп. комментов? Инстанцирование fifo класса cUARTDMARx (т.е. fifo на прием по UART-у с задействованием DMA), в качестве параметров для инициализации указываем модуль DMA (DMA1/DMA2) и номер потока для обслуживания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 2 minutes ago, Arlleex said: Инстанцирование fifo класса cUARTDMARx (т.е. fifo на прием по UART-у с задействованием DMA), в качестве параметров для инициализации указываем модуль DMA (DMA1/DMA2) и номер потока для обслуживания. Выходит этот текст придется добавить в комментарий над этой строчкой. А я не люблю писать комментарии, тем более такие заумные )) Но, это все - сугубо вкусовщина. Поэтому проехали )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 10 минут назад, Forger сказал: Но, это все - сугубо вкусовщина. Поэтому проехали )) Не-не-не, не проехали Я хотел бы узнать, как написали бы Вы. Т.е. что не понятно в приведенной мною строке? Сильные сокращения? Т.е. cUARTDMARx fifo(eDMAModule::DMA1n, eDMAStream::STREAM0n); было бы лучше? Просто я всегда читаю код, опираясь на контекст. Читающему, вроде, понятно, что можно выбрать DMA1/DMA2 и нужный поток (stream), если он знаком с периферией STM32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 33 minutes ago, Arlleex said: Я хотел бы узнать, как написали бы Вы. На предыдущей странице пример есть. 33 minutes ago, Arlleex said: Читающему, вроде, понятно, Это - основное заблуждение программиста (любого) )) Если требуются жирные комментарии для понимания некой строчки, то уверяю вас, что через полгода они уже не помогут :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 38 минут назад, Arlleex сказал: понятно, что можно выбрать DMA1/DMA2 и нужный поток (stream), если он знаком с периферией STM32. В том примере, что я приводил, все эти DMAx, DMA-stream-ы, маски всякие и пр. заполняются автоматом. Макросом. Периферию STM32 вспоминать приходится по-минимуму. Макрос вычисляет всё необходимое сам, по номеру порта: #define UartHnd_SET(port, trapr, ol) \ .uart = &concat(UART, nUART_##port), \ .nDMASTRtx = nDMASTR_##port##_TX, \ .nDMASTRrx = nDMASTR_##port##_RX, \ .uartNvic = concat(NVIC_UART, nUART_##port), \ .txDmaNvic = concat(NVIC_DMA, concat(DMASTR, nDMASTR_##port##_TX)), \ .rxDmaNvic = concat(NVIC_DMA, concat(DMASTR, nDMASTR_##port##_RX)), \ .rccUart = concat(RCC_APB_UART, nUART_##port), \ .dmaTxStat = (nDMASTR_##port##_TX & 3) * 6 + (nDMASTR_##port##_TX & B1) * 2, \ .dmaRxStat = (nDMASTR_##port##_RX & 3) * 6 + (nDMASTR_##port##_RX & B1) * 2, \ .dmaTxISR = (UartHnd::IoIsrIfcr *)&((nDMASTR_##port##_TX >> 3) ? &DMA2: &DMA1)->ISR[nDMASTR_##port##_TX >> 2 & 1], \ .dmaRxISR = (UartHnd::IoIsrIfcr *)&((nDMASTR_##port##_RX >> 3) ? &DMA2: &DMA1)->ISR[nDMASTR_##port##_RX >> 2 & 1], \ .streamTx = &((nDMASTR_##port##_TX >> 3) ? &DMA2: &DMA1)->STREAM[nDMASTR_##port##_TX & 7], \ .streamRx = &((nDMASTR_##port##_RX >> 3) ? &DMA2: &DMA1)->STREAM[nDMASTR_##port##_RX & 7], \ .streamTxCR = 1 << DMA_CR_EN | 1 << DMA_CR_TEIE | 1 << DMA_CR_TCIE | \ 1 << DMA_CR_DIR | 1 << DMA_CR_MINC | \ 0 << DMA_CR_PSIZE | 0 << DMA_CR_MSIZE | DMAPRI_UART_TX << DMA_CR_PL | \ concat(DMAREQ_S, nDMASTR_##port##_TX, _UART, nUART_##port, _TX) << DMA_CR_CHSEL, \ .streamRxCR = 1 << DMA_CR_EN | 1 << DMA_CR_DMEIE | 1 << DMA_CR_TEIE | 1 << DMA_CR_TCIE | \ 0 << DMA_CR_DIR | 1 << DMA_CR_DBM | DMAPRI_UART_RX << DMA_CR_PL | \ 1 << DMA_CR_MINC | 0 << DMA_CR_PSIZE | 0 << DMA_CR_MSIZE | \ concat(DMAREQ_S, nDMASTR_##port##_RX, _UART, nUART_##port, _RX) << DMA_CR_CHSEL, \ .trapRegion = trapr, \ .overlock = ol Всё вычисляется по 'port'. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 34 minutes ago, Arlleex said: Сильные сокращения? Все в одну строчку, нагромождено и вообще неясно, что тут происходит без доп. комментариев. Только догадки. Конечно, автор понимает, не уверяю это - временно ) Я стараюсь разбивать действия на отдельные короткие методы, имеющие осмысленные названия. В основном без параметров, реже один, гораздо реже - два. И практически никогда - три. Возвращаемый результат осмыслен с названием метода/функции. Например, если результат логический (да/нет), то название начинает с глагола is, has, was и т.п. Т.е. с глагола, который позволяет встроить метод в текст условия и выражения. Так читать намного проще (сугубо по личному опыту). Если число возвращается, то название отражает тип возращаемого результата и название отражает, что делает функция при возврате: getVoltage, getTimeMs и т.п. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 9 декабря, 2021 Опубликовано 9 декабря, 2021 · Жалоба 8 минут назад, jcxz сказал: Всё вычисляется по 'port'... Мощно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться