|
|
  |
Уменьшить код и освоить СИ, Не хватает памяти программ |
|
|
|
Oct 27 2009, 11:39
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Andrew_k5 @ Oct 27 2009, 13:44)  На меге 16 не хватает памяти для программы, все переменные которые могут принимать дробные значения использую тип float, может есть способ использовать другой тип данных, допустим надо вывести 12,5 , может можно unsigned char каким то образом 125 вывести как 12,5. поищите информацию про Fixed point
|
|
|
|
|
Oct 27 2009, 11:54
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Во-первых, можно все переменные отмасштабировать так, чтобы иметь дело с целыми числами. Во-вторых, можно использовать представление с фиксированной точкой, фактически работа по-прежнему идёт как с целыми числами, просто Вы мысленно представляете себе где находится точка, отделяющая целую часть от дробной и куда она перемещается, например после операции умножения. Даже если работать с 64-разрядными целыми это получается быстрее, чем плавающая арифметика на Меге. В том и другом случае приходится держать "в уме" масштабирующие коэффициенты. А для вывода целая и дробная части выводятся как отдельные целые числа, разделённые точкой (или запятой, по вкусу). Если счёта много то выгоднее масштабировать на степень двойки, если мало счёта, а ввода/вывода в десятичном представлении много, тогда удобнее двоично-десятичное представление (каждые 4 бита хранят число от 0 до 9), или представление по основанию 100, каждый байт хранит числа от 0 до 99.
Кстати, экономии программной памяти всё это не так уж и сильно поможет, плавающая арифметика всё равно делается вызовами подпрограмм. А вот отказ от функции printf(), или хотя бы от той её части, что работает с плавающей точкой, экономит и флэшь и ОЗУ очень хорошо.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Oct 27 2009, 13:09
|
Частый гость
 
Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387

|
Цитата(sergeeff @ Oct 27 2009, 14:51)  А что мешает все делать с целыми числами? Например, вместо 12,5 работать с числом 125 и положение запятой учесть только при выводе. Как это реализовать, вывод на LCD через sprintf. Плаваю в Си очень сильно, подскажите книжечку по Си для атмела в связке с CodeVision.
|
|
|
|
|
Oct 27 2009, 13:22
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Andrew_k5 @ Oct 27 2009, 16:09)  Как это реализовать Вы хотите знать кать вывести целое, имеющее множитель 10, как вещественное используя sprintf ? Например, так: Код unsigned int I; // Умноженное на 10 sprintf(Buffer, "%d,%d", I/10, I%10); или как-то так: Код unsigned int I; // Умноженное на 10 unsigned int Temp; Temp= I/10; sprintf(Buffer, "%d,%d", Temp, I-Temp);
|
|
|
|
|
Oct 27 2009, 14:40
|
Частый гость
 
Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387

|
Цитата(Dog Pawlowa @ Oct 27 2009, 18:22)  printf("%3u,%lu", x/10, x%10); Обязательно попробую, x%10 - это остаток от деления на 10?, а что такое %lu.
|
|
|
|
|
Oct 27 2009, 15:08
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Andrew_k5 @ Oct 27 2009, 17:09)  Как это реализовать, вывод на LCD через sprintf. Плаваю в Си очень сильно, подскажите книжечку по Си для атмела в связке с CodeVision. Рекомендую не пользоваться функциями типа sprintf, printf и тд тк у вас и так не хватает ресурсов, а эти функции очень прожорливые  Напишите свою реализацию под вашу задачу - выйдет гораздо лучше
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|