Як і багато систем програмування на мові C, IAR Embedded Workbench for ARM має так звані засоби форматированного виведення (Formatted Output). Це спрощує текстовий висновок даних різних типів в консоль екрану або в рядок за допомогою функцій fprintf. printf. sprintf. vfprintf. vprintf і vsprintf. Далі представлений переклад help IAR (Help -> Content. -> закладка Пошук -> введіть в поле введення formated output, натисніть Enter -> в списку розділів подвійним клацанням клікніть на Formatted Output DLIB).
За замовчуванням в проекті IAR для виведення налаштована бібліотека DLIB. Деякі функції цієї бібліотеки допоможуть Вам перетворити значення даних (змінних, констант) з їх внутрішнього подання в текстову послідовність, яка зручна для читання людиною. Ви надаєте рядок формату (format string) як значення аргументу формату для кожної такої функції. Функції fprintf, printf, sprintf, vfprintf, vprintf і vsprintf (вони визначені в
[Формати друку (Print Formats)]
Рядок формату має однаковий синтаксис і для функцій друку (типу pfrintf, sprintf і т. П.), Для скануючих функцій форматированного введення (scan functions. Зразок sscanf). Розбір синтаксису рядка показаний на діаграмі.
Функція друку сканує рядок формату від початку до кінця, щоб визначити, які перетворення потрібно виконати. Кожна функція друку приймає будь-яку кількість аргументів, або працює під безпосереднім керівництвом аргументу типу va_list. Деякі специфікації перетворення друку в рядку формату використовують наступний параметр в списку. Функція друку використовує кожен свій послідовний аргумент не більш, ніж один раз. Деякі останні аргументи (якщо вони не мають відповідного їм специфікатор перетворення) можуть залишитися невикористовуваними. Якщо аргументів недостатньо (тобто їх виявлено менше, ніж є специфікаторів перетворення в рядку формату), то компілятор видасть відповідне попередження (Warning [Pe224]: the format string requires additional arguments імя_модуля.c номер_рядка).
Далі в описі прийняті наступні угоди про терміни:
- integer conversions (цілочисельні перетворення) - це специфікатор перетворення (conversion specifiers), які закінчуються на d. i. o. u. x. або X
- floating-point conversions (перетворення з плаваючою точкою) - це специфікатор перетворення, які закінчуються на e. E. f. g. or G
[Функції друку (Print Functions)]
Для функцій друку (printf, sprintf і т. П.) Простий текст або пробіл в рядку формату генерує такий же текст, який відповідає рядку формату. Специфікація перетворення друку (print conversion specification) зазвичай генерує символи шляхом перетворення наступного значення аргументу в відповідну послідовність тексту. Ось формат print conversion specification:
Жирним текстом на зображенні показані можливості, додані в стандарті C99.
За символом відсотка (%) в рядку формату Ви можете вказати нуль або більшу кількість прапорів формату (format flags):
- для перетворення, вирівняного по лівому краю
+ для генерації знака "плюс" для значень зі знаком (signed), які позитивні
space (пропуск) для генерації пропуску для значень зі знаком (signed), які не мають в ні знака "плюс", ні знака "мінус" (т. е. для позитивних значень)
# Для префіксного 0 перетворення o, для префікса 0x перетворення x, для префікса 0X перетворення X, або для генерації десяткового дробу і чисел дробової частини, які в іншому випадку будуть придушені на перетворенні з плаваючою точкою
0 для доповнення перетворення початковими нулями після будь-якого знака або префікса, при відсутності прапора формату мінус (-) або зазначеної точності
Після будь-якого формату прапорів Ви можете вказати ширину поля (field width), яке визначає мінімальну кількість символів для генерації при перетворенні. За винятком випадку скасування прапором формату, поведінка за умовчанням - зліва доповнювати пробілами короткий перетворення. Якщо Ви вкажете зірочку (*), замість десяткового значення в поле ширини, то функція друку приймає значення наступного аргументу (який повинен бути цілого типу, int) як поле ширини. Якщо аргумент має від'ємне значення, він надає прапор формату "-" і величину поля ширини.
Після будь-якого поля ширини Ви можете вказати точку (.), За якою йде точність (precision), яка вказує один з наступних варіантів:
- або мінімальну кількість цифр для генерації целочисленного перетворення,
- або кількість цифр дробової частини для генерації перетворень e, E або f,
- або максимальну кількість значущих цифр для перетворень g або G,
- або максимальну кількість символів для генерації C-рядки (C string) перетворення s.
Ви можете вказати * замість десяткової цифри для точності, при цьому функція друку приймає значення наступного аргументу (який повинен бути цілого типу, int) як поле точності. Якщо аргумент має від'ємне значення, то використовується точність за замовчуванням. Якщо Ви не вказали * або десяткове число після точки, то точність буде нуль.
[Специфікатори перетворення друку (Print Conversion Specifiers)]
Після вказівки поля точності Ви можете вказати один символ print conversion specifier. якому може передувати Односимвольний або однорядкове резюме кваліфікатор. Кожна комбінація визначає тип, який потрібно для відповідного перетворюється аргументу (якщо він є), і як бібліотечні функції змінюють значення аргументу перед його перетворенням в текстову послідовність. Перетворення integer і floating-point також визначають базу для використання текстового подання. Якщо специфікатор перетворення вимагає точності p, і Ви не надали її в форматі, специфікатор перетворення вибирає значення для замовчування для точності. У цій таблиці наведено всі задані комбінації і їх властивості.
Conversion Specifier
(Специфікатор перетворення)
Специфікатори print conversion визначають також будь-яка поведінка, яка не зведено в цю таблицю. Для всіх перетворень з плаваючою точкою:
- Позитивна нескінченність друкується як inf або INF (від слова infinity).
- Негативна нескінченність друкується як -inf або -INF.
- Чи не число (Not-a-number, NaN) друкується як nan або NAN.
Версії верхнього регістру (upper-case) друкуються тільки conversion specifier в верхньому регістрі, такого як% E, але не як% Lg.
Далі в прикладах символом p позначається точність (precision). Приклади слідують кожним специфікаторами перетворення. Одиночне перетворення може згенерувати до 509 символів.
Вкажіть% a або% A для генерації шістнадцятирічного дрібного уявлення зі знаком, з десятковою маються на експонентою ступеня двійки. Генерований текст виходить виду ± 0Xh.hhhP ± dd, де ± або плюс або мінус, символ X або x (для перетворення% a), або X (для перетворення% A), символ h шестнадцатеричная цифра, символ d десяткова цифра, шестнадцатеричная точка (.) є десятковою крапкою для поточної локалізації (current locale), і символ P буде або p (для перетворення% a), або P (для перетворення% A). Згенерований текст має одну цілу цифру, яка буде 0 тільки для нульового значення, шестнадцатеричная точка якщо є будь-які цифри дробу, або якщо Ви вказали прапор формату # для більшості p цифр дробової частини без завершальних нулів, і як мінімум одну цифру експоненти без лідируючих нулів. Результат буде заокруглений. Значення 0 має нульову експоненту. приклади:
Вкажіть% c для генерації одного символу з преутвореного значення.
Вкажіть ..% i. % O. % U. % X або% X для генерації можливого подання цілого числа зі знаком (signed integer). Варіанти. або% i вказують десяткове зі знаком (signed decimal),% o беззнаковое вісімкове (unsigned octal),% u беззнаковое десяткове (unsigned decimal),% x беззнаковое шестнадцатеричное (unsigned hexadecimal) з використанням символів 0-9 і af,% X unsigned hexadecimal з використанням символів 0-9 і AF. Перетворення генерує як мінімум p цифр, отриманих з преутвореного значення. Якщо p нуль, то конвертована величина 0 не генерує цифр.
Вкажіть% e або% E для генерації уявлення десяткового дробового числа зі знаком (signed decimal fractional) з десятковою маються на експонентою ступеня 10. Генерований текст вийде виду ± d.dddE ± dd, де ± знак або плюса, або мінуса, d десяткова цифра, десяткова точка (.) це десяткова точка для поточної мови локалі, E це або e (для перетворення% e) або E (для перетворення% E). Генерований текст має одну цілу цифру, десяткову точку якщо p нульове або якщо Ви вказали прапор формату #, p цифр дробової, і як мінімум дві цифри експоненти. Результат округляється. Значення 0 має нульову експоненту.
Вкажіть% f або% F для генерації уявлення десяткового дробового числа зі знаком без експоненти (signed decimal fractional, no exponent). Згенерований текст буде в формі ± d.ddd, де ± знак або плюса, або мінуса, d десяткова цифра, і десятковою крапкою (.) Є десяткова точка для поточної мовної локалі. Згенерований текст має як мінімум одну цілу цифру, десяткову точку, якщо p НЕ нуль або якщо Ви вказали прапор формату #, і p цифр дробової частини. Результат округляється.
Вкажіть% g або% G для генерації уявлення дрібного десяткового числа зі знаком (signed decimal fractional), у якого є чи ні десяткова експонента ступеня 10, якщо це підходить. Для перетворення% g генерований текст виходить в тій же формі, що і перетворення% e або% f. Для перетворення% G виходить та сама форма тексту, що і для перетворення% E або% F. Точність p вказує кількість генеруються значущих цифр (якщо p нульова, то вона змінюється на 1). Якщо перетворення% e призведе до експоненті в діапазоні (-4, p), то замість цього буде використовуватися перетворення% f. Генерований текст не матиме завершальних нулів в будь-який дробової частини і має десяткову точку тільки якщо є ненульові цифри дробової частини, і якщо Ви не вказали прапор формату #.
Вкажіть% p для генерації зовнішнього подання покажчика на void. Перетворення визначено реалізацією.
Вкажіть% s для генерації послідовності символів із значень, збережених в аргументі C-рядки.
Вкажіть %% для генерації одного символу відсотка (%).
[Конфігурація функцій виведення бібліотеки DLIB]
Можливості виведення в середовищі IAR (що можуть функції printf, sprintf і т. П.) Визначаються настройками бібліотеки DLIB. Доступ до налаштувань здійснюється через властивості проекту IAR: Options. -> General Options -> закладка Library Configuration, що випадає список Library. Налаштування на цій закладці впливає не тільки на printf, але і на інші функції бібліотеки DLIB.
Можливі 4 варіанти на вибір: None, Normal, Full, Custom. Зазвичай вибирають варіант Full.
None в цьому варіанті функції виведення недоступні. Ви не можете використовувати в програмі форматований вивід printf.
Normal для цього варіанту немає підтримки інтерфейсу мовної локалі, не встановлена локаль C, немає підтримки дескрипторів файлу, немає підтримки мультибайтних формату рядка в printf і scanf, не підтримуються шістнадцятиричні числа з плаваючою комою в strtod. Цей варіант працює швидше і займає менше пам'яті, ніж Full, і часто допустимо в нескладних програмах.
Full повна конфігурація runtime бібліотеки C / C ++. Все, що було недоступне в Normal, тепер підтримується.
Custom призначена для користувача конфігурація бібліотеки, яка задається зовнішнім підключається заголовком (C-header, файл з розширенням .h).
Наступна закладка, Library Options, дозволяє налаштувати можливості перетворень для рядка форматування (т. Е. Як будуть оброблятися специфікації перетворень, що починаються знаком%). Можна окремо поставити можливості для printf (функції форматованого виведення) і для scanf (функції форматованого введення).
Tiny найшвидший і урізаний варіант. Немає підтримки a, A, n, float, long long, не можна використовувати прапори.
Small те ж саме, що і Tiny, але можна використовувати прапори формату.
Large немає тільки підтримки a, A, все інше є.
Full доступні всі можливості форматованого перетворення.
format string рядок формату - укладений в подвійні лапки строковий аргумент функції виведення, який містить в собі специфікації перетворення (помічені знаком%, наприклад "% i", "% 02X") інших аргументів.
initial shift state початковий стан зміщення
conversion specifications специфікації перетворення - починаються на знак відсотка (%) закодовані спеціальним чином правила перетворення в текст аргументів функції виведення.
va_list об'єктний тип для надання контекстної інформації, ініціалізований va_start і використовує va_arg для доступу до додаткових неіменованого аргументів. Застосовується в функціях зі змінним числом параметрів типу printf.
va_start макрос, який зберігає початкову контекстну інформацію про об'єкт, який визначається додатком. Ім'я last-par є ім'ям останнього параметра, що задається Вами. Наприклад, last-par буде b для визначення функції int f (int a, int b.).
va_arg макрос, який передає наступний параметр в порядку, визначеному контекстної інформацією, вказаною в додатку. Додаткові аргументи повинні мати об'єктний тип Ty після застосування правил для того, щоб представити параметри в відсутності прототипу функції.