warning: address of local variable 's' returned

maks321
Offline
Зарегистрирован: 28.10.2020

история такая, был отработанный проэкт, слетел винт и остался только проэкт,не нашел буилд который был у меня. проблема с фуекцией времени

volatile uint8_t hours; 
volatile uint8_t minute; 
volatile uint8_t second;
заполняются в RTC_now;
 
unsigned char* GetTime(){
RTC_now();
byte s[5];
if (hours < 10) s[1] = (uint8_t)('0'+hours); else {
   s[0] = ('0'+(hours / 10)); s[1] = '0'+(hours % 10);}
if (minute<10) {s[3] = '0'; s[4] = '0'+minute; }else {
  s[3] = '0'+(minute /10); s[4] = '0'+(minute % 10);}
return s;
}
не могу правильно скучковать для вывода суда, в чем ошибка 
void ds_printString4(const char *Str,uint8_t X,uint8_t Y)
rkit
Offline
Зарегистрирован: 23.11.2016

Переменная byte s[5] освободится после выхода из функции и значение может быть потеряно. Если хочешь так, то выделяй буфер в вызывающей функции и передавай его в GetTime как аргумент.

maks321
Offline
Зарегистрирован: 28.10.2020

важно единоразово передать стринг формата 10:24 на дисплей

maks321
Offline
Зарегистрирован: 28.10.2020

а раньше все работало, и выводило, щас какоято лажа, переработал 30% кода, вообще уже желание сдвинуть в с++ стороних компилеров без загрущиков, кстати некоторые компилят этот код без проблем

 

 

maks321
Offline
Зарегистрирован: 28.10.2020

а так работало

char GetTime(){
RTC_now();
char s[5] = {"  :  "};
if (hours < 10) s[1] = ('0'+hours); else {
   s[0] = ('0'+(hours / 10)); s[1] = '0'+(hours % 10);}
if (minute<10) {s[3] = '0'; s[4] = '0'+minute; }else {
  s[3] = '0'+(minute /10); s[4] = '0'+(minute % 10);}
return s;
}
 
MaksVV
Offline
Зарегистрирован: 06.08.2015

для начала переменную s сделать с квалификатором static, чтобы не "протухала". 

maks321
Offline
Зарегистрирован: 28.10.2020

протухает

C:\Users\Maks\Desktop\voda128x32oledI2C\voda128x32oledI2C.ino:334:8: warning: invalid conversion from 'char*' to 'char' [-fpermissive]
 
 return s;
 
        ^
 
C:\Users\Maks\Desktop\voda128x32oledI2C\voda128x32oledI2C.ino: In function 'void loop()':
 
C:\Users\Maks\Desktop\voda128x32oledI2C\voda128x32oledI2C.ino:443:28: warning: invalid conversion from 'char' to 'const char*' [-fpermissive]
 
     ds_printString4(GetTime(),1,3);
код
char GetTime(){
RTC_now();
static char  s[5]= {"  :  "};
if (hours < 10) s[1] = (uint8_t)('0'+hours); else {
   s[0] = ('0'+(hours / 10)); s[1] = '0'+(hours % 10);}
if (minute<10) {s[3] = '0'; s[4] = '0'+minute; }else {
  s[3] = '0'+(minute /10); s[4] = '0'+(minute % 10);}
return s;
}
походу буду изобретать массив или делить при выводе на минуты и часы
 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

maks321 пишет:
вообще уже желание сдвинуть в с++ стороних компилеров без загрущиков, кстати некоторые компилят этот код без проблем
Слова не мальчика, но мужа!

С паровозом с амперки не родственники?

sadman41
Offline
Зарегистрирован: 19.10.2016

Я бы для начала рекомендовал завязывать с фуекциями и сдвинуть к нормальным функциям, в которых реальный возвращаемый тип переменной эквивалентен декларируемому.

maks321
Offline
Зарегистрирован: 28.10.2020

sadman41 пишет:
Я бы для начала рекомендовал завязывать с фуекциями и сдвинуть к нормальным функциям
хорошо сказанно!

зашел через заднее отверстие,код теперь такой

void GetTime(uint8_t X,uint8_t Y){
RTC_now();
if (hours < 10) {ds_printString(" ",X,Y); printNumber(hours,X+6,Y,0);} else  printNumber(hours,X,Y,0);
ds_printString(":",X+12,Y);
if (minute< 10) {printNumber(0,X+17,Y,0); printNumber(minute,X+23,Y,0); }else printNumber(minute,X+17,Y,0);
}
памяти пока хватает,будет нехватать переделаю.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

maks321, Вы бы научились, что ли, код нормально выкладывать.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

maks321, Вы бы научились, что ли, код нормально выкладывать.


Да и программировать надо учиться, а то сначала напишет кривой код, а потом у него компиляторы виноваты

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:
напишет кривой код, а потом у него компиляторы виноваты
Ну, что Вы такое говорите! Главное - использование 

maks321 пишет:
компилеров без загрущиков

которые

maks321 пишет:
компилят этот код без проблем

А эту вашу абдурину оставьте для детского сада и лохов.

Никого не напоминает? (я уже у ТС спрашивал)