Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/140: Рейтинг темы: голосов - 140, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 58

Функция sprintf

26.02.2018, 23:05. Показов 30876. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Вопрос такой формы:
возникли трудности при использовании функции sprintf(все это я использую для вывода значений АЦП1 и АЦП2 на дисплей Ili9341).
C
1
2
3
4
sprintf( result_volt, result_amper, "Sum=%fmV", data_adc,data_adc1); // перевел значения АЦП в строку float
volt=data_adc*1000; // перевел в миливольты
amper=data_adc1*1000; // перевел в милиамеры
sprintf( result_volt, "Voltage: %dmV\nCurrent: %dmA", volt,amper); // вывожу значения на дисплей
В итоге у меня значения result_volt помещаются также и в \nCurrent: %dmA. Как сделать так что бы result_amper правильно выводились на своем месте?
При записи :
C
1
sprintf( result_volt, result_amper, "Voltage: %dmV\nCurrent: %dmA", volt,amper);
ничего не работает вообще.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2018, 23:05
Ответы с готовыми решениями:

засада со sprintf
int i; char *str1; char *str2 str1 = "OBS"; str2 = "DEF"; i = strlen(str1); sprymtf(&str1, "+%s",...

sprintf программный.
штатный sprymtf сжирает сразу 25кб флеша. Кто нибудь знает как с использованием меньшей памяти делать тоже самое ? Интересует :...

Sprintf в fatfs
Помогите, пожалуйста..уже голову сломал есть в программе модуль GPS. из него получаю координаты в типе float. Вот так: ...

24
Эксперт .NET
 Аватар для Rius
13161 / 7720 / 1679
Регистрация: 25.05.2015
Сообщений: 23,518
Записей в блоге: 14
27.02.2018, 01:14
Пример покажите. Как, что, куда и как не так помещается.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
27.02.2018, 06:53
Цитата Сообщение от sssema96 Посмотреть сообщение
sprintf( result_volt, result_amper, "Sum=%fmV", data_adc,data_adc1); // перевел значения АЦП в строку float
ну и что это за result_volt, result_amper???
как объявлены
как работает sprintf в курсе?
http://www.c-cpp.ru/content/sprintf
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
27.02.2018, 09:19
sssema96, На пальцах.
C++
1
2
3
4
5
6
char buf[30];
float amper = 2.56;
float voltage = 3.12;
/*Аргументы: 1)buf - буффер куда будем отгружать отформатированную строку, 2) Сама строка и ее формат, 3...и т.д. - переменные в строке*/
sprintf(buf, "Voltage = %.2fmV, Current = %.2fmA", voltage, current);
printf("%s\r\n", buf);
Тут с двумя знаками после запятой.
0
Эксперт .NET
 Аватар для Rius
13161 / 7720 / 1679
Регистрация: 25.05.2015
Сообщений: 23,518
Записей в блоге: 14
27.02.2018, 09:55
C
1
snprintf(buf, sizeof(buf), ...
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
27.02.2018, 10:04
Цитата Сообщение от Rius Посмотреть сообщение
snprintf
является ли она стандартной? по моему это были микрософтовские выпендрежки
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
27.02.2018, 10:14
ValeryS, является, функция полезная, юзал ее для вывода на дисплей, чтобы дальше строки не уползти и особо не следить за размерами буфферов
1
Эксперт .NET
 Аватар для Rius
13161 / 7720 / 1679
Регистрация: 25.05.2015
Сообщений: 23,518
Записей в блоге: 14
27.02.2018, 10:15
http://www.cplusplus.com/refer... /snprintf/
В стандартах не разбираюсь так, как С++ники. Но на всех кортексах компилятор gcc эту функцию понимает. Разве что спецификатор %f должен подключаться отдельно.
Микрософтовские выпендрежки немного иначе выглядят: https://msdn.microsoft.com/ru-... 7cx93.aspx
1
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
27.02.2018, 10:18
кстати другое дело, что sprintf по умолчанию для компилятора может быть отключена, ибо некоторые используют по умолчанию урезанные стандартные библиотеки для экономии ресурсов. Надо флажки компилятора смотреть.
Встречал 3 случая:
1) Без флага все работает норм
2) Без флага вообще не работает sprintf
3) Без флага работает sprintf, но не поддерживает форматирование float

Добавлено через 1 минуту
Rius,
Цитата Сообщение от Rius Посмотреть сообщение
https://msdn.microsoft.com/ru-ru/library/2ts7cx93.aspx
вот не умеют мелкомягкие в нормальные примеры. Помимо необходимой функции придется разбираться во всей портянке их кода)))
0
Эксперт .NET
 Аватар для Rius
13161 / 7720 / 1679
Регистрация: 25.05.2015
Сообщений: 23,518
Записей в блоге: 14
27.02.2018, 10:22
Цитата Сообщение от _SayHello Посмотреть сообщение
кстати другое дело, что sprintf по умолчанию для компилятора может быть отключена, ибо некоторые используют по умолчанию урезанные стандартные библиотеки для экономии ресурсов. Надо флажки компилятора смотреть.
Вывод float и int на OLED
0
0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 58
27.02.2018, 15:46  [ТС]
ValeryS , Rius, result_volt, result_amper это массивы char[40] в которые помещаются первоначальные результаты снятые АЦП1 и АЦП2 соответственно, только потом я их перевожу в указанную величину.
0
Эксперт .NET
 Аватар для Rius
13161 / 7720 / 1679
Регистрация: 25.05.2015
Сообщений: 23,518
Записей в блоге: 14
27.02.2018, 16:11
sssema96, понятнее не стало.

Добавлено через 11 минут
sssema96,
что содержится в result_volt и result_amper? Покажите значения байт в массивах. Откуда они берутся?
Что вы хотели этим
Цитата Сообщение от sssema96 Посмотреть сообщение
sprintf( result_volt, result_amper, "Sum=%fmV", data_adc,data_adc1);
сделать?
И как это, по вашему, соотносится с
Цитата Сообщение от ValeryS Посмотреть сообщение
как работает sprintf в курсе?
http://www.c-cpp.ru/content/sprintf
?
0
0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 58
27.02.2018, 19:15  [ТС]
Rius,
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int volt;
int amper;
char result_volt[40];
char result_amper[40];
void ADC_IRQHandler (void)
{
    if (ADC_GetITStatus(ADC1, ADC_IT_JEOC) == SET)
        {
            ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC);
            data_adc = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
            data_adc = data_adc*2.91/4096;
 
            ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC);
            data_adc1 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2);
            data_adc1 = data_adc1*2.91/4096;
        }
}
int main(void)
while(1)
   {
       delay_ms(1000);
       ADC_SoftwareStartInjectedConv(ADC1);
       sprintf( result_volt, result_amper, "Sum=%fmV", data_adc,data_adc1);
       volt=data_adc*1000;
       amper=data_adc1*1000;
       sprintf( result_volt, "Voltage: %dmV\nCurrent: %dmA", volt,amper);
Кстати пробовал вывести переменной float - не выводит, поэтому перевел в целые.
0
Эксперт .NET
 Аватар для Rius
13161 / 7720 / 1679
Регистрация: 25.05.2015
Сообщений: 23,518
Записей в блоге: 14
27.02.2018, 19:18
Зачем выполнять умножение/деление прямо в прерывании?

И снова:
Цитата Сообщение от Rius Посмотреть сообщение
И как это, по вашему, соотносится с
Цитата Сообщение от ValeryS Посмотреть сообщение
как работает sprintf в курсе?
http://www.c-cpp.ru/content/sprintf
?
Вы почитайте, как вызывается функция sprintf.
0
0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 58
27.02.2018, 19:22  [ТС]
Rius, В прерывании, вы имеете в виду
C
1
2
       volt=data_adc*1000;
       amper=data_adc1*1000;
здесь?
0
Эксперт .NET
 Аватар для Rius
13161 / 7720 / 1679
Регистрация: 25.05.2015
Сообщений: 23,518
Записей в блоге: 14
27.02.2018, 19:23
Вот этому в прерывании делать нечего:
Цитата Сообщение от sssema96 Посмотреть сообщение
C++
1
2
data_adc = data_adc*2.91/4096;
data_adc1 = data_adc1*2.91/4096;
0
0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 58
27.02.2018, 19:36  [ТС]
Rius,
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void ADC_IRQHandler (void)
{
    if (ADC_GetITStatus(ADC1, ADC_IT_JEOC) == SET)
        {
            ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC);
            data_adc = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
 
            ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC);
            data_adc1 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2);
        }
int main(void)
ADC_SoftwareStartInjectedConv(ADC1);
       sprintf( result_volt, result_amper, "Sum=%fmV", data_adc,data_adc1);
       volt=(data_adc*2.91/4096)*1000;
       amper=(data_adc1*2.91/4096)*1000;
       sprintf( result_volt,result_amper, "Voltage: %dmV\nCurrent: %dmA", volt,amper);
Вот так правильнее будет?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
27.02.2018, 19:39
еще раз
Цитата Сообщение от sssema96 Посмотреть сообщение
sprintf( result_volt,result_amper,
зачем запихивать 2 буфера? sprintf так не работает прочитайте уже наконец документацию на функцию
0
0 / 0 / 0
Регистрация: 12.11.2017
Сообщений: 58
27.02.2018, 19:42  [ТС]
ValeryS,Получается что нужно два значения АЦП1 и АЦП2 поместить в один буфер? Только потом разделить?(
0
Эксперт .NET
 Аватар для Rius
13161 / 7720 / 1679
Регистрация: 25.05.2015
Сообщений: 23,518
Записей в блоге: 14
27.02.2018, 19:42
Лучший ответ Сообщение было отмечено sssema96 как решение

Решение

sssema96, прочитайте наконец про sprintf!
Вы пихаете в функцию то, что она не переваривает.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2018, 19:42
Помогаю со студенческими работами здесь

Где sprintf в CooCox ?
Как работать со sprymtf в CooCox ??? В чистом виде не компилируется. Показывает не понятные ошибки привязанные к ядру. Погуглил, нашел:...

STM32F407 + Yagarto. Проблема с sprintf();
Сегодня столкнулся с проблемой преобразования вещественных чисел в строку используя sprymtf(); #include <stdyo.h> ... char...

sprintf(s, "=%g=", (double) 1.5) -> получаю "==", почему?
вот эта функция: char* get_battery_message(void){ char s; sprymtf(s, "=%g=", (double) 1.5); return s; } возвращает два...

float -> str через sprintf в GCC
Тема скорее всего не новая, но для себя я решения не нашел. в IAR используется функция sprymtf для создания строки, выводимой на экран. В...

LCD и функция sprintf
Всех приветствую. Прошу Вашего совета по следующему поводу. Вопросы дилетантские. Пишу в CVAVR, начал изучать символьный LCD 16*2. Есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru