Arduino static class

Arduino.ru

Использование static в классе

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

Прочитал что в С/С++ можно использовать одну переменную на все объекты полученные от одного класса.

static int count = 0;

По сути проблема в том, что мне не хватает ОЗУ при создании множества объектов и некоторые переменные я хочу «объединить». Например

Вобще доступно ли такое на Ардуино? Может я не правильно прописываю?

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

А выделить память под статическую переменную не пробовал?

DateTime ClassTimeInterval:: timeNow;

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

Думаю, что проблема в том, о чём написал коллега Andy, но на всякий случай спрошу: «А что значит «не работает»»? В чём это выражается?

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

В ардуине static работает по полной, как повелевает стандарт и воплощает GCC. Никакой специфики. Давайте полній код и вывод ошибки — чего подскажем.

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

В ардуине static работает по полной, как повелевает стандарт и воплощает GCC. Никакой специфики. Давайте полній код и вывод ошибки — чего подскажем.

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

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

Может я не понял, но DateTime timeNow; у меня не константа, она постоянно получает значение текущего времени.

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

Вот ошибка, количество ошибок по количеству созданых объектов:

Источник

Arduino Etcetera

Search This Blog

Static Functions

  • Get link
  • Facebook
  • Twitter
  • Pinterest
  • Email
  • Other Apps

I wanted to have a ‘static function’. What’s that, you say? Well in my limited experience it’s this. In object oriented programming (OOP) in general you encapsulate all your code for a particular purpose into a class. I’m building an Arduino setup with a GPS receiver attached, so I have a class called «GPS». The GPS class gives you all the functionality you need to use a hardware GPS in any project. In Arduino speak it’s a library and including this library in your sketch gets you GPS functionality. Right, so what’s the ‘static function’ bit?
As I have created my GPS library, I’m now trying to interpret the data I get back from the GPS device. Since the time it supplies is UTC (Universal Time Coordinated) I need to adjust the time for my time zone. But when I get «05» (a text string) as the hours component of the time, how do I add 10 to that? I need to parse the text and return a number, in this case 5. So my idea is to build an Integer class. I can then call Integer::parse(«05») to return the integer 5. The important thing here is that no object is created. There’s no Integer object (called Hours or whatever) created and so no memory is consumed. The Integer class simply provides access to a set of functions, of which parse is one; nothing is ever instantiated.

So the answer ends up being the static keyword.

Let’s look at some code. For development I just created a function to find the length of a string. Here’s the main sketch (.pde file)

void setup()
<
Serial.begin(9600);
>

void loop()
<
char stuff[] = «0123456789»;
CMString::debug(stuff);
Serial.println(CMString::length(stuff));
Serial.println(CMString::length(stuff));

And here’s the CMString class, header file first CMString.h:

#ifndef CMString_h
#define CMString_h

class CMString
<
public:
static int length(char *);
static void debug(char *);
>;

. and finally the .cpp file CMString.cpp

#include «WProgram.h»
#include «CMString.h»

int CMString::length(char *in)
<
int i = 0;
char *iter;
iter = in;
while(*(iter++) != ‘\0’) i++;
return i;
>

Источник

Arduino.ru

Использование static в классе

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

Это сколько же «всяких переменных» надо объявить, чтобы израсходовать более полутора килобайт памяти.

Могу предположить, что Ваши переменные, которые забивают память, — это текстовые константы. Если так, их можно оставить в PROGMEM, не копируя в оперативную память.

Sketch uses 59 462 bytes (23%) of program storage space. Maximum is 253 952 bytes.
Global variables use 3 120 bytes (38%) of dynamic memory, leaving 5 072 bytes for local variables. Maximum is 8 192 bytes.
)))

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

ДА это как минимум МЕГА 2560, но принципиально в данном случае нужно в нано уместится :)

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

с появлением PROGMEM в моей программе начались какие то глупости:

Привожу куски кода:

на выходе получаю:

Welcome()
i — 4
_valueVoltageButton — 859
voltageIntervals[i] — 65
value — 4
pressedButton — 0
i — 4
_valueVoltageButton — 844
voltageIntervals[i] — 65
pressedButton — 0
i — 4
_valueVoltageButton — 844
voltageIntervals[i] — 65
pressedButton — 0
i — 4
_valueVoltageButton — 845
voltageIntervals[i] — 65
pressedButton — 5

Откуда voltageIntervals[i] — 65 .

Убираю PROGMEM из строки (int voltageIntervals[6] = <950, 870, 815, 780, 680, 350>;) :

i — 2
_valueVoltageButton — 858
voltageIntervals[i] — 815
pressedButton — 0
i — 2
_valueVoltageButton — 858
voltageIntervals[i] — 815
pressedButton — 0
i — 2
_valueVoltageButton — 859
voltageIntervals[i] — 815
pressedButton — 3

По ходу появляются ошибки в ОЗУ, в чём проблема?

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

kisoft, вы попонтоваться или посоветовать что то полезное?

Цитирую своё сообщение:

» int timeLightTimer[4][2][2][2] = <>; // удалить позже

это звучит гордо!

Наверное я убогий, никогда такие массивы не были нужны. 4 уровня — это круто!

Удалить позже статчиеский массив это «прикольно|.»

Я удивился 4 уровневому массиву. В чем тут понты?

Я удивился комментарию «удалить позже». В чем тут понты? Научите, как можно удалить статический массив? Буду очень благодарен.

Не нравится? Ок, запишу в черный список, постараюсь больше не беспокоить.

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

Научите, как можно удалить статический массив? Буду очень благодарен.

я тебя научу — выделяешь в текстовом редакторе строку массива и нажимаешь клавишу «Delete».

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

Научите, как можно удалить статический массив? Буду очень благодарен.

я тебя научу — выделяешь в текстовом редакторе строку массива и нажимаешь клавишу «Delete».

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

kisoft, ну вы крайне обидчивый :)

Такой массив был для меня удобен в плане обращения к нему

первая строка — цвет света — синий, красный, белый, зелёный

вторая строка — интервал — первый, второй

третья строка -действие — включение, выключение

четвёртая строка — время — часы, минут.

В таком виде массив был для меня более читабелен, чем int timeLightTimer[32] , так я вижу сколько цветов, сколько интервалов времени.

А про удалить, тут полностью прав Клапауций 234, нужно было просто удалить клавишей Delete.

Вместо этого массива я перешёл на класс, и теперь вся эта информация будет у меня хранится в созданных объектах.

Просто библиотеку я уже написал, а вот сам проект на этот класс не перевёл, поэтому в коде есть строки со сторым исполнением.

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

Обидчивый? Возможно. Хотя, честно говоря мне по барабану, нет так нет. Не нужна помощь — не вопрос.

PROGMEM константы нужно считывать, увы, это не АРМ, например, PROGMEM

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

Как то я сразу на заметил «pgm_read_word(data)»;

Подскажите только пожалуйста как мне обращаться к данным этого массива через pgm_read_word(data);

matrixMenu[45][3] это pgm_read_word(matrixMenu+((45-1)*5 + 3)), так?

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

Почему word, массив байтов, читать нужно байты? pgm_read_byte?

И откуда взялся matrix[45][3] — он за пределами массива. Тогда уж matrix[44][3] и вычитать из индекса не нужно.

Можно еще так сделать: pgm_read_byte(&matrix[44][3]); Но это я не проверял, хотя, в принципе должно работать, короче нужно проверять.

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

Пытаюсь сэкономить память:

в итоге получаю:

error: statement-expressions are not allowed outside functions nor in template-argument lists

Получается нельзя использовать константы PROGMEM при объявлении массивов?

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

Вот так тоже не работает:

Так просто нельзя делать или это как то обходится?

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

Получается нельзя использовать константы PROGMEM при объявлении массивов?

Нет, не получается. Константы можно, а вот вызовы функций — нельзя.

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

orcsin, объясните, как именно Вы пытаетесь сэкономить память? И при чем здесь PROGMEM?

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

Вот так тоже не работает:

Так просто нельзя делать или это как то обходится?

Вы, похоже, не понимаете. что делаете, а пытаетесь методом тыка поймать комбинацию при которой хотя бы скомпилируется.

Ну, вот что Вы написали:

Вы понимаете. что означает слово const? Это означает КОНСТАНТА. Ну, а если она конастанта, то нафига ж Вы её менять пытаетесь?

Константы не меняются в процессе работы программы (а если и меняются, то не так и делать этого в порядочной программе не стоит).

Кроме того, Вы знаете, что должно идти после слова case? Константа интегрального типа, а Вы что туда пихаете?

Почитайте книжку по языку (я Вам уже советовал это в посте №9). Без этого Вы так и будете как слепой котёнок тыкаться, авось компилятор схавает. Но он ведь может схавать, но скомпилировать совсем не тот код, которого Вы ожидаете.

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

orcsin, объясните, как именно Вы пытаетесь сэкономить память? И при чем здесь PROGMEM?

В данном случае у меня пролема с ОЗУ. Её осталось мало. Выше мне подсказали PROGMEM, благодаря которой можно часть переменых переместить во флешь память. Ну на сколько я это понял.

Вот и пробую сделать именно это.

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

Выше мне подсказали PROGMEM, благодаря которой можно часть переменых переместить во флешь память.

ну, ок — ты что-то где-то прочитал.

а, как ты собрался менять переменные, которые возможно изменить, переписав флеш?

*так, чисто практический интерес имею — хочу писать флеш из исполняемого кода.

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

Вы, похоже, не понимаете. что делаете, а пытаетесь методом тыка поймать комбинацию при которой хотя бы скомпилируется.

Ну, вот что Вы написали:

Вы понимаете. что означает слово const? Это означает КОНСТАНТА. Ну, а если она конастанта, то нафига ж Вы её менять пытаетесь?

Почитайте книжку по языку (я Вам уже советовал это в посте №9). Без этого Вы так и будете как слепой котёнок тыкаться, авось компилятор схавает. Но он ведь может схавать, но скомпилировать совсем не тот код, которого Вы ожидаете.

1. Да не пытаюсь вроде осозновать то что пишу :)

2. Я вроде не пытаюсь изменить константу, а только вызываю её значение через

Или я что то не понимаю?

Несколько книг я прочёл, много дало, но видимо там не всё есть с чем приходится сталкиваться. Если посоветуете какую то конкретную книгу, буду очень благодарен. Я про классы прочёл несколько книг, и только в 5ой было написано так, что хоть как то стало понятно.

в этих двух строках же вроде один и тот же тип указан, просто один займёт место в ОЗУ, а другой нет. Или я опять что то упустил? На сколько я понял то PROGMEM используется для этого, что бы освободить ОЗУ.

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

Выше мне подсказали PROGMEM, благодаря которой можно часть переменых переместить во флешь память.

ну, ок — ты что-то где-то прочитал.

а, как ты собрался менять переменные, которые возможно изменить, переписав флеш?

*так, чисто практический интерес имею — хочу писать флеш из исполняемого кода.

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

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

2. Я вроде не пытаюсь изменить константу, а только вызываю её значение

Понятия «вызывать значение» нет. Вы пытаетесь присвоеить ей значение, а это и есть поменять её. Она у Вас при описании была 1, а Вы пытаетесь туда что-то другое запихать.

в этих двух строках же вроде один и тот же тип указан, просто один займёт место в ОЗУ, а другой нет. Или я опять что то упустил? На сколько я понял то PROGMEM используется для этого, что бы освободить ОЗУ.

Ни в том ни в другом случае RELAY_TEMPERATURE1 не будет занимать ОЗУ. Но и поменять её нельзя, т.к. костанта. Вот Вы сказали, что она 1 — так она 1 и будет всегда.

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

Здравствуйте, помогите разобраться в следующей ситуации, не много не хватает понимания походу.

Функию printMessage хочу сделать универсальную, что бы ей можно было скармливать любую текстовую константу.

Экономия использования PROGMEM очень заметно, для сообщения «arduino» — экономия ОЗУ — 8 байт.

Источник

Adblock
detector