Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

sprintf и глобальные массивы

Непрочитано 29.01.2011, 19:56  
slawa1980
Прохожий
 
Регистрация: 26.01.2011
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
slawa1980 на пути к лучшему
По умолчанию sprintf и глобальные массивы

Вобщеме есть:
Iar 5.5, LPC1758 uC/OS-II.

Проявляется следующий глюк, при объявлении массива
const сhar *BdrtName[] = {
"1200",
"2400",
....
};

и вызове sprintf(&Str[0], "%.*f%s", 2, 123.45, Гц) - HardFault, а при объявлении массива вот так
const char *const BdrtName[] = {
"1200",
"2400",
....
};
все ок. При чем объявляя и другие массивы как в первом варианте такие же глюки. И еще, перед запуском многозадачности в функции main sprintf(&Str[0], "%.*f%s", 2, 123.45, Гц) работает.

Где копать????
Реклама:
slawa1980 вне форума  
Сказали "Спасибо" slawa1980
warel (27.06.2019)
Непрочитано 29.01.2011, 22:08  
Alecsej
Вид на жительство
 
Регистрация: 10.08.2005
Сообщений: 385
Сказал спасибо: 0
Сказали Спасибо 161 раз(а) в 140 сообщении(ях)
Alecsej на пути к лучшему
По умолчанию Re: sprintf и глобальные массивы

const сhar BdrtName[] = {
"1200",
"2400",
....
};
элементы массива и так считаются указателями
Alecsej вне форума  
Сказали "Спасибо" Alecsej
warel (27.06.2019)
Непрочитано 31.01.2011, 11:44  
slawa1980
Прохожий
 
Регистрация: 26.01.2011
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
slawa1980 на пути к лучшему
По умолчанию Re: sprintf и глобальные массивы

Сообщение от Alecsej Посмотреть сообщение
const сhar BdrtName[] = {
"1200",
"2400",
....
};
элементы массива и так считаются указателями

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

const сhar BdrtName[] = {
"1200"
};

PS. Суть вопроса была в другом...
slawa1980 вне форума  
Сказали "Спасибо" slawa1980
warel (27.06.2019)
Непрочитано 31.01.2011, 12:05  
projects.org.ua
Заблокирован
 
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
projects.org.ua на пути к лучшему
По умолчанию Re: sprintf и глобальные массивы

ну так и объявите его просто массивом, и перебирайте элементы по индексу, че вы мучаетесь?
а еще люди придумали замечательный тип - enum, вот и обратите на него внимание , по ходу он решит вашу проблему.
projects.org.ua вне форума  
Сказали "Спасибо" projects.org.ua
warel (27.06.2019)
Непрочитано 31.01.2011, 12:17  
slawa1980
Прохожий
 
Регистрация: 26.01.2011
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
slawa1980 на пути к лучшему
По умолчанию Re: sprintf и глобальные массивы

Я наверное не правильно задал вопрос.
От того как объявлен массив зависит выполнение функции sprintf, причем связи между этим массивом и функцией sprintf нет. sprintf работал и правильно преобразовывал float в строку, но после того как мне понадобилось объявление массива sprintf перестал работать и процессор попадал в hardfault.
slawa1980 вне форума  
Сказали "Спасибо" slawa1980
warel (27.06.2019)
Непрочитано 31.01.2011, 19:33  
Alecsej
Вид на жительство
 
Регистрация: 10.08.2005
Сообщений: 385
Сказал спасибо: 0
Сказали Спасибо 161 раз(а) в 140 сообщении(ях)
Alecsej на пути к лучшему
По умолчанию Re: sprintf и глобальные массивы

Возможно прокатит так,
const сhar BdrtName[][] = {
"1200",
"2400",
....
};
Иначе enum.
Alecsej вне форума  
Сказали "Спасибо" Alecsej
warel (27.06.2019)
Непрочитано 31.01.2011, 19:36  
akimych
Прописка
 
Регистрация: 02.01.2011
Сообщений: 159
Сказал спасибо: 8
Сказали Спасибо 32 раз(а) в 28 сообщении(ях)
akimych на пути к лучшему
По умолчанию Re: sprintf и глобальные массивы

Надо разобраться из-за чего хардфаулт, под отладчиком глянуть или еще как-то.
Скорее всего программа где-то порит память. Могут иметь место глюки с указателями или какой-то буфер маловат и т.п. В зависимости от наличия тех или иных массивов, данные в памяти сдвигаются и кривой код портит другие данные. Сейчас вот sprintf упал, sprintf заработает, что-то другое может отвалиться. Тут надо не sprintf заставлять работать, а наоборот, при неработающем sprintf искать первопричину.

Цитата:
И еще, перед запуском многозадачности...
Как вариант, используемый sprintf на это не рассчитан.

const char *const BdrtName[]
const сhar *BdrtName[]
как раз и отличаются тем, что первый вариант целиком константа и будет положен в ROM.

Цитата:
сhar BdrtName[] = {"str1", "str2"..}
Так неправильно. Правильно было как раз в самом начале
сhar *BdrtName[] = {"str1", "str2"..}
Мы же объявляем массив строк, т.е указателей.
сhar BdrtName[] - это массив символов, т.е. одна сторка.

Цитата:
и вызове sprintf(&Str[0],
Что такое &Str[0] ?
akimych вне форума  
Сказали "Спасибо" akimych
warel (27.06.2019)
Непрочитано 01.02.2011, 12:22  
slawa1980
Прохожий
 
Регистрация: 26.01.2011
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
slawa1980 на пути к лучшему
По умолчанию Re: sprintf и глобальные массивы

char Str[256] - глобальная массив.
При объявлении массива в глючном варианте сдвигается адрес Str, может еще сильно не копал. Начал исследовать ассемблерный код sprintf, но это долго, пока иду по пути наименьшего сопротивления - полумеры с другим объявлением массива... И сюда написал
slawa1980 вне форума  
Сказали "Спасибо" slawa1980
warel (27.06.2019)
Непрочитано 01.02.2011, 15:43  
sersne
Прописка
 
Регистрация: 09.11.2009
Сообщений: 193
Сказал спасибо: 47
Сказали Спасибо 58 раз(а) в 26 сообщении(ях)
sersne на пути к лучшему
По умолчанию Re: sprintf и глобальные массивы

sprintf(&Str[0], "%.*f%s", 2, 123.45, 'Гц');

и

const сhar *BdrtName[][4] = {
"1200",
"2400",
....
};


я ошибаюсь?
sersne вне форума  
Сказали "Спасибо" sersne
warel (27.06.2019)
Непрочитано 01.02.2011, 16:04  
slawa1980
Прохожий
 
Регистрация: 26.01.2011
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
slawa1980 на пути к лучшему
По умолчанию Re: sprintf и глобальные массивы

Сообщение от sersne Посмотреть сообщение
sprintf(&Str[0], "%.*f%s", 2, 123.45, 'Гц');

и

const сhar *BdrtName[][4] = {
"1200",
"2400",
....
};

1.Правильнее вообще так sprintf(&Str[0], "%.*f%s", 2, 123.45, "Гц");, в 1-м посте просто опечатка.
2. Так тоже можно, но зачем? Такая запись создаст 4 указателя на строки.
3. Суть вопроса не в том, что существует куча способов (половина не работающих или не нужных), а в том, что существует некая невидимая связь в том где находятся указатели на строки - в ОЗУ или ПЗУ и функцией sprintf, выводящей флоты в потоке. Все намного глубже
slawa1980 вне форума  
Сказали "Спасибо" slawa1980
warel (27.06.2019)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CodeVision AVR. Массивы в ассемблерной вставке sanstan Микроконтроллеры, АЦП, память и т.д 4 24.12.2010 12:31


Часовой пояс GMT +4, время: 19:51.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.