Как заставить return вернуть значение в функции?

Grove
Offline
Зарегистрирован: 28.10.2017

Здравствуйте!

Имеется скетч с функцией printDateTime():

#include <Wire.h>

#include <RtcDS3231.h>

RtcDS3231<TwoWire> Rtc(Wire);

void setup () 
{
    Serial.begin(57600);
    Rtc.Begin();

}

void loop () 
{
    RtcDateTime now = Rtc.GetDateTime();
    printDateTime(now);

    delay(5000);
}

#define countof(a) (sizeof(a) / sizeof(a[0]))

void printDateTime(const RtcDateTime& dt)
{
    char datestring[20];

    snprintf_P(datestring, 
            countof(datestring),
            PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
            dt.Month(),
            dt.Day(),
            dt.Year(),
            dt.Hour(),
            dt.Minute(),
            dt.Second() );
    return datestring;
}

Ошибка: return-statement with a value, in function returning 'void' [-fpermissive]

В чем проблема?

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

Спасибо.

Однако после смены void на char, ошибка компиляции стала следующей:

invalid conversion from 'char*' to 'char' [-fpermissive]

Что опять не так :(

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Почитай этюды про память. Здесь, вшапке

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

Grove - у вас опыт, видимо, нулевой? Много обьяснять придется...

Лучше бы вы почитали какую-нить толстую книжку про Си - про символы, символьные массивы, переменные и ссылки на них. Про передачу парметров по значению и по ссылке, область видимости, инициализацию и очистку переменных... это далеко не полный список того, что нужно знать. чтобы правильно передать ваши данные из процедуры в основную программу. Пока вы их передаете в корне неверно.

И не надейтесь получить готовый ответ. Даже если кто-то напишет, как правильно передать время из функции - все равно уже на следующей строчке кода вы опять споткнетесь о что-то другое. И так будет постоянно, если нет базовых знаний.

Динозавр
Offline
Зарегистрирован: 26.10.2017

Вот так как то ) 
 

int lol () {
 return 'lol';
}
void setup() {
 Serial.begin(9600);
 Serial.write(lol);
}

 

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

Динозавр , а вы хоть это компилировали? Или крутые знатоки не нуждаются в проверке своих "знаний." хоть это скорее "незнание".

ПС: Вот вариант скетча для ТС. Но не понятно зачем тогда возвращать если он снаружи.

char datestring[20]="123";
char *func(){
  /*здесь загружаете в datestring*/
  return datestring;
}
void setup() {
  Serial.begin(9600);
  Serial.write(func());
}
void loop() {

}

Но мне понравился этот скеч, но он точно к теме не относится.

char const *msg1 = "yes";
char const *msg2 = "no";

char const *func() {
  static bool stat=0;
  stat =!stat;
  if (stat) return msg1;
  else return msg2;
}
void setup() {
  Serial.begin(9600);

}
void loop() {
  delay(300);
  Serial.println(func());
}

 

5N62V
Offline
Зарегистрирован: 25.02.2016

Grove пишет:

invalid conversion from 'char*' to 'char' [-fpermissive]

Что опять не так :(

Насколько я понял из кода , Вы пытыетесь вернуть из функции локально объявленный массив. Так нельзя делать. 

5N62V
Offline
Зарегистрирован: 25.02.2016

qwone пишет:

ПС: Вот вариант скетча для ТС. Но не понятно зачем тогда возвращать если он снаружи.

 

И действительно, зачем?