Что вызывает это предупреждение в 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]
Что это за предупреждение и как его устранить?
@ElectronSurf, 👍1
Обсуждение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
Библиотека DS3231 от Ринки Динка — лучшая из существующих библиотек RTC... Я знаю, я пробовал их ВСЕ. Эта библиотека позволяет печатать строки даты и времени всего с тремя операторами печати Arduino: Serial.print(rtc.getDateStr()); Serial.print(" -- "); Serial.println(rtc.getTimeStr()); Другие библиотеки RTC вынуждают пользователя создавать строки самостоятельно, что приводит к затратам примерно на 12 строк бесполезных команд Serial.print.
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Глобальные переменные занимают много места в динамической памяти.
- Статус выхода 1 ожидаемое первичное выражение перед ']' Arduino
- Невозможно использовать библиотеку клавиатуры с Arduino UNO даже после смены прошивки.
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Могу ли я запретить библиотеке Stepper удерживать двигатель?
- Датчик освещенности BH1750 всегда дает выходной сигнал 54612 лк
- Arduino IRremote перестает работать
Вы передаете строковую константу функции, которая ожидает переменную., @Majenko
Но часто это ошибка автора библиотеки, и этот параметр может (и должен) быть
const
, потому что к нему нет доступа для записи., @KIIVпочему вы используете эту старую библиотеку?, @Juraj
На первый взгляд, ваш аргумент звучит нормально. Но если посмотреть на гайки и болты, почему используется const, становится немного более очевидным, почему это предупреждение. Когда компилятор встречает константу, он может попытаться поместить это значение в память программы (только для чтения). Ведь ты обещал не менять его. Но передача его как формального значения может быть истолкована как желание создать переменную в вызываемой функции. Таким образом, может возникнуть путаница или несоответствие в том, что делает компилятор, и в том, что вы ожидаете., @st2000
Прежде чем сдаться, попробуйте передать указатель на константу. Дайте мне знать, если это сработает, и я опубликую это как ответ., @st2000
@ st2000, компилятор Uno не помещает константу в прогмему. проблема внутри библиотеки, которую использует OP, поэтому они ничего не делают, чтобы вызвать это предупреждение, @Juraj
@ st2000 я не знаю, как это сделать, извините, я очень новичок в этом ... опубликуйте ответ, и если он сможет решить предупреждение, я сделаю его правильным ответом., @ElectronSurf
Я начал составлять список распространенных ошибок и их пояснения: https://majenko.co.uk/blog/common-arduino-errors-and-warnings., @Majenko