Подскажите по коду

Тема в разделе "Arduino & Shields", создана пользователем fogary, 19 авг 2022.

  1. fogary

    fogary Гик

    Компилятор ругается (warning) на функцию из старой библиотеки.
    В исходном виде примерно так (несущественную часть опустил):
    Код (C++):
    char* anyFunction()
    {
        char buffer[255];
        . . .
        return buffer;
    }
    Ругается так:
    Попробовал три варианта исправления (все рабочие, без ругани):
    Код (C++):
    char* anyFunction()
    {
    //
    // Вариант 1:
    //    static char buffer[255];
    //
    // Вариант 2:
    //    char *buffer = new char[255];
    //
    // Вариант 3:
    //    char buff[255];
    //    char *buffer = buff;
    //
        . . .
        return buffer;
    }
    Какой из этих вариантов лучше, в плане предотвращения утечки памяти?
     
  2. b707

    b707 Гуру

    сколько-нибудь рабочий только первый, остальные дрянь
     
  3. fogary

    fogary Гик

    Ок, а как надо?
     
  4. parovoZZ

    parovoZZ Гуру

    а что вызывает anyfunction? Может buffer в ней и умирает тогда и фиг с ним с этим варнингом.
     
  5. fogary

    fogary Гик

    Функция преводит DateTime в строку по шаблону.
    Код (C++):
    char* DS3231::dateFormat(const char* dateFormat, RTCAlarmTime dt)
    {
        char buffer[255];

        buffer[0] = 0;

        char helper[11];

        while (*dateFormat != '\0')
        {
            switch (dateFormat[0])
            {
                // Day decoder
                case 'd':
                    sprintf(helper, "%02d", dt.day);
                    strcat(buffer, (const char *)helper);
                    break;
                case 'j':
                    sprintf(helper, "%d", dt.day);
                    strcat(buffer, (const char *)helper);
                    break;
                case 'l':
                    strcat(buffer, (const char *)strDayOfWeek(dt.day));
                    break;
                case 'D':
                    strncat(buffer, strDayOfWeek(dt.day), 3);
                    break;
                case 'N':
                    sprintf(helper, "%d", dt.day);
                    strcat(buffer, (const char *)helper);
                    break;
                case 'w':
                    sprintf(helper, "%d", (dt.day + 7) % 7);
                    strcat(buffer, (const char *)helper);
                    break;
                case 'S':
                    strcat(buffer, (const char *)strDaySufix(dt.day));
                    break;

                // Hour decoder
                case 'H':
                    sprintf(helper, "%02d", dt.hour);
                    strcat(buffer, (const char *)helper);
                    break;
                case 'G':
                    sprintf(helper, "%d", dt.hour);
                    strcat(buffer, (const char *)helper);
                    break;
                case 'h':
                    sprintf(helper, "%02d", hour12(dt.hour));
                    strcat(buffer, (const char *)helper);
                    break;
                case 'g':
                    sprintf(helper, "%d", hour12(dt.hour));
                    strcat(buffer, (const char *)helper);
                    break;
                case 'A':
                    strcat(buffer, (const char *)strAmPm(dt.hour, true));
                    break;
                case 'a':
                    strcat(buffer, (const char *)strAmPm(dt.hour, false));
                    break;

                // Minute decoder
                case 'i':
                    sprintf(helper, "%02d", dt.minute);
                    strcat(buffer, (const char *)helper);
                    break;

                // Second decoder
                case 's':
                    sprintf(helper, "%02d", dt.second);
                    strcat(buffer, (const char *)helper);
                    break;

                default:
                    strncat(buffer, dateFormat, 1);
                    break;
            }
            dateFormat++;
        }

        return buffer;
    }
     
  6. b707

    b707 Гуру

    например создать буфер в основной программе до вызова функции и функции передать указатель на буфер
     
  7. DetSimen

    DetSimen Гуру

  8. fogary

    fogary Гик

    b707
    Понял, принял.

    DetSimen

    К сожалению, в библиотеки определена своя структура RTCDateTime. Он не подойдет для предложенной функции (разное кол-во полей и их размерность).

    Всем, спасибо! Вопрос исчерпан.
     
  9. DetSimen

    DetSimen Гуру

    любая нормальная библиотека умеет переводить свой формат времени в стандартный, описанный в time.h Если твоя биб-ка этого не умеет, брось каку, найди нормальную.
     
    Asper Daffy нравится это.
  10. fogary

    fogary Гик

    Светодиодом "ON" управлять нельзя, он просто светится при наличии питания. Управлять можно светодиодом "L", он подключен к 13 пину. Можите сами посмотреть схему платы, их полно в сети.
     
  11. parovoZZ

    parovoZZ Гуру

    слишком много просишь от простого детского конструктора.