Знатоки С++, как избавиться от предупреждения?
- Войдите на сайт для отправки комментариев
Сб, 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?
uint8_t buffer[30];//< это буфер снаружи /* функция говорит что надо вернуть указатель uint8_t* */ uint8_t* HMC5883L::Read(int address, int length) { /*здесь мы в буфер пишем*/ return *buffer;//<-- а здесь возвращаем его указатель }Как только использовали буфер (вывели на экран или отправили на сервер) сразу удаляете.
Можно адрес буфера назначения передавать как параметр. Передаете адрес, длину и указатель на буфер куда надо ответ записать. Тогда таких проблем не будет.
uint8_t buffer[30];//< это буфер снаружи /* функция говорит что надо вернуть указатель uint8_t* */ uint8_t* HMC5883L::Read(int address, int length) { /*здесь мы в буфер пишем*/ return *buffer;//<-- а здесь возвращаем его указатель }Точная длина буфера неизвестна
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пасибо!