Ошибка: Does not name a type

c++ error

Я создал класс под названием «Предметы», а затем создал предмет под названием «Математика». Я пытаюсь создать класс для занятий по математике, но выдает ошибку: «Математика» не называет тип.

Код класса

class subject {
public:
  char subjectname[];
  char classroom[];

};

Код для занятий и математики

subject math;
math.classroom = "A1";

Как мне установить класс математики на уровень A1?

, 👍2


1 ответ


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

3
class subject {
public:
  char subjectname[];
  char classroom[];

};

При этом создается класс subject, членами которого являются два массива char неопределенного размера. Будет предпринята попытка создать массив размером 0 (см. здесь). Это не то, чего вы хотите. Вы можете, например, заранее статически выделить пространство с максимальным количеством символов, а затем strncpy() создать новую строку внутри буфера.

Это будет выглядеть

class subject {
public:
  char subjectname[32];  //32-байтовый буфер
  char classroom[32];
};

И позже

subject math;
strncpy(math.classroom, "A1", 31); //копируем максимум 31 байт, чтобы не перезаписывать NUL-терминатор
Serial.print("Classroom is: ");
Serial.println(math.classroom)

Или просто используйте класс Arduino String. Например

#include <Arduino.h>
class subject {
public:
  String subjectname;
  String classroom;
};

Тогда ваш первый код использования можно будет использовать без изменений.

Пример

#include <Arduino.h>

class subject {
public:
  String subjectname;
  String classroom;
};

void setup() {
    Serial.begin(115200);

    subject math;
    math.classroom = "A1";

    Serial.print("Classroom is: ");
    Serial.println(math.classroom);
}

void loop() { }
,

Я пытался использовать этот код, но он выдает ошибку: «Математика» не называет тип в строке math.classroom. #include <Arduino.h> предмет класса { публика: Строковое имя субъекта; струнный класс; }; предметная математика; math.classroom = "A1";, @TechnicProblem

@TechnicProblem Я прекрасно могу скомпилировать https://pastebin.com/5hVgtTi7. Это компилируется для вас?, @Maximilian Gerhardt

Спасибо. Не знал, что мне следовало поместить часть кода в void setup(). Теперь это работает., @TechnicProblem

@TechnicProblem Вы можете помещать глобальные переменные за пределы области функций, но не выполнять над ними назначения и операции. Они должны быть в функциях., @Maximilian Gerhardt

+1 за ваш отличный ответ. Кстати, размер компиляции скетча String составляет 3644 байта, а скетча strncpy — 2112 байт. +100 за использование класса в эскизе. Разница в размере компиляции (с использованием эскиза strncpy) по сравнению с тем же эскизом strncpy со всем добавленным кодом ООП составляет 0 байт. Использование класса ничего вам не стоит, но дает много. К сожалению, 3 голоса закрыли этот вопрос, заявив, что он не по теме. Согласно этой странице: https://arduino.stackexchange.com/help/on-topic, «Конкретные вопросы о платах Arduino, коде…» находятся «по теме»., @VE7JRO