Этюды для начинающих: Память 1. Что и как не надо делать

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

brokly пишет:
Кстати, я почему то не нашел объяснения для чего нужны константы. Коллизия, объявлена как константа а храниться в ОЗУ. Хотя можем принудительно пихнуть ее во флешь, но тогда работать с ней придется с подвывертом (понимая, что это и почему).
Прежде всего const это спецификатор. И он сообщает что данная величина используется только для чтения. А уже потом компилятор решает как компактно и эфеективно ее разместить. Из этого не следует что const это обязательно константа.  Так же #define не делает что-то константой .  И вот еще мой вариант который мне больше нравится 

Cl_AAA AAA(/*константа*/12);

И это тоже константа, но без всяких const  и #define. Простенько и если надо можно на месте поменять.

const byte pin=/*пин A*/2;
#define pin1  /*пин B*/3

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

если в loop() ничо не вставлять, вызывается он примерно 50 тысяч раз в секунду. 

Да, нет, гораздо больше - 1,136МГц.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

qwone пишет:

brokly пишет:
Кстати, я почему то не нашел объяснения для чего нужны константы. Коллизия, объявлена как константа а храниться в ОЗУ. Хотя можем принудительно пихнуть ее во флешь, но тогда работать с ней придется с подвывертом (понимая, что это и почему).
Прежде всего const это спецификатор. И он сообщает что данная величина используется только для чтения. А уже потом компилятор решает как компактно и эфеективно ее разместить. Из этого не следует что const это обязательно константа.  Так же #define не делает что-то константой .  И вот еще мой вариант который мне больше нравится 

Cl_AAA AAA(/*константа*/12);

И это тоже константа, но без всяких const  и #define. Простенько и если надо можно на месте поменять.

const byte pin=/*пин A*/2;
#define pin1  /*пин B*/3

 

 

Все так спорно... так спорно... Нахрена константу "МЕНЯТЬ НА МЕСТЕ" (!!!) это же константа !!!!!!!

const и правда спецификатор, это не откровение, имхо, ни для кого :)

Компилятор ничего не решает, он разместит ее в озу :) 

И на десерт, понятие константа означает - постоянный, неизменный :)

И кстати... Cl_AAA AAA(/*константа*/12); - что это за бред?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

brokly пишет:
Все так спорно... так спорно... Нахрена константу "МЕНЯТЬ НА МЕСТЕ" (!!!) это же константа !!!!!!!

const и правда спецификатор, это не откровение, имхо, ни для кого :)

Компилятор ничего не решает, он разместит ее в озу :) 

И на десерт, понятие константа означает - постоянный, неизменный :)

И кстати... Cl_AAA AAA(/*константа*/12); - что это за бред?

Что спорно? В языке Си нет инструмента объявления только для образования констант. Или пользоваться макросом, или спецификатором const. Но и то и другое объявляет не только константы.

/**/
void func (const int a) { // <- a должна быть константой
  /*но только внутри функции,а снаружи это переменная*/
  const int b = 5; //<- константа , и распостранена только внутри функции
  /* в отличии от #define - который не возжно огаричить, если его уже объявили */
}
void setup() {
  10; 0x5; B0001;//<- это все 100% константы, а остальное может быть а может нет.:)
  int c = 5; //
  func(c);
  int const * const p = &c;  //Запрет изменять и хранимый в указателе "p" адрес,
}
void loop() {

}
/*Скетч использует 444 байт (1%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
*/

ПС:http://ci-plus-plus-snachala.ru/?p=1120

/**/
class Cl_AAA {
    const int a;
  public:
    Cl_AAA(const int a_): a(a_) {}
};
Cl_AAA AAA(/*константа*/12);//<- чего странного, Вы что не знаете, что константу можно прямо записать числом О_О
void setup() {

}
void loop() {

}
/*Скетч использует 494 байт (1%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 11 байт (0%) динамической памяти, оставляя 2037 байт для локальных переменных. Максимум: 2048 байт.
*/

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

/**/
void func (const int a) { // <- a должна быть константой
  /*но только внутри функции,а снаружи это переменная*/
 

Сами-то поняли что сказали?

а - формальный параметр, снаружи она не существует, а потому никак не может быть ни переменной, ни чем бы то ни было ещё.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

В этом вашем лживом С++ никада нельзя сказать точно, что сегодня с утра означает оператор присваивания. А вы тут про медленно меняющиеся константы.... 

Я, када встретил в одном коде #define FALSE TRUE,  две недели пилъ беспробудно. 

Зато туева хуча человеков стандарты выдумывает, уже Х томов понаписали.  Мне эта ситуация почему-то напоминает поговорку "У семи нянек - дитя без глазу". Только тут икспердов-нянек гораздо больше чем семь, поэтому дитя у них, не успеешь отвернуца, не то что без глазика, а вапще валяется покрошенное в фарш. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

В этом вашем лживом С++ никада нельзя сказать точно, что сегодня с утра означает оператор присваивания. 

Это ещё ничо. Ессть языки, где вся эта хрень может изменяться по ходу выполнения программы.

sirota
Offline
Зарегистрирован: 18.08.2015

qwone пишет:

 

const byte pin=/*пин A*/2;
#define pin1  /*пин B*/3

 

 

и что вы тут поменяли на лету и что такое "/*пин A*/2" и далее

ЕвгенийП пишет:

Это ещё ничо. Ессть языки, где вся эта хрень может изменяться по ходу выполнения программы.

я не спец, но ни одного языка высокого уровня окромя убогово javascript  я не видел возможность изменения предопределенной константы. Есть только в C++ (за C не скажу) и производных возможность снять признак постоянства. Но обычно в жизни считается подобное мерой крайней и не культурной. Хотя сам по себе язык такое позволяет.

А ну и конечно случаи не корректной передачи данных внутрь вызываемых функций (когда передают как сами данные, так и казатель на них, а внутри рабоитают, если грубо, то с обратной стороны).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sirota пишет:

компилятор просто не даст этого

Чего не даст? Константу поменять? А кто его спрашивать-то будет? :)

sirota пишет:

убогово javascript

Фига се! Это про язык с динамическим полиморфизмом и прототипным наследованием? Боюсь, что использованное Вами прилагательное больше отражает уровень Ваших знаий о JavaScript, чем природу языка.

sirota пишет:

я не видел возможность изменения предопределенной константы.

В старом добром Фортране IV это была штатаная фича. Причём менялась константа как таковая (например 5 становилось равным 3 или там 10). И, повторяю, это была не особенность реализации, а штатная фича. В таком виде Фортран существовал десятилетиями. Ушло это только в новых стандартах, причём обычно есть опция "вернуть" для совместимости с миллиардами строк кода, написанных на Фортране.

sirota пишет:

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

Я бы сказал "говнокодом".

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Вообще, изначально в своей реплике я противопоставил #define - const, говоря о том, что такой прием, часто позволяет съэкономить оперативку, а иногда ускориться, и уже как на побочку намекнул на некую нестыковку самого определения константы и возможных с ней операций :) Естественно все это в приложении к ардуино.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

DetSimen пишет:

В этом вашем лживом С++ никада нельзя сказать точно, что сегодня с утра означает оператор присваивания. А вы тут про медленно меняющиеся константы.... 

Я, када встретил в одном коде #define FALSE TRUE,  две недели пилъ беспробудно. 

Зато туева хуча человеков стандарты выдумывает, уже Х томов понаписали.  Мне эта ситуация почему-то напоминает поговорку "У семи нянек - дитя без глазу". Только тут икспердов-нянек гораздо больше чем семь, поэтому дитя у них, не успеешь отвернуца, не то что без глазика, а вапще валяется покрошенное в фарш. 

Мелочи. Уже приводил тут примерчик из реального и не мелкого проекта, что-то типа так:

#if !defined( _MY_CONST_ )
#define if(p) if( (rand()%100>10) && (p) )
#endif

Вот это - точно засада..

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

Вот это - точно засада..

Ну, почему сразу засада. Если по жизни стояла задача: "Если p, то с вероятностью 0,1 выполнить ...", то конструкция как конструкция. Прокомментировать как следует и, когда станет не нужна, выбросить #undef'ом. Хотя, я бы делал это по-другому.

pridecom
Offline
Зарегистрирован: 07.07.2017

Привет. Вопросик.

Есть переменная 

double tm = 0 ;

в цикле loop ей присвоили значение в минутах работы системы

tm = ((millis()/1000)/60);

и выводим на экран.
lcd.print(tm ); 
 
Например 
110000 милисек это 110 сек или 1.83 минуты
Однако выводит почему-то 1.00 минуты, округляет обрезая до нулей гадина
что я делаю не так?
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

pridecom пишет:

что я делаю не так?

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

Целочисленное деление в этом языке производится с отбрасванием остатка, каким бы он ни был. Результат всегда целый. Например, 200/200 и 300/200 и 399/200 - результат один и тот же, а именно - 1.

pmaster
Offline
Зарегистрирован: 23.05.2011

А как узнать размер стека в настоящий момент? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

pmaster пишет:

А как узнать размер стека в настоящий момент? 

Указатель стека называется SP. Он доступен в любой момент. Т.е. запомните его в началеа потом посмотрите в нужной точке и, вычтя одно из другого, узнаете какой стек Вы уже накопили.

В принципе, вот в этой теме, в конце первого поста, есть программа Memory Explorer. Она печатает и стек, и кучу, и свободные куски.