Знатоки С++, как избавиться от предупреждения?

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

Народ, прошу помощи!
Есть функция

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]

Полагаю, компилятор недоволен тем, что мы передаём внутреннюю переменную 
во внешнюю среду

Подскажите, как избавиться от предупреждения?

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

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

uint8_t* buffer = new uint8_t[length];

но тогда надо за памятью поглядывать и делетить то что больше не надо.

Ну и вообще в классах можно это все сделать через поля, поместив их в нужную секцию видимости.

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

Penni пишет:

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

uint8_t* buffer = new uint8_t[length];

но тогда надо за памятью поглядывать и делетить то что больше не надо.

Ну и вообще в классах можно это все сделать через поля, поместив их в нужную секцию видимости.

Там идет опрос датчика - где-то раз в секунду.
И время роаботы может быть несколько часов.
То есть датчик будет опрошен много тысяч раз.
Как делетить buffer? Проверять наличие переменной и, если существует, release?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
uint8_t buffer[30];//< это буфер снаружи
/*    функция говорит что надо вернуть указатель uint8_t*    */
uint8_t* HMC5883L::Read(int address, int length) {
  /*здесь мы в буфер пишем*/
  return *buffer;//<-- а здесь возвращаем его указатель
}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Как только использовали буфер (вывели на экран или отправили на сервер) сразу удаляете.

Можно адрес буфера назначения передавать как параметр. Передаете адрес, длину и указатель на буфер куда надо ответ записать. Тогда таких проблем не будет.

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

qwone пишет:

uint8_t buffer[30];//< это буфер снаружи
/*    функция говорит что надо вернуть указатель uint8_t*    */
uint8_t* HMC5883L::Read(int address, int length) {
  /*здесь мы в буфер пишем*/
  return *buffer;//<-- а здесь возвращаем его указатель
}

 

Точная длина буфера неизвестна

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

del

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

И что.Искусственно ограничивайте. А если у вас сообщение будет на пару Гиг. Вы что пришивать эти Гиги к ардуине станете.

  return *buffer;//<-- а здесь возвращаем его указатель   * лишняя Размерность переменной buffer -адресс

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

qwone пишет:

И что.Искусственно ограничивайте. А если у вас сообщение будет на пару Гиг. Вы что пришивать эти Гиги к ардуине станете.

  return *buffer;//<-- а здесь возвращаем его указатель   * лишняя Размерность переменной buffer -адресс

Там опрос датчика HMC5883L

 

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

И еще такой вопрос:
на переменную 
#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

Разве у строковых переменных такое маленькое ограничение длины?

 

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

Это предупреждение и совет компилятора. А так да размер строковых переменных ограничен размерами ОЗУ Ардуины. Везде понемножку и на оперативную работу уже не остается ничего.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Все правильно ругается, Вы пытаетесь в char запихать больше одного символа. Замените ' на " и всё будет хорошо.

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

Penni пишет:

Все правильно ругается, Вы пытаетесь в char запихать больше одного символа. Замените ' на " и всё будет хорошо.

Всё равно ругается

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

У меня не ругается, в одинарных ковычках ругается в двойных нет и не должен.

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

Penni пишет:

У меня не ругается, в одинарных ковычках ругается в двойных нет и не должен.

ПЕрезагрузил IDE и с двойными кавычками - компилятор перестал ругаться

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

To Penni
Спасибо!

sergeclause
sergeclause аватар
Offline
Зарегистрирован: 08.09.2016

To qwone
Cпасибо!