Как правильно объявлять класс

Thender
Offline
Зарегистрирован: 23.05.2016

Подскажите пожалуйста как правильно объявить класс?

насколько  я понимаю класс не может существовать отдельно от библиотеки,т.е. для того что бы создать класс необходимо создать библиотеку которая состоит как минимум из 2х файлов: описание.h и реализация.cpp.

моя первая попытка создать класс привела к провалу затеи за основу был взят этот пример:

http://arduino.ru/Hacking/LibraryTutorial (класс морзе):

Я попытался на основе этого примера создать класс Motor для управления двигателем.

вот что написал я:

1. Motor.h

#include Arduino.h
#ifndef Motor
#define Motor
class Motor
{
  public: 
    int Direction;
    int Speed;
  void Motor(int PIN1,int PIN2,int _PWMLEVELMIN,int _PWMLEVELMAX);
  void Run(int dir,int speeD);
  void Stop();
  private:
    int PWMLEVELMIN;
    int PWMLEVELMAX;
    int DirPIN;
    int SpeedPIN;
}
#endif

2.Motor.cpp

#include "Motor.h"
void Motor::Motor(int PIN1,int PIN2,int _PWMLEVELMIN,int _PWMLEVELMAX)
{ 
     DirPIN=PIN1;       
     SpeedPIN=PIN2;  
     pinMode(DirPIN, OUTPUT);   
     pinMode(SpeedPIN, OUTPUT);    
     analogWrite(SpeedPIN,0);
}  
void Motor::Run(int dir,int speeD)     
{       
Speed=speeD;Direction=dir;       
digitalWrite(DirPIN,Direction);         
analogWrite(SpeedPIN,abs(255*Direction-Speed));       
}  
void Motor::Stop();     
{       
Speed=0;       
Run(Direction;Speed);       
}

3. Сам скетч:

#include "Motor.h"
Motor M1(4,5,50,200);
Motor M2(4,5,50,200);
void setup()
{
}
void loop()
{
  M1.Run(HIGH,127};
  delay(20);
  M1.Stop;
 }

при компиляции выдаётся мнодество ошибок, почти все они связанны с неправильным объявлением класса и переменных, объясните пожалуйста где я накосячил в объявлениях и как правильно написать этот класс.

 

Thender
Offline
Зарегистрирован: 23.05.2016

ошибки:

In file included from Motor.cpp:1:

/Motor.h:1:10: error: #include expects "FILENAME" or <FILENAME>
In file included from Motor.cpp:1:
Motor.h:9: error: expected unqualified-id before 'int'
Motor.h:9: error: expected `)' before 'int'
Motor.cpp:2: error: expected id-expression before '(' token
Motor.cpp:12: error: explicit qualification in declaration of 'void Run(int, int)'
Motor.cpp: In function 'void Run(int, int)':
Motor.cpp:14: error: 'Speed' was not declared in this scope
Motor.cpp:14: error: 'Direction' was not declared in this scope
Motor.cpp:15: error: 'DirPIN' was not declared in this scope
Motor.cpp:15: error: 'digitalWrite' was not declared in this scope
Motor.cpp:16: error: 'SpeedPIN' was not declared in this scope
Motor.cpp:16: error: 'abs' was not declared in this scope
Motor.cpp:16: error: 'analogWrite' was not declared in this scope
Motor.cpp: At global scope:
Motor.cpp:18: error: explicit qualification in declaration of 'void Stop()'
Motor.cpp:19: error: expected unqualified-id before '{' token
 
yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Пишите только h фаил, если нужно будет cpp потом напишите.
Справа вверху в поиске наберите - Библиоткеа.
А ошибки Ваши переводчику скормите.
В первой ошибке гоаорится о том что имя файла надо или в кавычки заключить или в угловве скобки.
Удачи.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Для начала посмотри внимательно, как правильно пишется #ifndef #define в примере и как у тебя.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

1. есть просто ошибки со скобками точкой-с-запятой и т.п.

2. PIN1 и PIN2 большими буквами - зарезервированы.;

3. #define Motor , а потоми Motor используем как имя класса. То есть сначала определяем его как пустое слово, а потом используем как имя, Мозг есть?

4. #include Arduino.h ?????????

 без уголков и без кавычек? В примере на сайте так, но ведь дураку ясно, что это опечатка. Вы странный? Си не учили никогда?

====================

итого я довел это безобразие до компиляции. Ловите и сравнивайте:

Скетч:

#include <Motor.h>


void setup()
{
}
void loop()
{
Motor M1(4,5,50,200);
Motor M2(4,5,50,200);
  M1.Run(HIGH,127);
  delay(20);
  M1.Stop();
 }

библиотека:

Motor.h

#include <Arduino.h>
#ifndef Motor_h
#define Motor_h
class Motor
{
  public:
  Motor(int pin1,int pin2,int  _PWMLEVELMIN,int  _PWMLEVELMAX);
    int Direction;
    int Speed;
  void Run(int dir,int speeD);
  void Stop();
  private:
    int PWMLEVELMIN;
    int PWMLEVELMAX;
    int DirPIN;
    int SpeedPIN;
};
#endif

и Motor.cpp

#include "Motor.h"
Motor::Motor(int pin1,int pin2,int _PWMLEVELMIN,int _PWMLEVELMAX)
{
     DirPIN=pin1;
     SpeedPIN=pin2;
     pinMode(DirPIN, OUTPUT);
     pinMode(SpeedPIN, OUTPUT);
     analogWrite(SpeedPIN,0);
}
void Motor::Run(int dir,int speeD)
{
Speed=speeD;Direction=dir;
digitalWrite(DirPIN,Direction);
analogWrite(SpeedPIN,abs(255*Direction-Speed));
}
void Motor::Stop()
{
Speed=0;
Run(Direction,Speed);
}

==============================

Теперь эта херня компилируется, что Вы хотите с ней дальше делать - уже не мое дело.

Счастья всем!

----

ЗЫ: Да, млин! Разберитесь уже с разницей уголков и кавычек в инклюде. Это, млин, совсем детская ошибка, ОДИН, ЧОрт возьми, раз прочитать, ...да хоть в гугле!!!!

 

Thender
Offline
Зарегистрирован: 23.05.2016

wdrakula пишет:
3. #define Motor , а потоми Motor используем как имя класса. То есть сначала определяем его как пустое слово, а потом используем как имя

Можно поподробнее?
#define Motor - лишнее?
Си лет 20 назад учил но тогда класы не нужно было запихивать в библиотеку, можно было прямо в тексте программы писать, эта хрень точно компилируется у вас? У меня отказывается.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

То, что представлено, компилируется. Переносите внимательно и найдите свои старые ошибки с ";" и скобками. Если не выйдет - запечатайте Ардуино в коробку и отправьте в китай.... Может денег вернут.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Я еще подумал о том, почему вы можете тупить: а где вы складываете файлы библиотеки? Я догадываюсь.... Просто ответте.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Еще раз про #define Motor: я же привел вам правильный файл. Вы слепой или читать не умеете? Какими шестеренками мозга вы вопрос писали? Не в силах осознать все изменения в коде?

Thender
Offline
Зарегистрирован: 23.05.2016

все файлы находятся в 1 дирректории и .ino и .h и .cpp

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Я так и знал!

Вот откуда вы, такие беретесь, и, что главное, зачем пытаетесь программировать?

У меня растет IQ, скоро 18?

Ведь написано, там же, откуда вы брали пример библиотеки: создаете папку библиотеки в каталоге ./libraries.

В данном случае в папке со скетчами есть подпапка "libraries", в ней заводите папку "Motor", в нее размещаете .h и .cpp файлы.

И, войдя в среду зайдите в "скетч/Подключить библиотеку" и выберите  "Motor".

=====================

в качестве домашенего задания: заствьте компилироваться все это, как у вас сейчас, из одного каталога.

Что надо поменять?

Thender
Offline
Зарегистрирован: 23.05.2016

А вы? Где вас таких набирают вместо того что бы объяснить сидите на форуме и гадите в душу показывает что вы пуп земли, только от того что знаете что то чего не знают другие, да я не знаю и пр шел на форум за советом что бы научиться а не что бы вычитывать ваши нелесные высказывания о моём интеллекте, я никогда не стесняюсь показать что я чего то не знаю лучше спросить и узнать чем стесняться не знать. В любом случае спасибо вам за оказанную помощь в создании класса, этот урок надеюсь будет очень полезен для меня

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Thender пишет:
А вы? Где вас таких набирают вместо того что бы объяснить сидите на форуме и гадите в душу

меня по объявлению на должность гадёныша в душу набирали - что-то не так?

Thender
Offline
Зарегистрирован: 23.05.2016

И да я почитал еще вчера про разницу скобок и кавычек получилось откомпилировать огромное спасибо.
Буду тренироваться создавать классы.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Тем, что вы обратились за помощью, вы, автоматом ставите себя в подчиненное положение и даете мне моральное право изгаляться как угодно, ПОКА ВЫ ЭТО ТЕРПИТЕ.

У вас есть чудесный способ не быть униженным - не терпеть. И не учиться.

Унижение ученика - один из САМЫХ действенных приемов. Правила создания класса вы теперь запомните навсегда.

Обратите внимание на то, что я - единственный, кто стал с вами возиться. Вероятно потому, что уровень "вопроса" был настолько ниже плинтуса, что даже Клапауций не заинтересовался (возможно к вашему счастью, он еще "лучше" меня).

Я то все таки научил, где-то за облаками мне в карму плюсик поставят.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

wdrakula пишет:

даже Клапауций не заинтересовался (возможно к вашему счастью, он еще "лучше" меня).

я скромно прошу не преувеличивать мою квалификацию в написании классов - она ниже среднего, просто я потратил время на вникание в суть своей личной проблемы.

тем более, здесь не класс, а библиотека.

Logik
Offline
Зарегистрирован: 05.08.2014

wdrakula пишет:

Я то все таки научил, где-то за облаками мне в карму плюсик поставят.

Нипаставлю.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Я думаю "за облаками" плюсики ставят совсем другие сущности.