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

 
 
> Как я получил Адъ, sizeof string
ViKo
сообщение May 12 2015, 07:42
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Создал строку:
char *Buff = "Hello, ViKo!\r\n";
Передаю раз в секунду через CDC в STM32F3Discovery:
CDC_Transmit_FS((uint8_t *)Buff, sizeof Buff);
Получаю в терминальной программе:
HellHellHellHell...

Передаю иначе:
CDC_Transmit_FS((uint8_t *)Buff, sizeof *Buff);
Получаю:
HHHH...

Что же, компилятор не знает длину строки, что хранит в своих таблицах?

P.S. Естественно, когда пишу
CDC_Transmit_FS((uint8_t *)Buff, 14);
то все нормально.

P.P.S. и скобками аргумент для sizeof обкладывал, не помогло.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
desh
сообщение May 13 2015, 14:07
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 113
Регистрация: 25-10-07
Из: Краснодар
Пользователь №: 31 725



Сергей, я Вас безмерно уважаю, но то что, так сделано в функции memcpy - это ни разу не аргумент. Функция CDC_Transmit_FS передает данные во внешний мир и передавать в нее что угодно как минимум не всегда корректно в плане переносимости между платформами из-за порядка байт и выравнивания структур.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2015, 14:17
Сообщение #3


Гуру
******

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



Цитата(desh @ May 13 2015, 17:07) *
Функция CDC_Transmit_FS передает данные
Вот именно, что данные. Которые совсем не обязательно будут массивом байтов. Поэтому возлагать на пользователя необходимость захламлять исходник явными приведениями типа указателя на эти данные к указателю на массив байтов по меньшей мере непрофессионально. Кроме всего прочего параметр должен быть указателем именно на константные данные, потому что функция эти данные не меняет, значит а) может работать и с константными данными (из флеша) и б) константность помогает компилятору сгенерить более оптимальный код.

Все это вопросы хорошего стиля и подобные ляпы в примерах от производителя чести этому производителю не делают.

сравните:

Код
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
....
}

void test()
{
    static char const Hello_string[] = "Слава мне, победителю драконов!";

    CDC_Transmit_FS((uint8_t*)Hello_string, sizeof(Hello_string) - 1);
}

и
Код
uint8_t CDC_Transmit_FS(void const * psrc, uint16_t Len)
{
     uint8_t const * Buf = (uint8_t const *)psrc;
....
}

void test()
{
    static char const Hello_string[] = "Слава мне, победителю драконов!";

    CDC_Transmit_FS(Hello_string, sizeof(Hello_string) - 1);
}

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


--------------------
На любой вопрос даю любой ответ
"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
Эдди
сообщение May 13 2015, 15:32
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Цитата(Сергей Борщ @ May 13 2015, 17:17) *
одна строка в исходнике библиотечной функции разгружает от мусора исходник приложения и позволяет сосредоточится на решении задачи.

Угу. Скажите это быдлокодерам из STM. Они сколько лет SPL пилили, пока не поняли, что говно сваяли? А теперь другой кал пилят.
Не надо этой гадостью пользоваться, умоляю!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ViKo   Как я получил Адъ   May 12 2015, 07:42
- - V_G   Поищите в вашей версии Си функцию типа strlen. Ис...   May 12 2015, 07:50
|- - ViKo   Цитата(V_G @ May 12 2015, 10:50) Поищите ...   May 12 2015, 08:05
|- - aaarrr   Цитата(ViKo @ May 12 2015, 11:05) Мне неп...   May 12 2015, 08:21
- - CrimsonPig   Цитата(ViKo @ May 12 2015, 08:42) Что же,...   May 12 2015, 08:18
- - ViKo   О, спасибо! Действительно, все оказалось прост...   May 12 2015, 08:24
|- - aaarrr   Цитата(ViKo @ May 12 2015, 11:24) А длину...   May 12 2015, 08:29
- - ViKo   Однако, sizeof вычисляется на этапе компиляции (об...   May 12 2015, 16:15
|- - CrimsonPig   Цитата(ViKo @ May 12 2015, 17:15) Можно п...   May 12 2015, 17:12
||- - ViKo   Цитата(CrimsonPig @ May 12 2015, 20:12) Н...   May 12 2015, 18:44
|- - demiurg_spb   Цитата(ViKo @ May 12 2015, 19:15) Однако,...   May 13 2015, 14:47
- - desh   ЦитатаА длину строки, на которую указывает указате...   May 13 2015, 13:16
|- - Сергей Борщ   Цитата(desh @ May 13 2015, 16:16) Не вдав...   May 13 2015, 13:23


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 16:33
Рейтинг@Mail.ru


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