|
|
  |
Библиотеки для STM32 |
|
|
|
Apr 7 2017, 09:48
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Из #109 Цитата …биты можно освоить и простым сложением величин... Пожалуй, всплакну. Не прёт меня логические операции арифметическими реализовывать. Цитата(Forger @ Apr 7 2017, 13:38)  Такую "кашу" из букв даже при желании сочинить трудно, определенно нужен "талант"!  Никакой отсебятины. Brian Kernighan and Dennis Ritchie. Pure. (; Скриншот, надеюсь, не заставите представлять…
Сообщение отредактировал Obam - Apr 7 2017, 09:50
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Apr 7 2017, 09:52
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Obam @ Apr 7 2017, 12:48)  Никакой отсебятины. Brian Kernighan and Dennis Ritchie. Pure. (; Так они уже старенькие, им простительно В те дремучие времена полноценные имена для переменных были не доступны (ограничения железа/софта), да и программы тогда были очень простые в сравнении с современными... С таким же успехом можно сравнивать паровую машину с современной )))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 7 2017, 10:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Forger @ Apr 7 2017, 12:22)  Так смените свой компилятор на нормальный, которому это не пофиг! Или покопайтесь в настройках компилятора, чтобы он ругался на такие вещи хотя бы warning-ми. Честно слово, как дети малые ... IAR Как заставить ругаться на все неправильные варианты? Цитата void f(int * InData) { int * WorkData; memcpy(WorkData, InData, 10); memcpy(&WorkData, InData, 10); memcpy(&WorkData, &InData, 10); memcpy(WorkData, &InData, 10); } Цитата(Forger @ Apr 7 2017, 12:22)  зы. Скажите, при сборке всего проекта вы сразу добиваетесь, чтобы не было ни одного warning-а или откладываете это на потом?  Таких Код Warning[Pe550]: variable "i" was set but never used бывает много. На остальные всегда смотрится.
|
|
|
|
|
Apr 7 2017, 11:06
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Alechek @ Apr 7 2017, 13:38)  IAR
Как заставить ругаться на все неправильные варианты? Во-первых, не писать такой код, где фигурируют магические числа (кроме числа ноль). Заменяйте ваши ноунейм указатели указателями на структуры, дав им логичные имена. Используйте встроенный оператор sizeof, чтобы уйти от магических цифр. Учтите, что sizeof указателя будет давать размер указателя, но не данных, куда он указывает. Поэтому в sizeof() ставьте тип данных, а не сам объект. Используйте приведение типов, это вносит хотя бы дополнительную полезную информацию в и без того куцый и корявый код )) Смело используйте typedef, создавая свои осмысленные типы. Это приучает к порядку в коде. Указатели используйте как можно реже и старайтесь ограничивать область их видимости и применения хотя бы в пределах одного файла. Не нужно раньше времени заморачиваться на экономии ОЗУ или FLASH, в современных МК это не проблема. В вашем примере я бы отказался от memcpy и использовал копирование в самописном цикле. Это будет явно и избавит от детских ошибок. Если пишите под плюсами, пользуйтесь ссылками, а указателей быть не должно. За глобальные указатели - расстрел на месте! Цитата На остальные всегда смотрится. На них вообще не приходится смотреть, если их вообще нет, т.е. "Warnings: 0". По-моему, это проще )) Порядок начинается с самодисциплины, но, если ее нет, то все остальные потуги тщетны - будете наступать на детские грабли, причем, на одни и те же и на ровном месте! А дописывать в имя переменной ее тип - это костыль для хромого кода, рано или поздно костыль сломается.... Короче, мой вам совет - читайте книжки опытных программеров (здесь они озвучивались), двигайтесь вперед и все получится, БЕЗ КОСТЫЛЕЙ
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 7 2017, 11:27
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Forger @ Apr 7 2017, 16:06)  Заменяйте ваши ноунейм указатели указателями на структуры, дав им логичные имена. Используйте встроенный оператор sizeof, чтобы уйти от магических цифр. Смело используйте typedef, создавая свои осмысленные типы. Это приучает к порядку в коде. И чем эти советы помогут в этом? Цитата typedef struct stream_data { uint32_t Header; uint8_t Data[10]; } STREAMDATA, *LPSTREADMATA;
void f(LPSTREADMATA InData) { char WorkData[120]; memcpy( WorkData, InData, sizeof(*WorkData)); memcpy(&WorkData, InData, sizeof( WorkData)); memcpy(&WorkData, &InData, sizeof(*WorkData)); memcpy( WorkData, &InData, sizeof( WorkData)); } не использовать memcpy? Цитата(Forger @ Apr 7 2017, 16:06)  Короче, мой вам совет - читайте книжки опытных программеров (здесь они озвучивались), двигайтесь вперед и все получится, БЕЗ КОСТЫЛЕЙ  Если честно, то сымый лучший код, который я видел - это исходники WINCE. прочее и рядом не стояло. особенно озвучивамый тут linux.
|
|
|
|
|
Apr 7 2017, 11:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
А в чем memcpy непонятный? я за то, что Код memcpy(pWorkData, pInData, sizeof(*pWorkData)); , снабженный комментарием, ЗАЧЕМ мы это делаем - самый понтяный вариант.
|
|
|
|
|
Apr 7 2017, 11:55
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата Код memcpy(WorkData, InData, 10); это выстрел себе в ногу. компилятор тут не поможет. стиль кода и имена переменных тоже. к типу указатель viod вроде как си неявно преобразует без ограничений. Код я бы отказался от memcpy и использовал копирование в самописном цикле. memcpy - можно реализовать разными способами.... можно опуститься на уровень ассемблера и написать ассемлерный код копипаста. memcpy - реализован самым оптимальным способом. поэтому не нужно изобретать велосипед свой цикл копирования, а использовать memcpy. Код void f(LPSTREADMATA InData) { char WorkData[120];
memcpy( WorkData, InData, sizeof(*WorkData)); memcpy(&WorkData, InData, sizeof( WorkData)); memcpy(&WorkData, &InData, sizeof(*WorkData)); memcpy( WorkData, &InData, sizeof( WorkData)); } что за бред? а если WorkData, InData вы назавете pWorkData, pInData - это сильно поможет? Код void f(LPSTREADMATA InData) Глядя на это, я не понимаю что передается в функцию. я не люблю когда тайпдефят указатели. я бы определил функцию как Код void f(STREAMDATA *InData) -сразу видно, что передается указатель. Цитата Если пишите под плюсами, пользуйтесь ссылками, а указателей быть не должно. сплошь и рядом указатели. Ссылка должна быть там, где она должна быть, а указатель - где указатель. Eсли с++, то там ооп. а ооп - это сплошь и рядом указатели... всякие createWindow(), getSender()... паттерны - тоже указатели. обращение к регистрам перефирии процессора - опять указатели. Куда без них?
|
|
|
|
|
Apr 7 2017, 12:24
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата memcpy - можно реализовать разными способами.... можно опуститься на уровень ассемблера и написать ассемлерный код копипаста. memcpy - реализован самым оптимальным способом. поэтому не нужно изобретать велосипед свой цикл копирования, а использовать memcpy. Как видим, некоторым программистом memcpy - зло. Потому нет беды, если будет обычный цикл, за то нет детских граблей. Цитата сплошь и рядом указатели. Ссылка должна быть там, где она должна быть, а указатель - где указатель. Eсли с++, то там ооп. а ооп - это сплошь и рядом указатели... всякие createWindow(), getSender()... паттерны - тоже указатели. обращение к регистрам перефирии процессора - опять указатели. Куда без них? Обратите внимание, кому я обращал тот пост - профи сами разберутся что к чему, а новичку дай высокотехнологичный инструмент, так руки себе отпилит ... Кто обращается к регистрам напрямую, те никогда не наступают на грабли с memcpy
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 7 2017, 12:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(juvf @ Apr 7 2017, 16:55)  Код memcpy( WorkData, InData, sizeof(*WorkData)); memcpy( WorkData, &InData, sizeof( WorkData)); } что за бред? а если WorkData, InData вы назавете pWorkData, pInData - это сильно поможет? void f( LPSTREADMATA InData) Глядя на это, я не понимаю что передается в функцию. я не люблю когда тайпдефят указатели. я бы определил функцию как void f( STREAMDATA *InData) - сразу видно, что передается указатель. Вы противоречите самому себе  Цитата(juvf @ Apr 7 2017, 16:55)  memcpy - можно реализовать разными способами.... можно опуститься на уровень ассемблера и написать ассемлерный код копипаста. memcpy - реализован самым оптимальным способом. поэтому не нужно изобретать велосипед свой цикл копирования, а использовать memcpy. Скорее всего, и имелось ввиду использовать вместо memcpy присвоение неких структур через указатели на них. вот, только массивы в структурах могут быть открытими... (в С)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|