Знатоки С++, как избавиться от предупреждения?
- Войдите на сайт для отправки комментариев
Сб, 17/02/2018 - 17:39
Народ, прошу помощи!
Есть функция
uint8_t* HMC5883L::Read(int address, int length)
{
Wire.beginTransmission(HMC5883L_Address);
Wire.write(address);
Wire.endTransmission();
Wire.beginTransmission(HMC5883L_Address);
Wire.requestFrom(HMC5883L_Address, length);
uint8_t buffer[length];
//unsigned char buffer[length];
if(Wire.available() == length)
{
for(uint8_t i = 0; i < length; i++)
{
buffer[i] = Wire.read();
}
}
Wire.endTransmission();
return buffer;
}
При компиляции выдаёт предупреждение
In member function 'uint8_t* HMC5883L::Read(int, int)':
warning: address of local variable 'buffer' returned [-Wreturn-local-addr]
Полагаю, компилятор недоволен тем, что мы передаём внутреннюю переменную
во внешнюю среду
Подскажите, как избавиться от предупреждения?
Обычно в таких случаях память выделяется динамически, чтобы после ретурна деструктор не уничтожил Ваш массив.
но тогда надо за памятью поглядывать и делетить то что больше не надо.
Ну и вообще в классах можно это все сделать через поля, поместив их в нужную секцию видимости.
Обычно в таких случаях память выделяется динамически, чтобы после ретурна деструктор не уничтожил Ваш массив.
но тогда надо за памятью поглядывать и делетить то что больше не надо.
Ну и вообще в классах можно это все сделать через поля, поместив их в нужную секцию видимости.
Там идет опрос датчика - где-то раз в секунду.
И время роаботы может быть несколько часов.
То есть датчик будет опрошен много тысяч раз.
Как делетить buffer? Проверять наличие переменной и, если существует, release?
Как только использовали буфер (вывели на экран или отправили на сервер) сразу удаляете.
Можно адрес буфера назначения передавать как параметр. Передаете адрес, длину и указатель на буфер куда надо ответ записать. Тогда таких проблем не будет.
Точная длина буфера неизвестна
del
И что.Искусственно ограничивайте. А если у вас сообщение будет на пару Гиг. Вы что пришивать эти Гиги к ардуине станете.
return
*buffer;
//<-- а здесь возвращаем его указатель * лишняя Размерность переменной buffer -адресс
И что.Искусственно ограничивайте. А если у вас сообщение будет на пару Гиг. Вы что пришивать эти Гиги к ардуине станете.
return
*buffer;
//<-- а здесь возвращаем его указатель * лишняя Размерность переменной buffer -адресс
Там опрос датчика HMC5883L
И еще такой вопрос:
на переменную
#define ErrorCode_1 'Entered scale was not valid, valid gauss values are: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1'
пишет
warning: character constant too long for its type
Разве у строковых переменных такое маленькое ограничение длины?
Это предупреждение и совет компилятора. А так да размер строковых переменных ограничен размерами ОЗУ Ардуины. Везде понемножку и на оперативную работу уже не остается ничего.
Все правильно ругается, Вы пытаетесь в char запихать больше одного символа. Замените ' на " и всё будет хорошо.
Все правильно ругается, Вы пытаетесь в char запихать больше одного символа. Замените ' на " и всё будет хорошо.
Всё равно ругается
У меня не ругается, в одинарных ковычках ругается в двойных нет и не должен.
У меня не ругается, в одинарных ковычках ругается в двойных нет и не должен.
ПЕрезагрузил IDE и с двойными кавычками - компилятор перестал ругаться
To Penni
Спасибо!
To qwone
Cпасибо!