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

 
 
 
Reply to this topicStart new topic
> sprntf не работает в IAR
SortoVaritu
сообщение Nov 4 2010, 15:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 4-11-10
Пользователь №: 60 647



Использую IAR 5.10
Не работает функция sprintf

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

char L[10]

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

в L записывается какая то ерунда. Причем в дебугере все нормально, а вот после прошивки в железо к сожалению результата нет.
Изучал форумы. Стэки закрутил побольше - все равно ничего не выходит.
В чем может быть проблема?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 4 2010, 17:25
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Если у Вас установлена опция располагать стринги во флеш, то Вам больше подойдёт функция sprintf_P
Go to the top of the page
 
+Quote Post
SortoVaritu
сообщение Nov 4 2010, 20:34
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 4-11-10
Пользователь №: 60 647



Цитата(IgorKossak @ Nov 4 2010, 21:25) *
Если у Вас установлена опция располагать стринги во флеш, то Вам больше подойдёт функция sprintf_P


а что это за опция и где она?
Go to the top of the page
 
+Quote Post
SortoVaritu
сообщение Nov 4 2010, 21:53
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 4-11-10
Пользователь №: 60 647



Цитата(SortoVaritu @ Nov 5 2010, 00:34) *
а что это за опция и где она?

Все... Я уже нашел
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Nov 16 2010, 06:19
Сообщение #5


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

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



Добрый день.
Я сейчас впервые попробовал использовать функцию 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

Подскажите пожалуйста, что я делаю не правильно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 16 2010, 07:55
Сообщение #6


Гуру
******

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



QUOTE (Nikkolaj @ Nov 16 2010, 08:19) *
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.


--------------------
На любой вопрос даю любой ответ
"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
Nikkolaj
сообщение Nov 16 2010, 09:09
Сообщение #7


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

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



QUOTE (Сергей Борщ @ Nov 16 2010, 11:55) *
Забыли #include <stdio.h> Перед этим при компиляции он должен был ругаться что function declared implicitly.

Спасибо за ответ.
Но, #include <stdio.h> был подключен.
Причина в чём то другом, а в чём - не знаю.
На всякий случай подключил библиотеку FullDLIB, опция Lardge.
Увеличил CSTACK, и RSTACK. Но результат такой же.
Подскажите пожалуйста, что не так.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 16 2010, 09:45
Сообщение #8


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



QUOTE (Nikkolaj @ Nov 16 2010, 08:19) *
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. Читайте тему с самого начала.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 16 2010, 09:57
Сообщение #9


Гуру
******

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



QUOTE (IgorKossak @ Nov 16 2010, 11:45) *
Очевидно, что атрибуты типов данных разные. sprintf ожидает указатель на данные, размещённые в ОЗУ, а ему скорее всего передаётся указатель на flash если в настройках проекта установлена опция держать строки во flash. Читайте тему с самого начала.
Тогда бы компилятор ругался на несоответствие параметров. А это ругань линкера на то, что при компиляции был указан один тип параметров, а функция в библиотеке была скомпилирована с другими типами.


--------------------
На любой вопрос даю любой ответ
"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
Nikkolaj
сообщение Nov 16 2010, 10:37
Сообщение #10


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

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



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

В настройках проэкта установлены 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
Правильно ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 16 2010, 12:44
Сообщение #11


Гуру
******

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



QUOTE (Nikkolaj @ Nov 16 2010, 12:37) *
Может эта информация что нибудь подскажет.
Когда первую галочку снял (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
А вы используете свой скрипт линкера или штатный? Давно с ИАРом не работал, подзабыл кое-что. Помню, что у меня эта галочка была недоступна.


--------------------
На любой вопрос даю любой ответ
"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
IgorKossak
сообщение Nov 16 2010, 16:59
Сообщение #12


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



QUOTE (Nikkolaj @ Nov 16 2010, 12:37) *
Fatal Error[e72]: Segment NEAR_C must be defined in a segment definition option (-Z, -b or -P)

Модель памяти какая в настройках задана?
Если tiny, то сегмента NEAR_C в ней не будет.
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Nov 16 2010, 17:56
Сообщение #13


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

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



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

Модель памяти Small.
Скрипт линкера штатный.
Версия IAR 5.50.
Go to the top of the page
 
+Quote Post

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

 


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


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