Что вызывает это предупреждение в Arduino IDE?

Я использую модуль DS3231 с библиотека rinkydink, и она работает нормально, однако каждый раз, когда я хочу скомпилировать код, Arduino IDE показывает это предупреждение:

C:\Program Files (x86)\Arduino\libraries\DS3231\DS3231.cpp:291:106:
warning: ISO C++ forbids converting a string constant to 'char*'
[-Wwrite-strings]

Что это за предупреждение и как его устранить?

, 👍1

Обсуждение

Вы передаете строковую константу функции, которая ожидает переменную., @Majenko

Но часто это ошибка автора библиотеки, и этот параметр может (и должен) быть const, потому что к нему нет доступа для записи., @KIIV

почему вы используете эту старую библиотеку?, @Juraj

На первый взгляд, ваш аргумент звучит нормально. Но если посмотреть на гайки и болты, почему используется const, становится немного более очевидным, почему это предупреждение. Когда компилятор встречает константу, он может попытаться поместить это значение в память программы (только для чтения). Ведь ты обещал не менять его. Но передача его как формального значения может быть истолкована как желание создать переменную в вызываемой функции. Таким образом, может возникнуть путаница или несоответствие в том, что делает компилятор, и в том, что вы ожидаете., @st2000

Прежде чем сдаться, попробуйте передать указатель на константу. Дайте мне знать, если это сработает, и я опубликую это как ответ., @st2000

@ st2000, компилятор Uno не помещает константу в прогмему. проблема внутри библиотеки, которую использует OP, поэтому они ничего не делают, чтобы вызвать это предупреждение, @Juraj

@ st2000 я не знаю, как это сделать, извините, я очень новичок в этом ... опубликуйте ответ, и если он сможет решить предупреждение, я сделаю его правильным ответом., @ElectronSurf

Я начал составлять список распространенных ошибок и их пояснения: https://majenko.co.uk/blog/common-arduino-errors-and-warnings., @Majenko


2 ответа


Лучший ответ:

2

Предупреждение было вызвано этой строкой:

char *monthShort[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

В C++ содержимое строки символов, такой как "Jan", не может быть модифицированный. Таким образом, если вы присваиваете строку указателю, указатель должен быть объявлен как const char *:

const char *monthShort[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
                            "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

То же относится и к другим массивам строк: daysLong, daysShort. и monthLong. Как следствие, прототипы методов getDOWStr() и getMonthStr() должны быть изменены, чтобы вернуть постоянный символ *.

Кстати, вы уверены, что эта библиотека все еще поддерживается? Это должно иметь исправлено давно, и кажется, что исходный код последний раз изменялся в 2015. Возможно, вам лучше использовать более современную альтернативу. За Например, в диспетчере библиотек Arduino вы можете найти DS3231 и RTClib от Adafruit.

,

я использую эту библиотеку, потому что я очень новичок в arduino, и все везде предлагали это, и это легко использовать, я попробую новые библиотеки. Спасибо., @ElectronSurf


1

Библиотека DS3231 от Ринки Динка — лучшая из существующих библиотек RTC... Я знаю, я пробовал их ВСЕ. Эта библиотека позволяет печатать строки даты и времени всего с тремя операторами печати Arduino: Serial.print(rtc.getDateStr()); Serial.print(" -- "); Serial.println(rtc.getTimeStr()); Другие библиотеки RTC вынуждают пользователя создавать строки самостоятельно, что приводит к затратам примерно на 12 строк бесполезных команд Serial.print.

,