sprintf ожидает аргумент типа char * — но тип-это символ

#command #printf #bluetooth-lowenergy #esp32

Вопрос:

Это код:

 void bleAdvData(char *advData, uint8_t size){

char command[18 size];
uint8_t commandUint[18 size];

sprintf(command, "AT BLEADVDATA="%s"rn", *advData);
 

Предупреждение в строке sprintf:

 Argument %s expects argument of type "char *", but argument 3 has type int
 

Почему?

И что мне нужно сделать: я хочу преобразовать строку(advData) с длиной «размер» в функцию для получения строковой команды, такой как:

 AT BLEADVDATA="advData"rn
 

Комментарии:

1. у вас это как *(*char)

Ответ №1:

Ваша переменная advData определена как char * в списке аргументов. Это указатель на адрес, где хранятся символьные данные. Однако в вашем sprintf() вы используете *advData , т. е. фактическое место , на которое advData указывает, а не сам адрес.

* Сними с sprintf() себя , и все должно быть в порядке.

Ответ №2:

Поясню: char *advData на первой строке делает advData а char * .

Но потом вы добавили звездочку, чтобы advData у вас было * (char *advData) .

Так ты хочешь этого:

  sprintf(command, "AT BLEADVDATA="%s"rn", advData);
 

Эта дополнительная звездочка «разыменовывает» advData , поэтому вы сейчас пытаетесь передать первый символ строки

sprintf затем жалуется, так как это недопустимая строка. Если бы вы запустили это, он либо рухнул бы, либо на ESP32 выдал бы вам тарабарщину.

Я рекомендую использовать опцию Предупреждения как ошибки на ESP32. Очень редко предупреждение не будет иметь смысла, и ESP32 не выходит из строя так же легко, как программа, работающая на современной операционной системе ПК.

Это приводит к тому, что действительно трудно найти ошибки, когда что-то работает случайным образом или выходит из строя без четкой схемы.