Почему выходит ошибка: invalid conversion from 'const char*' to 'char' [-fpermissive]??

Почему я получаю эту ошибку?

недопустимое преобразование из 'const char*' в 'char' [-fpermissive]

Вот мой простой набросок:

const char data = "should";

// Я также пробовал:
//const char* data = "should";

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("this " + data + " work");
}

, 👍2

Обсуждение

Нет, это не должно работать таким образом. Вы смешиваете типы данных. char представляет один символ. Таким образом, ваше первое утверждение должно быть недействительным. Вторая попытка выглядит разумной, но вместо этого я бы использовал const char data[]. Теперь ваша конкатенация строк вообще не работает, потому что вы не используете строки С++. Только те предлагают конкатенацию строк с +., @Kwasmich

простой способ в arduino: Serial.print("this" + String(data) + "work");, @dandavis


2 ответа


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

4
const char data = "should";

В этом случае data — это одиночный символ, а не строка. Таким образом, он может хранить 's', но не "должен".

Serial.print("this " + data + " work");

Нет, это никогда не сработает, даже если вы укажете правильные типы данных. Вы не объединяете такие строки. Все, что вы делаете, это пытаетесь добавить адреса двух строковых литералов к адресу строковой константы. Если бы это было возможно (компилятор не позволяет вам), вы получите тарабарщину (или сбой), когда он попытается распечатать все, что находится по этому адресу.

Вместо этого разбейте его на части:

Serial.print("this ");
Serial.print(should);
Serial.print(" work");
,

*Вы получите тарабарщину, когда он попытается распечатать все, что находится по этому адресу.* — нет, вы получите ошибку компиляции. Вы можете вычитать указатели в C++, но не добавлять., @Ruslan

@Ruslan На самом деле, в этом конкретном случае вы получаете ошибку компиляции , потому что операнды различаются между «const char *» для переменной и «const char [6]» для первого литерала. Если вы приводите литералы как const char *, вы можете вычесть один и только один, в противном случае вы получите разные аргументы между результатами одного вычитания (int) и другого строкового литерала. Однако я хочу подчеркнуть, что вы не объединяете строки с помощью +. Является ли синтаксис «правильным» для чего-то совершенно неправильного, это ни здесь, ни там., @Majenko

Вам не нужно приводить: массив будет распадаться на указатель перед любой арифметикой. Но да, второе вычитание действительно вызовет ошибку, потому что попытается вычесть const char* из ptrdiff_t., @Ruslan

Ах да, при вычитании он прекрасно затухает (пока у вас есть только один бит арифметики, иначе вам придется привести результат). При попытке (ошибочно) добавить не портится, а просто жалуется., @Majenko

Не уверен, что вы там говорите... Вас усекли?, @Majenko

Так и думал. Был там, сделал это., @Majenko

Там нет перегрузки оператора., @Majenko


1

Символ может хранить только один символ.

и данные const char* могут хранить указатель на строку.

Вы можете скопировать его с помощью strcpy:

const char* data = malloc(7);
if (data != 0)
{
    strcpy(data, "should");
}

Это создаст 7 байтов, которые могут хранить "следует" (добавление 1 дополнительного байта для байта \0, чтобы обозначить конец строки.

Однако в вашем случае вы можете создать константную строку, например:

const char data[7]="should";

или

const char data[]="should";
,

Нет места, выделенного для строки. :(, @Kwasmich

Добавлена также проверка памяти, @Michel Keijzers

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

@Ruslan отредактировал (на этот раз скомпилировал), @Michel Keijzers