Перейти к содержанию
    

Почему для GCC следующий код в полном порядке?

36 minutes ago, EdgeAligned said:

xTaskCreate(TaskFoo, "TaskName", 100, NULL, 1, &pxTaskHandle);

тут только вызов, нет самих объектов, нет реализации,  а их тоже надо создать, объявить

и в итоге все равно копипастишь из другого кода (

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

такие крайне неочевидны и вынуждают лазить в документацию или копировать из другого проекта

 

 

а вот как у меня объявляется, создается и реализуется таймер (задача чуть-чуть проще):

это моргание лампочкой в стиле "i am alive", стараюсь ставить такие на все платы, так удобнее отлаживать, пока не вышел в серию )

#include <AbstractApplication.hpp>
#include <Delegate.hpp>
#include <Pin.hpp>

 ...
  
constexpr auto kStackSize = SERVICE_STACK_SIZE;
constexpr auto kPriority = SERVICE_PRIORITY;

constexpr auto kLedFlashPulseWidthMs = 10;
constexpr auto kLedFlashPediodMs = 500;

...
  
class ServiceLib : public Service
{
	virtual void run() final;

	class Timer : public OS::Timer<kStackSize>
	{
		virtual void initialize() final { pinLED.setToHigh(); }
		virtual void body() final { pinLED.setToLow(); sleep(kLedFlashPulseWidthMs); pinLED.setToHigh(); }
		Hardware::DigitalOutputPin<PA15> pinLED;
		
	public:
		Timer() : OS::Timer<kStackSize>("Service.Timer") {}
	
	} timer;
}
      
....
      
void ServiceLib::run()
{
	timer.setPriority(static_cast<Timer::Priority>(kPriority));
	timer.setPeriodMs(kLedFlashPediodMs);
	timer.run();
}
  

 

 

 

36 minutes ago, EdgeAligned said:

Хотя на самом деле нет там никаких сложностей.

это для вас, видимо постоянно пользуетесь,  

а я вот не храню в голове такую информацию - ШЕСТЬ параметров для одной функции, и надо помнить в каком порядке, такое по мне вообще за гранью ..

 

36 minutes ago, EdgeAligned said:

Я знаю, я работал в составе команды. И там были требования, вплоть до оформления - стиль форматирования текста скинули файлом настроек, стандартное документирование doxygen, имена переменных и прочего - в таком-то стиле.

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

а если сам хозяин, то проблем как раз нет, сделать так, как удобно автору )

 

36 minutes ago, EdgeAligned said:

А изобретать свой няшненький лисапедик с розовенькими колесиками - ну эт кагбе.

знакомо: любой чей-то шаг в строну воспринимается как немыслимое изобретение некого "велосипеда", причем в таком резком контрасте ))

а достаточно углубиться и вникнуть, как уже так не кажется )

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем мне вникать в ваш розовенький лисапэд, если у меня есть свой зеленый лисапэд? 🙂 Мне ваш ничуть не интересен, если честно!

Касательно работы в команде - "со своим уставом в чужой монастырь не лезут" 🙂 Если вы будете руководителем проекта, вы будете определять стиль. Если же нет, то придется принять правила игры. Как минимум, чтобы ваш кусок можно было пристыковать к остальным кускам, стили должны хотябы в общих чертах совпадать. Иначе ничего не получится.

Насчет "удобства". 🙂 У нас в армии говорили: "Неудобно срать (спать) стоя, остальное - фигня"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, EdgeAligned said:

Мне ваш ничуть не интересен, если честно!

Тогда к чему этот спор? 

Я поделился личным опытом, предложил поделиться своим. 

 

11 minutes ago, EdgeAligned said:

Если вы будете руководителем проекта, вы будете определять стиль.

разумеется о такой схеме речь, где хозяин кода решает как он будет построен, а не "дядя маер" сверху?

а роль подчиненного в ноль прогера тут не обсуждается, как ему скажут так и будет писать, это само собой, тут просто нечего обсуждать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну дак вы ж сказали, что дескать "на голых Сях невозможно написать хорошего кода", дескать только расово-верный ++ будет панацеей. Ну я ответил, что Ардуинщики пишут на ++, а FreeRTOS написана на голых Сях, и результат прямо противоположный. На что вы начали говорить, что FreeRTOS ваще сложно запомнить, потому что она не розовенькая и без наклеечек 🙂 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 minutes ago, EdgeAligned said:

FreeRTOS написана на голых Ся

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

вопрос их применения сугубо индивидуальный, выше описал как я это делаю я, чтобы не запоминать тонны параметров функций

если это кому-то кажется "розовеньким" - это личное дело, но вовсе не обязательно это озвучивать это тут :on_the_quiet2:

 

54 minutes ago, EdgeAligned said:

на голых Сях невозможно написать хорошего кода

и где я такое сказал? цитата? или будете и дальше выдавать свои домыслы и фантазии за чужие?

речь шла про ПРОЕКТИРОВАНИЕ КОДА, на функциональном языке это сделать намного сложнее, чем на объектном (по-моему я уже повторяюсь)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

В ООП-стиле я вижу разворачивание самой логики работы программы: при объявлении объектов нужных классов они "прицепляются" к необходимым драйверам и вперед.

При написании кода упор стараюсь делать на золотую середину между читаемостью и производительностью. На самом деле пусть хоть 10 параметров в функции: если при чтении из контекста сразу становится понятно, о чем речь, то не считаю это зазорным. Напротив, подставляя какие-то страшно длинные имена в такую функцию, чтоб "наверняка было всем понятно", строчка вызова превращается в уже сходу врядли перевариваемую мозгом. На ней приходится фиксировать внимание, теряется мысль, рассредоточиваешься и порой идешь по новой. В примере с xTaskCreate(): эта функция вызывается крайне редко, обычно один раз за всю жизнь программы, поэтому мне плевать, что для первоначального написания ее вызова мне, возможно, придется открыть ее декларацию и посмотреть очередность аргументов и их тип. А если функция вызывается очень часто, то, возможно, она будет оформлена в inline-вызов в виде отдельной крохотной функции. Крохотные вызовы, сколько я ни смотрел листинги, всегда встраивались при оптимизации.

Мне такое сочетание Си/++ видится наиболее лаконичным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, Forger сказал:

все будет в порядке, если с самого начала структура проекта была спроектирована и разбита на независимые модули/блоки 

на голых сях это сделать крайне сложно и трудоемко

Ваши слова. Да, когда 

2 часа назад, Forger сказал:

даже два параметра много, ибо нужно помнить какой что значит и в каком порядке ... , такое по мне вообще за гранью ..

действительно сложно вообще что-то написать. С такой памятью - удивительно, что вообще что-то пишите еще 🙂 

А вот я когда-то тыщщу лет назад вообще даже на ассемблере писал и не пускал нюни, что надо помнить дохрена инструкций. И тот же FreeRTOS, в котором есть и ассемблерные вставки, ну как-то ж люди писали жеж! Но вот в тех же ардуино-проектах, писуемых на расово-верном ++, я вот что-то не шибко то видел, чтобы хотябы что-то более чем упаковка в struct использовалась. Хотя я канеш не спец в адруине, мож щас там кто-то поумнее чего делает. 

 

Да нет, я "ни за красных, ни за белых", я просто рассуждаю. "Кто ясно мыслит, тот ясно и излагает"(С)кто-то из древних. И коль умеете ясно мыслить, то написать ясно можно на любом языке.  И я согласен с тем, что

В 30.11.2023 в 11:25, MrYuran сказал:

если проект представляет собой монолитный комок дерьма (ball of mud), без разницы, на каком языке он написан. ПлюсАми тут мало что изменишь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, EdgeAligned said:

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

Очевидно адекватных аргуметов нет, раз дело дошло до банального хамства

15 minutes ago, EdgeAligned said:

Ваши слова

Вы знаете разницу между проектированием и кодированием? Нет? Тогда проехали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не хамство, вы сами написали про себя это! Не передергивайте и не обижайтесь. Лучше давайте конструктивно, по делу. Обиды оставьте по свою сторону экрана. Вы сами скахали, что вам сложно запомнить более двух параметров функции. Но черт возьми, программирование - это вообще такая штука, которая предъявляет высокие требования к памяти и мышлению программиста. Иначе это просто не программист, а, с позволения сказать, буквописатель. Да спросите кого угодно из мэтров - они все обладают высокими мыслительными способностями и памятью. Извините, но это так. Ну не может человек без музыкального слуха и моторики пальцев стать хорошим пианистом. Так же и здесь.

Ну, дальше начались ваши говнообиды. Это уже неинтересно и контрпродуктивно. Вы сначала сами сказали, что вам сложно запомнить более двух чисел, а теперь обижаетесь на это. Ну это както не то. Неинтересно. Давайте впредь лучше по делу, без личных обид.

23 часа назад, Forger сказал:

Вы знаете разницу между проектированием и кодированием?

Да. Проектирование - это создание нового. Кодирование - это просто печатание буковок. 🙂 К какой категории вы себя относите? 
Проектировщик должен иметь отличную память, живой ум и прочее. Кодировщику нужно просто быстро печатать.
Блин, а ведь и правда, черт возьми! Теперь я понимаю, откуда появилась приставка "гумно-" к слову "кодер". Хахаха, а ведь так оно и есть, черт подери! Когда "кодер" не может запомнить больеш двух чисел, вот оно на выходе и выходит.

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Arlleex said:

В ООП-стиле я вижу разворачивание самой логики работы программы

К аналогичному решению пришел, описывая структура проекта объектами значительно упростилась его структура, для себя лично даже сделал небольшую визуальную методичку в xmind, в которой выстроил базовую для всех проектов структуру.

Основу позаимствовал из Qt, в частности систему слотов/сигналов, а чтото из старого доброго борланда (общую структуру Application).

Мне так вышло на практике гораздо удобнее, например, очень просто переносить модули из проекта в проект, т.к. модули изначально описываются по одинаковому для всех проектов принципу (речь про их интерфейс).

Ну и старые проекты постепенно переводятся на "новые рельсы", сопровождение упростилось, выработалась некая однозначность и повторяемость. Что сказалось на скорости развития проектов и их адаптации под другое железо (частями или целиком).

 

зы Мне одному кажется эту тему надо убирать из раздела новичков? Все равно ведь мало кто понимает о чем идет речь )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 03.12.2023 в 13:55, Forger сказал:

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

Вызывает недоумение - как вы вообще что-то пишете с такими-то ограничениями??

Например: во всякого рода графических API у большинства функций кол-во параметров - от 4-х и больше.

BitBlt:  https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-bitblt

И это вполне обычная функция.

 

PS: Конечно, если писать только HelloWorld-ы....  :umnik2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, jcxz said:

Например: во всякого рода графических API у большинства функций кол-во параметров - от 4-х и больше.

BitBlt:  https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-bitblt

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 minutes ago, jcxz said:

Вызывает недоумение - как вы вообще что-то пишете с такими-то ограничениями??

Избегаю СОЗДАВАТЬ такие "нечитаемые" функции, но использовать чужие в своих обертках нет никаких проблем - один раз отладил, спрятал и забыл про их существование. 

 

Вот для сравнения ДВА варианта реализации одного и того же:

Вариант 1:

	Hardware::FSMC::Settings settings;
	settings.dataWidth = 8;
	settings.waitSignalPolarity = 0;
	settings.isWriteOperationEnabled = true;
	settings.isDataAddressMultiplexed = false;
	settings.isBurstModeEnabled = false;
	settings.isWrappedBurstEnable = false;
	settings.isWaitSignalActiveDuringWaitState = false;
	settings.isExtendedModeEnabled = false;
	settings.isAsynchronousWaitEnabled = false;
	settings.isWriteBurstEnabled = false;
	settings.readWriteTimings = &timings;
	settings.writeTimings = &timings;
	memory.initialize(settings);

 

Вариант 2:

memory.initialize(8, 0, true, false, false, false, false, false, false, &timings, &timings);

 

Какой кто выберет вариант?

 

Есть еще третий вариант: вместо заполнения полей структуры создавать ворох "микро" inline функций с нормальными понятными именами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 минут назад, jcxz сказал:

во всякого рода графических API у большинства функций кол-во параметров - от 4-х и больше.

Я о том же подумал. Можно конечно запихать всё в одну структуру и передавать еёйную, но это далеко не всегда применимо.
А нормальная IDE при написании показывает, какой параметр нужно ввести.

Снимок экрана 2023-12-04 202300.jpg

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, andrew_b сказал:

Ну, на Некрософт-то ссылаться можно только в качестве антипримера.

Ок. Покажите тогда например - правильный (с вашей точки зрения) прототип функции рисования закрашенного прямоугольника с заданным цветом? (должна принимать указатель на графический контекст устройства вывода, координаты и цвет)

И сколько там будет аргументов?

1 час назад, Forger сказал:

Вариант 2:

memory.initialize(8, 0, true, false, false, false, false, false, false, &timings, &timings);

 

Какой кто выберет вариант?

2-й очевидно оптимальнее по результирующему коду (на ARM) и более читаем (менее громоздок). Он несомненно лучше.

Но конечно, если вам платят за количество строчек исходника  :biggrin: , тогда 1-й вариант будет лучше.

1 час назад, EdgeAligned сказал:

А нормальная IDE при написании показывает, какой параметр нужно ввести.

вот именно. Если уж своего ОЗУ недостаточно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...