Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
29.01.2011, 19:56
|
|
Прохожий
Регистрация: 26.01.2011
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
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
|
|
|
29.01.2011, 22:08
|
|
Вид на жительство
Регистрация: 10.08.2005
Сообщений: 385
Сказал спасибо: 0
Сказали Спасибо 161 раз(а) в 140 сообщении(ях)
|
Re: sprintf и глобальные массивы
const сhar BdrtName[] = {
"1200",
"2400",
....
};
элементы массива и так считаются указателями
|
|
|
Сказали "Спасибо" Alecsej
|
|
|
31.01.2011, 11:44
|
|
Прохожий
Регистрация: 26.01.2011
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: sprintf и глобальные массивы
Сообщение от Alecsej
|
const сhar BdrtName[] = {
"1200",
"2400",
....
};
элементы массива и так считаются указателями
|
К сожалению при таком объявлении массива компилятор ругается потому, что он понимает только одну строку как указано ниже.
const сhar BdrtName[] = {
"1200"
};
PS. Суть вопроса была в другом...
|
|
|
Сказали "Спасибо" slawa1980
|
|
|
31.01.2011, 12:05
|
|
Заблокирован
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
|
Re: sprintf и глобальные массивы
ну так и объявите его просто массивом, и перебирайте элементы по индексу, че вы мучаетесь?
а еще люди придумали замечательный тип - enum, вот и обратите на него внимание ![Улыбка](images/smilies/icon_smile.gif) , по ходу он решит вашу проблему.
|
|
|
Сказали "Спасибо" projects.org.ua
|
|
|
31.01.2011, 12:17
|
|
Прохожий
Регистрация: 26.01.2011
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: sprintf и глобальные массивы
Я наверное не правильно задал вопрос.
От того как объявлен массив зависит выполнение функции sprintf, причем связи между этим массивом и функцией sprintf нет. sprintf работал и правильно преобразовывал float в строку, но после того как мне понадобилось объявление массива sprintf перестал работать и процессор попадал в hardfault.
|
|
|
Сказали "Спасибо" slawa1980
|
|
|
31.01.2011, 19:33
|
|
Вид на жительство
Регистрация: 10.08.2005
Сообщений: 385
Сказал спасибо: 0
Сказали Спасибо 161 раз(а) в 140 сообщении(ях)
|
Re: sprintf и глобальные массивы
Возможно прокатит так,
const сhar BdrtName[][] = {
"1200",
"2400",
....
};
Иначе enum.
|
|
|
Сказали "Спасибо" Alecsej
|
|
|
31.01.2011, 19:36
|
|
Прописка
Регистрация: 02.01.2011
Сообщений: 159
Сказал спасибо: 8
Сказали Спасибо 32 раз(а) в 28 сообщении(ях)
|
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
|
|
|
01.02.2011, 12:22
|
|
Прохожий
Регистрация: 26.01.2011
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: sprintf и глобальные массивы
char Str[256] - глобальная массив.
При объявлении массива в глючном варианте сдвигается адрес Str, может еще сильно не копал. Начал исследовать ассемблерный код sprintf, но это долго, пока иду по пути наименьшего сопротивления - полумеры с другим объявлением массива... И сюда написал
|
|
|
Сказали "Спасибо" slawa1980
|
|
|
01.02.2011, 15:43
|
|
Прописка
Регистрация: 09.11.2009
Сообщений: 179
Сказал спасибо: 44
Сказали Спасибо 58 раз(а) в 26 сообщении(ях)
|
Re: sprintf и глобальные массивы
sprintf(&Str[0], "%.*f%s", 2, 123.45, 'Гц');
и
const сhar *BdrtName[][4] = {
"1200",
"2400",
....
};
я ошибаюсь?
|
|
|
|
01.02.2011, 16:04
|
|
Прохожий
Регистрация: 26.01.2011
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
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. Суть вопроса не в том, что существует куча способов (половина не работающих или не нужных ![Улыбка](images/smilies/icon_smile.gif) ), а в том, что существует некая невидимая связь в том где находятся указатели на строки - в ОЗУ или ПЗУ и функцией sprintf, выводящей флоты в потоке. Все намного глубже
|
|
|
Сказали "Спасибо" slawa1980
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:12.
|
|