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

Насчет sprintf() и printf() в IAR.

 

Эти функции кроме требования большого стека еще и все инициализированные строки хранит в ОЗУ, в IAR так сделано. И при большом кол-ве строк, ОЗУ очень быстро кончается. В IAR желательно пользовать printf_P(). Строки будут храниться во флэше.

 

ps. ну а если все глючит, то это конечно же не программист, а AVR виноват :-)

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


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

ps. ну а если все глючит, то это конечно же не программист, а AVR виноват :-)

А вот и неправда! Еще компилятор! :laugh:

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


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

Может ошибаюсь, но вроде для printf_P() надо не забыть putchar() прописать (для IAR).

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


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

2 rezident -я неочень большой знаток С,но мне казалось,что NULL-это некое абстрактное число,не равное ничему.А строка в С заканчивается обычным нулем.

 

Как правило:

 

#define NULL ((void *)0)

 

И к ASCII коду отношения особого не имеет, а обозначает указатель, "не указывающий ни на что". А то что в символах - называется нулевым символом, и равно совершенно обычному нулю, хотя может быть записано и по модному, типа такого: '\0' или '\x00'. Но '\0' == 0 всегда.

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


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

Я написал простинькую програмку ,камень оказался целым , программатор значит тоже.

Похоже действительно sprintf виновата , я думал что библиотечные функции рабочии

и на них можно расчитывать а тут ...

Как лучше описать подобную функцию я раньше к примеру делал так

в числе 0x34 , обнулял 3 и делал сравнение на четверку ,

затем делал битовый сдвиг вправо ни четыре позиции ,и опять сравнение.

А какой механизм можно сделать попрощще?

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


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

Похоже действительно sprintf виновата , я думал что библиотечные функции рабочии

и на них можно расчитывать а тут ...

 

Функция sprintf рабочая.

 

Для общего развития попробуйте поргнать через симулятор програмку и обьяснить результат.

 

#include <stdio.h>

signed char dat0 = 0xFF;
unsigned char dat1 = 0xFF;

char buffer0[10],buffer1[10];

int main(void) 
{
    sprintf(buffer0,"%02x",dat0);
    sprintf(buffer1,"%02x",dat1);

    for (;;);
}

 

Анатолий.

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


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

А просто книжку почитать по Си-вам такая мысль никогда в голову не приходила?

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


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

А просто книжку почитать по Си-вам такая мысль никогда в голову не приходила?

А Вам не приходило в голову, что тыкать человека носом в книжку не вполне прилично или Вас кто-то преподавателем назначил (с предупреждениями то)?

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


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

2 rezident -я неочень большой знаток С,но мне казалось,что NULL-это некое абстрактное число,не равное ничему.А строка в С заканчивается обычным нулем.

В Си NULL определен как ((void*)0) и используется как значение указателя, который никуда не указывает. Т.е. это не интегральная константа, а указатель.

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


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

В Си NULL определен как ((void*)0) и используется как значение указателя, который никуда не указывает. Т.е. это не интегральная константа, а указатель.

А вот так NULL определен в библиотеке stdio.h от EWAVR

 

#ifndef NULL

#define NULL (0)

#endif

 

это как расценить?

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


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

Я считаю неприличным не сделав ни малейшей попытки что-либо "асилить" самостоятельно выходить

на форум с вопросами,излагаемых в куче литературы.

ИМХО,предупреждение нужно выносить за такой стиль общения-я тут кой-чаво наковырял левой ногой,

почему-то не пашет,памажите кто может.

При этом еще вводя в заблуждение,заявляя,что на симуляторе это работает-чего не может быть.

Впрочем,модератор вы и решать вам.

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


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

Я считаю неприличным не сделав ни малейшей попытки что-либо "асилить" самостоятельно выходить

на форум с вопросами,излагаемых в куче литературы.

Ваше предыдущее сообщение

А просто книжку почитать по Си-вам такая мысль никогда в голову не приходила?

формулируется гораздо короче - RTFM! ;) Поэтому без указания раздела FM это выглядит неубедительно :) C другой стороны я был бы сильно удивлен, если бы за мое сообщение со ссылкой на K&R мне вынесли бы предупреждение. :blink:

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


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

А вот так NULL определен в библиотеке stdio.h от EWAVR

 

#ifndef NULL

#define NULL (0)

#endif

 

это как расценить?

Наверное, как самодеятельность (если там не применен какой-нить хитрый финт ушами).

 

ISO/IEC 9899:1999 (E)

 

7.17 Commonde?nitions<stddef.h>

...

 

3 The macros are

NULL

which expands to an implementation-defined null pointer constant; ...

 

Для чего им в stdio потребовалось этот макрос переоределлять к нулю, не понятно. Был бы это С++, было бы понятно, но в С... Не знаю.

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


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

Ув. WHALE выяснять отношения иди на другой форум твои замечания не по теме.

Дело в том что функция sprintf переводит любое шестнадцатеричное

число в массив в виде кода( это удобно для жк индикации для отображения переменных

в десятичном представлении ).

Из-за этого я ее и использовал , как сделать что-то подобное я не знаю,

Подскажите кто силен ,хотя-бы дайте наброски !

Я не прошу за меня делать всю работу мне нужен хотя-бы примерный алгоритм.

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


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

...Из-за этого я ее и использовал , как сделать что-то подобное я не знаю,

Подскажите кто силен ,хотя-бы дайте наброски !

Я не прошу за меня делать всю работу мне нужен хотя-бы примерный алгоритм.

Вам же уже указали - нужно увеличить размер буфера для sprintf.

Пробовали?

 

вариант второй - табличное преобразование

 

char tab[16]={'0', ..'9','A'..'F'};

char byte_to_display;

 

//вывод

display(tab[byte_to_display>>4]);

display(tab[byte_to_display&0x0f]);

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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