Компилятор матерится на eeprom_read_/eeprom_write_
- Войдите на сайт для отправки комментариев
Здраствуйте. Не нашёл какой-то выделенной темы, где "знатоки" помогают "новичкам", поэтому создал эту. Если был неправ, сорян, не со зла... Итак, вопрос: кто-нибудь может мне сказать почему компилятор на функциях библиотеки <avr/eeprom.h>, выдаёт какую-то неведомую срань? Например, делаю вот так:
#include <avr/eeprom.h>
float value;
void setup()
{
value = eeprom_read_float(1);
}
void loop() { }
получаю вот такое вот паскудство:
E:\Download\radio\arduino-1.8.12\Projects\sketch_may25b\sketch_may25b.ino: In function 'void setup()':
E:\Download\radio\arduino-1.8.12\Projects\sketch_may25b\sketch_may25b.ino:7:30: warning: invalid conversion from 'int' to 'const float*' [-fpermissive]
value = eeprom_read_float(1);
^
In file included from E:\Download\radio\arduino-1.8.12\hardware\arduino\avr\cores\arduino/USBAPI.h:25:0,
from E:\Download\radio\arduino-1.8.12\hardware\arduino\avr\cores\arduino/Arduino.h:234,
from sketch\sketch_may25b.ino.cpp:1:
e:\download\radio\arduino-1.8.12\hardware\tools\avr\avr\include\avr\eeprom.h:152:7: note: initializing argument 1 of 'float eeprom_read_float(const float*)'
float eeprom_read_float (const float *__p) __ATTR_PURE__;
^~~~~~~~~~~~~~~~~
Скетч использует 444 байт (1%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
И такая хрень происходит при любом значении адреса в скобках, кроме нулевого. То есть, если в скобках ноль, или любая константа эквивалентная нулю, то всё компилируется нормально, любое другое значение - и вот такие шпалы. Причём, не зависит от того, какая из функций используется - read/write, с любыми типами данных.
Я уже весь мозг себе расцарапал - не могу понять, что этой падле из под меня надо.
Опять "особо умный" новичок...
Если вы не знаете язык, нафига лезть в системные библиотеки?
если даже прямая подсказка компилятора
float eeprom_read_float (const float *__p)
не наводит вас ни на какие мысли - - берите стандартную ардуиновскую библиотеку EEPROM.h и не выпендривайтесь
Опять "особо умный" новичок...
Если вы не знаете язык, нафига лезть в системные библиотеки?
если даже прямая подсказка компилятора
float eeprom_read_float (const float *__p)
не наводит вас ни на какие мысли - - берите стандартную ардуиновскую библиотеку EEPROM.h и не выпендривайтесь
Если бы "стандартная ардуиновская библиотека" имела функцию, возвращающую значение прочитанное из EEPROM, отличного от byte типа, я бы непременно так и поступил, но к сожалению её туда не завезли, поэтому мне приходится "выпендриваться".
А Вам, если подсказка компилятора кажется совершенно очевидной, надеюсь не будет обременительным объяснить мне "особо умному новичку", каким таким ракообразным образом этот компилятор хочет, чтобы я указал ему адрес?
Я вообще вот отсюда https://alexgyver.ru/lessons/eeprom/ информацию черпнул, а не сам её по "особой умности" выдумал. И в связи с этим нахожусь в совершенном недоумении, почему простой пример из урока выпиливает вот такие вот кренделя.
Если бы "стандартная ардуиновская библиотека" имела функцию, возвращающую значение прочитанное из EEPROM, отличного от byte типа, я бы непременно так и поступил, но к сожалению её туда не завезли, поэтому мне приходится "выпендриваться".
вы будете удивлены. но как раз "стандартная библиотека" умеет читать и писать не только байт, но и лонг. и флоат и даже обьекты и струтуры
читайте про EEPROM.put() get() update()
Кстати, по вашей ссылке у гайвера это все есть.
то что надо указать адрес - знаете, а как указать - нет? может учебник почитать? или гугль?
Так это вы у гайвера спрашивайте. почему его примеры не компилируются. А то наберутся на его сайте всякой хрени, а потом к нам бегут :)
put'ы и get'ы "стандартной библиотеки" не возвращают значение, а присваивают его переменной, заданной в условии вызова функции. Одна переменная - одно значение. Так что, к сожалению, удивить меня Вы не смогли. Мне же надо одной float переменной присвоить результат неких арифметических операций, произведённых над несколькими значениями float типа, прочитанными из EEPROM. И плодить для этого стопицот промежуточных float переменных мне как-то совершенно не хочется.
Я бы и рад был "почитать учебник или гугль", но как раз первая ссылка в поиске Яндекса по запросу arduino avr/eeprom.h приводит меня на ту самую страницу у гайвера, которая вроде бы как раз и позиционирует себя, как "учебник".
Я понимаю, конечно, что вы все тут слишком "крутые кодеры", чтобы, вместо постёбывания, снизойти до помощи всякой там челяди, которая под ногами путается и от великих дел отрывает своими вопросами глупыми, но в общем-то и хрен с ним, я уже и сам как-то разобрался вроде бы, методом тыка...
#include <avr/eeprom.h> #define EEbegin 0 float value; void setup() { value = (eeprom_read_float((float*)EEbegin) + eeprom_read_float((float*)EEbegin+4))/2; } void loop() { }Мне же надо одной float переменной присвоить результат неких арифметических операций, произведённых над несколькими значениями float типа, прочитанными из EEPROM. И плодить для этого стопицот промежуточных float переменных мне как-то совершенно не хочется.
void setup() { value = (eeprom_read_float((float*)EEbegin) + eeprom_read_float((float*)EEbegin+4))/2; }при таких запросах почему бы вам сразу не положить значение value в EEPROM, вместо того чтоб класть две отдельные промежуточные переиенные (которые вам не нужны, как вы пишете) - тогда не придется ничего рассчитывать?
при таких запросах почему бы вам сразу не положить значение value в EEPROM, вместо того чтоб класть две отдельные промежуточные переиенные (которые вам не нужны, как вы пишете) - тогда не придется ничего рассчитывать?
Патамушта... Если бы мне было нужно одно значение, то я бы и хранил одно. А мне нужно два, которые могут изменяться независимо друг от друга по отдельности.
Патамушта... Если бы мне было нужно одно значение, то я бы и хранил одно. А мне нужно два, которые могут изменяться независимо друг от друга по отдельности.
ну сделали и хорошо. Вариантов всегда несколько.
можно было завести одну локальную переменную в setup() и прочитать все что нужно через EEPROM.get() . При выходе из setup() память бы освободилась и на работу основной программы никак не повлияла бы...
707-й , астафЪ иво фпакойе, наXер_он_те_нужЕн??? буй_сним_с_гайвером.
Я вообще вот отсюда https://alexgyver.ru/lessons/eeprom/ информацию черпнул
В таком случае Вы неправильно выбрали форум для решения этой проблемы. Вам надо вот сюда - https://community.alexgyver.ru/
В таком случае Вы неправильно выбрали форум для решения этой проблемы. Вам надо вот сюда - https://community.alexgyver.ru/
Да это похоже парадокс всех подобных местечковых форумов, комьюнити которых преимущественно представляет собой варящийся в собственном соку закрытый клуб, состоящий из узкого круга лиц, совершенно необоснованно считающих себя "элитариями", постигшими вершины познания. И неудивительно, что постороннему человеку, случайно проходившему мимо подобного "элитного клуба" и по простоте душевной решившему спросить дорогу у местных обитателей, проще разобраться во всём самому, нежели дождаться снисхождения от высокомерных местных "мудрецов". Типа: "Да ты не знаешь наш язык! Да как ты вообще посмел ступить на порог нашего храма?! Убирайся прочь, здесь не место таким дремучим болванам!" Или: "На пресс-конференцию к звёздам нужно приходить подготовленными, а не так как Вы - вчера в подворотне, сегодня во втором ряду!" ©
Как-то так...
flexter, объясню Вам на пальцах.
Здесь не любят Гайвера по следующим причинам. Он ориентируется на новичков, типа продвигает ардуино в массы (ведёт блог и канал на ютубе), пишет много скетчей и библиотек, но у него куча ошибок в коде. Новички, насмотревшись Гайвера, пытаются сходу собрать вундервафлю используя его корявый код, а когда у них не получается - бегут на форум ардуино.ру и вопят о помощи, т.к. у них нихрена не работает... Здешним форумчанам это просто надоело. Поэтому при упоминании Гайвера обычно посылают... на его форум.
При этом, сам Гайвер что-то не спешит отвечать и помогать всем страждущим, хотя он "в ответе за тех, кого приручил".
Не работает код Гайвера - пишите ему на форуме. Не отвечает - пишите в ВК, не отвечает - пишите в личку на Ютубе.
Да это похоже парадокс всех подобных местечковых форумов, комьюнити которых преимущественно представляет собой варящийся в собственном соку закрытый клуб, состоящий из узкого круга лиц, совершенно необоснованно считающих себя "элитариями", постигшими вершины познания.
http://lurkmore.to/Чсв
Да это похоже парадокс всех подобных местечковых форумов, комьюнити которых преимущественно представляет собой варящийся в собственном соку закрытый клуб, состоящий из узкого круга лиц....
Всё так! Вот такое мы говно. Вот и не лезьте в чужой клуб со своим уставом.
Я вообще вот отсюда https://alexgyver.ru/lessons/eeprom/ информацию черпнул
В таком случае Вы неправильно выбрали форум для решения этой проблемы. Вам надо вот сюда - https://community.alexgyver.ru/
Мда, соотношение уровня безграмотности с уровнем гонора ... yahoo'ею!
Да я уже понял, что зря в этот курятник сунулся. Отмыться бы теперь от говна и перьев...
Название функции в студию! Ок?
Да hoo'ей сколько хочешь, "грамотный"... https://youtu.be/jbvYDqy2oO0
Да hoo'ей сколько хочешь
Так я это и делаю, но всё равно, спасибо, что разрешил.
Да всегда пожалуйста, обращайся. Ну и поразмысли на досуге наз значением глагола, по аналогии с глаголами "деревенеть", "каменеть", "леденеть" и т.д.
Я почти на 99% уверен, что большинство из тех кто тут щёки надувает не знает почему при value = eeprom_read_float(0) у ТС warning не вылазит. (подозреваю что ЕвгенийП знает, прошу сразу не подсказывать).
Я почти на 99% уверен, что большинство из тех кто тут щёки надувает не знает почему при value = eeprom_read_float(0) у ТС warning не вылазит. (подозреваю что ЕвгенийП знает, прошу сразу не подсказывать).
потому что ноль - особое значение, соответвует пустому указателю