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

 
 
> Как я получил Адъ, 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, 13:16
Сообщение #2


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

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



Цитата
А длину строки, на которую указывает указатель, только с помощью strlen вычислять?


Если строка не меняется между вызовами, то через sizeof(Buff) - 1

Код
const uint8_t Buff[] = "Hello, ViKo!\r\n";
CDC_Transmit_FS(Buff, sizeof(Buff) - 1);


Цитата
Это камень в бошки программистов STM32Cube


Не вдаваясь в подробности реализации CDC_Transmit_FS внутри функции указатель типа uint8_t * проще инкрементировать или обращаться к произвольному элементу по индексу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 13 2015, 13:23
Сообщение #3


Гуру
******

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



Цитата(desh @ May 13 2015, 16:16) *
Не вдаваясь в подробности реализации CDC_Transmit_FS внутри функции указатель типа uint8_t * проще инкрементировать или обращаться к произвольному элементу по индексу.
Действия внутри функции - личное дело ее создателя. Никто и ничто не мешает ему создать локальную копию переданного указателя любого нужного типа. Поскольку функция может передавать что угодно, она должна получать "указатель на константное что угодно", т.е. void const *. В качестве примера можно посмотреть на memcpy() и подобные функции.


--------------------
На любой вопрос даю любой ответ
"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

Сообщений в этой теме
- 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, 14:07
- - Сергей Борщ   Цитата(desh @ May 13 2015, 17:07) Функция...   May 13 2015, 14:17
- - Эдди   Цитата(Сергей Борщ @ May 13 2015, 17:17) ...   May 13 2015, 15:32


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

 


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


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