Вопрос по директивам компилятроу

Тема в разделе "Arduino & Shields", создана пользователем AlexVS, 1 дек 2014.

  1. AlexVS

    AlexVS Гик

    Можно ли определив в скетче ну скажем тип устройства или модуля, заставить компилятор использовать тот или иной набор инструкций. Например
    Код (Text):
    #define MODULE    Display
    или
    Код (Text):
    #define MODULE    Station
    или
    Код (Text):
    #define MODULE    Sensor
    А в файле RF24_CONFIG пишем нечто такое
    Код (Text):
    .....................................................
    #if defined (Display) || (Station)
                #define SOFTSPI
    ....................................................
    #if defined (Display)
          const uint8_t SOFT_SPI_MISO_PIN = 13;
          const uint8_t SOFT_SPI_MOSI_PIN = 10;
          const uint8_t SOFT_SPI_SCK_PIN = 12;
    ......................................................
    #if defined (Station)
          const uint8_t SOFT_SPI_MISO_PIN = 12;
          const uint8_t SOFT_SPI_MOSI_PIN = 9;
          const uint8_t SOFT_SPI_SCK_PIN = 11;
    ......................................................
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Можно, только написано с ошибками. Посмотрите ардуиновскую библиотеку, например, там такого навалом.
     
  3. geher

    geher Гуру

    AlexVS нравится это.
  4. AlexVS

    AlexVS Гик

    Строки #define Display и #ifdef Display #else #endif должны быть в пределах одного файла?
    Или #define можно указать в .ino - файле, а #ifdef Display #else #endif написать в одной из библиотек?
     
  5. Unixon

    Unixon Оракул Модератор

    Можно в разных, но #define должны идти до #ifdef/#endif, а порядок их следования буквально определяется #include.
     
    AlexVS нравится это.
  6. AlexVS

    AlexVS Гик

    Спасибо, буду пробовать.
    Тут еще возник вопрос по синтаксису: Описываю класс, в h - файле определяю структуру
    Код (Text):
    class Class1 {
      private :
          EthernetClient client;
          boolean tagFlag;
          boolean dataFlag;
          struct ParamA  {int        A; int        B; int        C; };    
      public :
          Class1();
          void Init (EthernetClient& clnt);
          void FillParamA(ParamA& pa);
    };    
    В cpp-файле пишу
    Код (Text):
    void Class1::FillParamA(Class1::ParamA& pa)
    {}
    Далее в основном ino-файле определяю такую же структуру
    и пытаюсь передать ее в метод FillParamA, при компиляции получаю ошибку:
    Код (Text):
     error: no matching function for call to 'Class1::FillParamA(ParamA&)'
     
  7. Unixon

    Unixon Оракул Модератор

    Как метод FillParamA вызываете?
    Должно быть что-то типа
    Код (Text):

    class Class1
    {
      public:
       struct ParamA // { ... }
    };

    Class1 x;
    Class1::ParamA a;
    x.FillParamA(a);
     
     
  8. AlexVS

    AlexVS Гик

    Да, все получилось! А если немного усложнить, мне нужно функцией (методом класса) заполнить массив из структур типа struct ParamA?
    Если просто в коде, то я объявляю и работаю:
    Код (Text):

    ParamA param[4];
    param[i].A=1
     
    А если это убрать в класс, то как объявить и обращаться?
     
    Последнее редактирование: 2 дек 2014
  9. Unixon

    Unixon Оракул Модератор

    На такой случай лучше воспользоваться typedef для объявления нового типа.
     
  10. AlexVS

    AlexVS Гик

    Т.е. массив структур объявить как новый тип?
    Хотя бы коротенький пример, плиз......
     
  11. AlexVS

    AlexVS Гик

    С передачей массива структур в метод класса не получается.
    В h-файле определил структуру
    Код (Text):
    typedef struct{int A,int B,int C} _myStruct;
    В секции Public пишу
    Код (Text):
    typedef _myStruct myStruct[4];
    void Fill(myStruct *s);
    При компиляции ошибка
    Код (Text):
    class1.cpp:155: error: request for member 'A' in '*(s + ((unsigned int)(((unsigned int)((Class1*)this)->Class1::i) * 112u)))', which is of non-class type '_myStruct;[4]'
     
     
  12. Unixon

    Unixon Оракул Модератор

    Покажите весь код, так совершенно не понятно, что у вас с чем не совпадает.
     
  13. AlexVS

    AlexVS Гик

    Test_Obj.ino
    Код (Text):
    #include "class.h"
    CLASS1 cls;
    CLASS1::DataA a;
    CLASS1::DataB b;


    void setup(void)
    {
        Serial.begin(115200);
        Serial.println("__ START __");
        a.A = 0;
        a.B = 0;
        a.C = 0;
        cls.FillDataA(a);
       
        for (int i=1;i<4;i++)
        {
            b[i].X=10;
            b[i].Y=20;
            b[i].Z=30;
        }
        cls.FillDataB(b);
       
        PrintData();
    }


    void PrintData()
    {
        Serial.println(a.A);
        Serial.println(a.B);
        Serial.println(a.C);
        Serial.println("==========================");
       
        for (int i=1;i<4;i++)
        {
            Serial.println(b[i].X);
            Serial.println(b[i].Y);
            Serial.println(b[i].Z);
            Serial.println("__________________________");
            Serial.println("==========================");
        }  
    }

    void loop(void)
    {
    }
     
    class.h
    Код (Text):
    #ifndef class_h
    #define class_h
    #include "Arduino.h"

    typedef struct {int X;int Y; int Z;} _DataB;

    class CLASS1 {
        private :
        int iNum;
       
        public :
        CLASS1();
        struct DataA {int A;int B;int C;};
        void FillDataA(DataA& x);
       
        typedef _DataB DataB[4];
        void FillDataB(DataB *x);
        bool fDebug;
       
    };
    #endif
    class.cpp
    Код (Text):
    #include "class.h"

    CLASS1::CLASS1()
    {
        fDebug = false;
    }

    void CLASS1::FillDataA(CLASS1::DataA& x)
    {
        x.A = 5;
        x.B = 10;
        x.C = 15;
    }


    void CLASS1::FillDataB(CLASS1::DataB *x)
    {
        for (iNum=0; iNum<4; iNum++)
        {
            x[iNum].X + =x[iNum].X;
            x[iNum].Y + =x[iNum].Y;
            x[iNum].Z + =x[iNum].Z;
        }  
    }
     
  14. Unixon

    Unixon Оракул Модератор

    Но ошибка же не к этому коду относится! Где 155-я строка, где _myStruct?
    На что компилятор в этом конкретном коде ругается?

    p.s. Почему у вас цикл по i начинается с 1, а не с 0 ?
     
  15. AlexVS

    AlexVS Гик

    может так надо?
    Код (Text):
    void CLASS1::FillDataB(CLASS1::DataB *x)
    {
        for (iNum=0; iNum<4; iNum++)
        {
            x[iNum]->X +=x[iNum]->X;
            x[iNum]->Y +=x[iNum]->Y;
            x[iNum]->Z +=x[iNum]->Z;
        }  
    }
     
  16. Unixon

    Unixon Оракул Модератор

    Зачем, у вас же не массив указателей.
     
  17. AlexVS

    AlexVS Гик

    Ошибки исправил. Цикл с 1, а не с 0 - это очепятка, пример быстренько составлял.
    Странно, если пишу x[iNum]->X +=x[iNum]->X; то компилируется без ошибок, если вместо -> ставлю точку, то выдается ошибка
    Код (Text):
    class.cpp:20: error: request for member 'X' in '*(x + ((unsigned int)(((unsigned int)((CLASS1*)this)->CLASS1::iNum) * 24u)))', which is of non-class type '_DataB [4]'
    class.cpp:20: error: request for member 'X' in '*(x + ((unsigned int)(((unsigned int)((CLASS1*)this)->CLASS1::iNum) * 24u)))', which is of non-class type '_DataB [4]'
    class.cpp:21: error: request for member 'Y' in '*(x + ((unsigned int)(((unsigned int)((CLASS1*)this)->CLASS1::iNum) * 24u)))', which is of non-class type '_DataB [4]'
    class.cpp:21: error: request for member 'Y' in '*(x + ((unsigned int)(((unsigned int)((CLASS1*)this)->CLASS1::iNum) * 24u)))', which is of non-class type '_DataB [4]'
    class.cpp:22: error: request for member 'Z' in '*(x + ((unsigned int)(((unsigned int)((CLASS1*)this)->CLASS1::iNum) * 24u)))', which is of non-class type '_DataB [4]'
    class.cpp:22: error: request for member 'Z' in '*(x + ((unsigned int)(((unsigned int)((CLASS1*)this)->CLASS1::iNum) * 24u)))', which is of non-class type '_DataB [4]'
     
     
  18. AlexVS

    AlexVS Гик

    Исходник в аттаче.
    В общем не пойму, как нужно.:(
     

    Вложения:

    • Test_Obj.zip
      Размер файла:
      1 КБ
      Просмотров:
      199
    Последнее редактирование: 3 дек 2014
  19. Unixon

    Unixon Оракул Модератор

    Нужно вот так писать
    Код (Text):
    (*x)[iNum].X += (*x)[iNum].X;
    иначе у вас согласование типов будет, а обращение состоится не к той области памяти.
    Потому что тип аргумента "x" у вас - это указатель на указатель на последовательность из 4-х элементов _DataB. Т.е. массив это уже указатель, и передаете вы его тоже по указателю, но первый раз нужно указатель просто разыменовать, а второй раз уже обращаться со смещением до нужного элемента.
     
    Последнее редактирование: 3 дек 2014
    AlexVS нравится это.
  20. AlexVS

    AlexVS Гик

    Понял, спасибо.
    Это так называемое разыменование указателя на переменную?