|
|
  |
Библиотеки для STM32 |
|
|
|
Apr 7 2017, 16:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Forger @ Apr 7 2017, 21:08)  Отсюда простой вопрос: зачем в имени указателя на класс указывать тот факт, что он указатель? Приведите пример, где без этого никак не обойтись. Обойтись всегда можно. Вопрос в последствиях. Которые я уже приводилКод memcpy( WorkData, InData, sizeof( WorkData)); memcpy(&WorkData, &InData, sizeof(*WorkData)); Наличие префикса сильно помогает в поиске таких багов. Цитата(Forger @ Apr 7 2017, 21:08)  Какой смысл каким-то образом выделять в имени переменных класса (правильно называть "поля" класса) их расовую принадлежность? Приведите пример, где без этого никак не обойтись. или хотя бы приведите пример, где необходимо выделения имени глобальной переменной? Суть в том, чтобы было видно, что изменяется такая переменная, которая может использоваться вне тела функции. И можно было не вникая и не подгружая ВЕСЬ проект, сказать что-то типа: чувак, вот ты зуб даешь, что ЭТУ переменную можно модифицировать неатомарно?
|
|
|
|
|
Apr 7 2017, 16:44
|

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

|
Цитата(Alechek @ Apr 7 2017, 19:31)  Обойтись всегда можно. Вопрос в последствиях. Которые я уже приводилКод memcpy( WorkData, InData, sizeof( WorkData)); memcpy(&WorkData, &InData, sizeof(*WorkData)); Неужели наличие префиксов/суффиксов в переменных сильно помогает в поиске багов в таком "коде"?  sizeof(WorkData) = 4 - размер указателя в байтах чесс слово никогда не сталкивался с такой необходимостью - копировать указатель побайтно! Даже по пьяни я так не сумею написать, т.к. подобный код сам по себе есть рассадник багов на пустом месте - с memcpy нужно быть предельно аккуратным! Цитата Суть в том, чтобы было видно, что изменяется такая переменная, которая может использоваться вне тела функции. И можно было не вникая и не подгружая ВЕСЬ проект, сказать что-то типа: чувак, вот ты зуб даешь, что ЭТУ переменную можно модифицировать неатомарно?
Для этого сделайте соотв. функции и обращайтесь к этой глабальной переменной ТОЛЬКО через эти функции, тогда этой переменной можно добавить static. Внутри этих функций обеспечивайте атомарность. Какой смысл это делать по всему коду, это если можно сделать в одном месте и в одном месте это отладить и проверить?
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 7 2017, 17:57
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Forger @ Apr 7 2017, 21:44)  Неужели наличие префиксов/суффиксов в переменных сильно помогает в поиске багов в таком "коде"?  sizeof(WorkData) = 4 - размер указателя в байтах чесс слово никогда не сталкивался с такой необходимостью - копировать указатель побайтно!  Знаете, я тоже не сталкивался с НЕОБХОДИМОСТЬЮ копировать указатель побайтно. Но порой такое возникает вопреки желанию. В этих 2-х строчках ошибки. Смотрите чуть шире.
|
|
|
|
|
Apr 7 2017, 18:41
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
ДА, помогает. Более развернутый пример, как это случается. Код struct sdata { ... }
const struct sdata DefalutData = {1, 2};
void f(struct sdata * OutData) { ... //тра-ля-ля на строк 20-30 кода ... memcpy(OutData, &DefaultData, sizeof(DefautData); // тут сложно будеть выявить недостачу/переизбыток [?*] ... // дальнейшие манипуляции с OutData
} повторю, это все равно упрощенный случай. в конкретном случае можно было бы и обойтись *OutData = DefaultData; // Хотя по мне так тоже некрасиво именовано.
|
|
|
|
|
Apr 8 2017, 09:59
|

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

|
Я обратил внимание, что ваш код из примера по ходу развития этой темы неоднократно эволюционировал! Прихожу к выводу, что вы все же прислушивались к постам участников, которые советовали как нужно изменить изначально кривой код. Это радует )) В итоге пример перерос в то, чем он должен быть: Код *OutData = DefaultData; (на названия переменных уже не обращаю внимание, в данном случае это не столь принципиально). В этом случае при присвоении одной структуры другой неявно вызывается оператор копирования, внутри которого как раз и вызывается та самая memcpy, но вызывается с правильными параметрами. Ошибиться в этом случае уже не получится - компилятор заругается. Цель достигнута! Бинго! Однако, я никак не пойму вашего упорства .... впрочем, догадываюсь )) Но это уже отдельный разговор и не для этой темы.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 18 2017, 06:16
|

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

|
Цитата(juvf @ Apr 18 2017, 09:03)  раз тут пошло обсуждение стилей.... спрошу тут... в абдурино есть представление чисел в двоичной форме. например 0х82 выглядит в коде как-то так "b10000010". Это - анахронизм, оставшийся в наследство от ассемблера или некоторых с-компиляторов (я сам таким грешил на PIC-контроллерах, в свое время). Лишь еще один способ представления "магических чисел". В чистом коде не должно быть "магических" чисел! Их все заменяют осмысленными #define, которые стараются размещать в одном месте. Битовые же поля удобно упаковывать в структуры. Все современные компиляторы поддерживают безымянные union. Это позволяет к одним и тем же полям в структуре обращаться побитово или сразу словом. Если же речь идет о прямом обращении к регистрам ARM проца, то под каждый такой проц. уже давно существуют соотв. файлы, где все биты регистров названы человеческими именами. з.ы С одной стороны хорошо, что существует Arduino - значительно легче влиться в эту профессию, а с другой - он тянет кучу вредных привычек, от которых потом сложно переучиваться.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 18 2017, 06:50
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 15-07-06
Пользователь №: 18 836

|
Цитата(juvf @ Apr 18 2017, 09:03)  в абдурино есть представление чисел в двоичной форме. например 0х82 выглядит в коде как-то так "b10000010". можно что-нибудь подобное макросами в си/с++ замутить? В C++ можно писать 0b10000010, если компилятор не сильно старый.
|
|
|
|
|
Apr 18 2017, 07:05
|

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

|
Цитата(Forger @ Apr 18 2017, 11:16)  Это - анахронизм я б так не сказал.... в современном verilog он есть. Цитата все заменяют ... #define а может действительно, сгенерировать хидер и там 256 (или 2^16) дефайнов определить. сп за идею Цитата Все современные компиляторы поддерживают безымянные union. Это позволяет к одним и тем же полям в структуре обращаться побитово или сразу словом. да, но только это обращение "долгое". гораздо быстрее с константами работать, чем из юниона вытаскивать битики. Цитата(Reflector @ Apr 18 2017, 11:50)  В C++ можно писать 0b10000010, если компилятор не сильно старый. Вкатило. То что нужно. СПАСБО!!!!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|