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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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
Сообщений: 165
Сказал спасибо: 36
Сказали Спасибо 55 раз(а) в 24 сообщении(ях)
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, время: 14:47.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot