Перейти к содержанию
    

sprntf не работает в IAR

Использую IAR 5.10

Не работает функция sprintf

 

при таком коде

 

char L[10]

 

sprintf(L,"СПРИНТФ");

 

в L записывается какая то ерунда. Причем в дебугере все нормально, а вот после прошивки в железо к сожалению результата нет.

Изучал форумы. Стэки закрутил побольше - все равно ничего не выходит.

В чем может быть проблема?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если у Вас установлена опция располагать стринги во флеш, то Вам больше подойдёт функция sprintf_P

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если у Вас установлена опция располагать стринги во флеш, то Вам больше подойдёт функция sprintf_P

 

а что это за опция и где она?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день.

Я сейчас впервые попробовал использовать функцию sprintf ();

Текст самый простой:

 

char L[10];

sprintf (L, "787878");

 

При компиляции IAR выдаёт:

 

Warning[w6]: Type conflict for external/entry "sprintf", in module main against external/entry in module ?sprintf; types have different type attributes

 

Подскажите пожалуйста, что я делаю не правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Warning[w6]: Type conflict for external/entry "sprintf", in module main against external/entry in module ?sprintf; types have different type attributes
Забыли #include <stdio.h> Перед этим при компиляции он должен был ругаться что function declared implicitly.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забыли #include <stdio.h> Перед этим при компиляции он должен был ругаться что function declared implicitly.

Спасибо за ответ.

Но, #include <stdio.h> был подключен.

Причина в чём то другом, а в чём - не знаю.

На всякий случай подключил библиотеку FullDLIB, опция Lardge.

Увеличил CSTACK, и RSTACK. Но результат такой же.

Подскажите пожалуйста, что не так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Warning[w6]: Type conflict for external/entry "sprintf", in module main against external/entry in module ?sprintf; types have different type attributes

Очевидно, что атрибуты типов данных разные. sprintf ожидает указатель на данные, размещённые в ОЗУ, а ему скорее всего передаётся указатель на flash если в настройках проекта установлена опция держать строки во flash. Читайте тему с самого начала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очевидно, что атрибуты типов данных разные. sprintf ожидает указатель на данные, размещённые в ОЗУ, а ему скорее всего передаётся указатель на flash если в настройках проекта установлена опция держать строки во flash. Читайте тему с самого начала.
Тогда бы компилятор ругался на несоответствие параметров. А это ругань линкера на то, что при компиляции был указан один тип параметров, а функция в библиотеке была скомпилирована с другими типами.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы.

 

В настройках проэкта установлены 2 галочки:

1. Place string literals constants in initialized RAM.

2. Place aggregate initializers in flash memory.

 

Спасибо за ответы.

 

Сергей, Вы правы, ругается действительно линкер.

 

Может эта информация что нибудь подскажет.

Когда первую галочку снял (1. Place string literals constants in initialized RAM.),

то ликер выдал Error:

Fatal Error[e72]: Segment NEAR_C must be defined in a segment definition option (-Z, -b or -P)

Error while running Linker

 

 

Да, галочки находятся в Project \ Options \ C/C++ Compiler \ Code

Правильно ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может эта информация что нибудь подскажет.

Когда первую галочку снял (1. Place string literals constants in initialized RAM.),

то ликер выдал Error:

Fatal Error[e72]: Segment NEAR_C must be defined in a segment definition option (-Z, -b or -P)

Error while running Linker

А вы используете свой скрипт линкера или штатный? Давно с ИАРом не работал, подзабыл кое-что. Помню, что у меня эта галочка была недоступна.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Fatal Error[e72]: Segment NEAR_C must be defined in a segment definition option (-Z, -b or -P)

Модель памяти какая в настройках задана?

Если tiny, то сегмента NEAR_C в ней не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...