реклама на сайте
подробности

 
 
26 страниц V  « < 7 8 9 10 11 > »   
Reply to this topicStart new topic
> Библиотеки для STM32
Obam
сообщение Apr 7 2017, 09:48
Сообщение #121


Знающий
****

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



Из #109
Цитата
…биты можно освоить и простым сложением величин...

Пожалуй, всплакну. Не прёт меня логические операции арифметическими реализовывать.


Цитата(Forger @ Apr 7 2017, 13:38) *
Такую "кашу" из букв даже при желании сочинить трудно, определенно нужен "талант"! sm.gif

Никакой отсебятины. Brian Kernighan and Dennis Ritchie. Pure. (; Скриншот, надеюсь, не заставите представлять…

Сообщение отредактировал Obam - Apr 7 2017, 09:50


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 7 2017, 09:52
Сообщение #122


Профессионал
*****

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



Цитата(Obam @ Apr 7 2017, 12:48) *
Никакой отсебятины. Brian Kernighan and Dennis Ritchie. Pure. (;

Так они уже старенькие, им простительно sm.gif
В те дремучие времена полноценные имена для переменных были не доступны (ограничения железа/софта), да и программы тогда были очень простые в сравнении с современными...

С таким же успехом можно сравнивать паровую машину с современной )))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 7 2017, 10:02
Сообщение #123


Знающий
****

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



Он - старенький; Риччи 6 лет как помер.
Так ведь с тех "дремучих времён" текст в книжке можно ж было и поправить. Не раз.

Нормально на "Электронике-60" было, желание надо было просто иметь…

"… да и программы тогда были очень простые в сравнении с современными..." ой простыыыыми, что целый Unix накатали (;

Сообщение отредактировал Obam - Apr 7 2017, 10:05


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 7 2017, 10:14
Сообщение #124


Профессионал
*****

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



Цитата(Obam @ Apr 7 2017, 13:02) *
Так ведь с тех "дремучих времён" текст в книжке можно ж было и поправить. Не раз.

Не было этой темы и даже этого форума, поэтому не знали люди, как можно жисть упростить ))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 7 2017, 10:25
Сообщение #125


Профессионал
*****

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



Цитата(Obam @ Apr 7 2017, 14:48) *
Никакой отсебятины. Brian Kernighan and Dennis Ritchie. Pure. (; Скриншот, надеюсь, не заставите представлять…
нормальная каша. на пальцах разжёвано что такое адрес и указатель. всё понятно. Вот только там нет рекомендаций про стиль кода. А для учебника Си, для 5 строк кода, особенно для раздела указателей (и ссылок в с++), наверно даже нужно в имя переменной втолкнуть тип.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Apr 7 2017, 10:38
Сообщение #126


Профессионал
*****

Группа: Свой
Сообщений: 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-а или откладываете это на потом? wink.gif

Таких
Код
Warning[Pe550]: variable "i" was set but never used

бывает много. На остальные всегда смотрится.

Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 7 2017, 10:54
Сообщение #127


Знающий
****

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



Шаг за шагом, по каждому warning-у, а можно ещё и remarks

Workspace -> Options -> C/C++ Compiler -> Diagnostics -> птички "Enable remarks", "Treat all warnings as errors"
Workspace -> Options -> Linker -> то ж самое
меню Tools -> Options -> Messages… -> Show build messages -> All

Сообщение отредактировал Obam - Apr 7 2017, 10:58


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 7 2017, 11:06
Сообщение #128


Профессионал
*****

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



Цитата(Alechek @ Apr 7 2017, 13:38) *
IAR

Как заставить ругаться на все неправильные варианты?

Во-первых, не писать такой код, где фигурируют магические числа (кроме числа ноль).
Заменяйте ваши ноунейм указатели указателями на структуры, дав им логичные имена.
Используйте встроенный оператор sizeof, чтобы уйти от магических цифр.
Учтите, что sizeof указателя будет давать размер указателя, но не данных, куда он указывает. Поэтому в sizeof() ставьте тип данных, а не сам объект.
Используйте приведение типов, это вносит хотя бы дополнительную полезную информацию в и без того куцый и корявый код ))
Смело используйте typedef, создавая свои осмысленные типы. Это приучает к порядку в коде.
Указатели используйте как можно реже и старайтесь ограничивать область их видимости и применения хотя бы в пределах одного файла.
Не нужно раньше времени заморачиваться на экономии ОЗУ или FLASH, в современных МК это не проблема.

В вашем примере я бы отказался от memcpy и использовал копирование в самописном цикле. Это будет явно и избавит от детских ошибок.

Если пишите под плюсами, пользуйтесь ссылками, а указателей быть не должно.

За глобальные указатели - расстрел на месте!

Цитата
На остальные всегда смотрится.

На них вообще не приходится смотреть, если их вообще нет, т.е. "Warnings: 0". По-моему, это проще ))

Порядок начинается с самодисциплины, но, если ее нет, то все остальные потуги тщетны - будете наступать на детские грабли, причем, на одни и те же и на ровном месте!
А дописывать в имя переменной ее тип - это костыль для хромого кода, рано или поздно костыль сломается....

Короче, мой вам совет - читайте книжки опытных программеров (здесь они озвучивались), двигайтесь вперед и все получится, БЕЗ КОСТЫЛЕЙ wink.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Alechek
сообщение Apr 7 2017, 11:27
Сообщение #129


Профессионал
*****

Группа: Свой
Сообщений: 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) *
Короче, мой вам совет - читайте книжки опытных программеров (здесь они озвучивались), двигайтесь вперед и все получится, БЕЗ КОСТЫЛЕЙ wink.gif

Если честно, то сымый лучший код, который я видел - это исходники WINCE. прочее и рядом не стояло. особенно озвучивамый тут linux.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 7 2017, 11:47
Сообщение #130


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Alechek @ Apr 7 2017, 13:38) *
Как заставить ругаться на все неправильные варианты?
Все эти варианты синтаксически правильные. Заставлять надо программиста, чтобы учил язык и писал понятный код.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Alechek
сообщение Apr 7 2017, 11:51
Сообщение #131


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



А в чем memcpy непонятный?

я за то, что
Код
memcpy(pWorkData, pInData, sizeof(*pWorkData));

, снабженный комментарием, ЗАЧЕМ мы это делаем - самый понтяный вариант.
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 7 2017, 11:55
Сообщение #132


Профессионал
*****

Группа: Свой
Сообщений: 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()... паттерны - тоже указатели. обращение к регистрам перефирии процессора - опять указатели. Куда без них?
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 7 2017, 12:24
Сообщение #133


Профессионал
*****

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



Цитата
memcpy - можно реализовать разными способами.... можно опуститься на уровень ассемблера и написать ассемлерный код копипаста. memcpy - реализован самым оптимальным способом. поэтому не нужно изобретать велосипед свой цикл копирования, а использовать memcpy.

Как видим, некоторым программистом memcpy - зло. Потому нет беды, если будет обычный цикл, за то нет детских граблей.

Цитата
сплошь и рядом указатели. Ссылка должна быть там, где она должна быть, а указатель - где указатель. Eсли с++, то там ооп. а ооп - это сплошь и рядом указатели... всякие createWindow(), getSender()... паттерны - тоже указатели. обращение к регистрам перефирии процессора - опять указатели. Куда без них?

Обратите внимание, кому я обращал тот пост - профи сами разберутся что к чему, а новичку дай высокотехнологичный инструмент, так руки себе отпилит ...
Кто обращается к регистрам напрямую, те никогда не наступают на грабли с memcpy wink.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Alechek
сообщение Apr 7 2017, 12:38
Сообщение #134


Профессионал
*****

Группа: Свой
Сообщений: 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)
-сразу видно, что передается указатель.

Вы противоречите самому себе sm.gif

Цитата(juvf @ Apr 7 2017, 16:55) *
memcpy - можно реализовать разными способами.... можно опуститься на уровень ассемблера и написать ассемлерный код копипаста. memcpy - реализован самым оптимальным способом. поэтому не нужно изобретать велосипед свой цикл копирования, а использовать memcpy.

Скорее всего, и имелось ввиду использовать вместо memcpy присвоение неких структур через указатели на них.
вот, только массивы в структурах могут быть открытими... (в С)
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 7 2017, 12:42
Сообщение #135


Знающий
****

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



Цитата(Forger @ Apr 7 2017, 16:24) *
Кто обращается к регистрам напрямую, те никогда не наступают на грабли с memcpy wink.gif

Назад на пальму к корням в ассмы!!! Шутка…


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post

26 страниц V  « < 7 8 9 10 11 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th August 2025 - 20:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016