элементы массива типа char* в качестве имён переменных типа byte?

Тема в разделе "Arduino & Shields", создана пользователем GrayCat, 30 апр 2013.

  1. GrayCat

    GrayCat Нуб

    Очень нужна помощь по Wiring. Видимо закипел мозг, но я не в состоянии присвоить элементы массива типа char* в качестве имён переменных типа byte.

    Код (Text):
    / Объявляем и заполняем массив имён переменных для ног контроллера. H1-H12 контакты головки, остальное - моторы.
    char* pinNameStrings[]={"H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12","StepR","DirR","StepZ1","DirZ1","StepZ2","DirZ2","StepY","DirY","StepX","DirX"};
    byte nameKonst = 21; //Константа для сдвига номеров ног  так чтобы последняя была 53.
    void setup()
    {              
    for (int i = 0; i < 22; i++) //Всего 22 контакта, цикл от 0 до 21. По очереди присваиваем номер ноги, назначаем всё как выходы и
                                //всё прижимаем на землю, чтобы соседние моторы не шумели
      {
        byte String pinNameStrings[i] = i + nameKonst;
        pinMode (char* pinNameStrings[i], OUTPUT);
        digitalWrite (char* pinNameStrings[i], LOW);
      Serial.println(pinNameStrings[i]);
      delay(500);
      }
     
  2. Unixon

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

    Что вы пытаетесь сделать? С точки зрения синтаксиса C++ тут написана бессмыслица.
     
  3. GrayCat

    GrayCat Нуб

    Ну хотелось бы брать имена переменных из массива pinNameStrings и создавать переменные типа byte с этими именами, затем присваивать им значения.
     
  4. Unixon

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

    Нет, это так не работает. Вы не можете создавать переменные внутри откомпилированной программы. C++ не интерпретируемый язык и не рассчитан на работу с управляемым кодом, как Java или C#.

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

    Для чего вы именно так хотели сделать?
     
  5. Mitrandir

    Mitrandir Гуру

    а смысл? имя переменной живет только до компиляции
     
  6. HighDigital

    HighDigital Гик

    Я думаю char* pinNameStrings[]={"H1","H2","H3","H4"...}; не нужно.
    Лично я инициализировал так: char* pinNameStrings[21]={0};

    Почему? Потому что если просто инициализировать "char* pinNameStrings[21];" в массиве будет "мусор" из чисел. ИМХО, работает по разному, лучше подстраховаться :)

    А так честно - недогнал чего вы хотите добиться.
     
  7. GrayCat

    GrayCat Нуб

    На данный момент я пытаюсь написать программу для 3d принтера, который нужен как всегда "вчера".
    Запуская присвоение переменным значения порта, затем состояния ног в цикле, хотел сэкономить немного времени при отладке, чтобы менять значения лишь в одном месте и иметь возможность произвольно менять размер массива, но это наверное был прыжок выше головы :). Видимо в моём случае проще прямо записать :
    Код (Text):

    byte StepR = 44;
    byte DirR = 45;
    byte StepZ1 = 46;
    byte DirZ1 = 47;
    byte StepZ2 = 48;
    byte DirZ2 = 49;
    byte StepY = 50;
    byte DirY = 51;
    byte StepX = 52;
    byte DirX = 53;
     
     
  8. Unixon

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

    Код (Text):
    enum {StepR, DirR, StepZ1, ... , KeysCount} keys;
    byte values[KeysCount];
     
    values[StepR] = 123;
     
    Megakoteyka и GrayCat нравится это.
  9. Mitrandir

    Mitrandir Гуру

    На сколько я понял мы в дигитал Врайт номер разъема пишем?
    Код (Text):
    #define PUP 1
    #define PDOWN 2
    #define PLEFT 3
    #define PRIGHT 4
     
    // Для примера ноги отвечающие за 4 направления 5 7 8 10
    char pins[] = {5,7,8,10};
     
    //сдвинуться надево
    digitalWrite(pins[PLEFT],HIGH);
     
     
     
     
     
     
     
  10. HighDigital

    HighDigital Гик

    Номер пина и его состояние (HIGH, LOW)
     
  11. GrayCat

    GrayCat Нуб

    Unixon, спасибо большое! Мне это очень помогло, в том числе и в плане общего освоения языка.
    Mitrandir, боюсь не очень понял... в #define тоже должны стоять 5 7 8 10?
     
  12. Mitrandir

    Mitrandir Гуру

    нет, в массиве pins хранятся номера ног

    дефайны хранят индексы в массиве
     
  13. HighDigital

    HighDigital Гик

    И дефайн очень полезная вещь в С++ ;)
     
    Mitrandir нравится это.
  14. Unixon

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

    Вообще то препроцессор это отдельная, доязыковая штука. Он тупо отрабатывает текст, не задумываясь над смыслом выражений. А вот компилятор - наоборот, все "понимает".
     
  15. Mitrandir

    Mitrandir Гуру

    так то оно так, но иногда дефайн довольно полезен, предпочитаю константы им объявлять, чтоб память экономить
     
  16. HighDigital

    HighDigital Гик

    А так же дефайн - красивый стиль, и главное - удобный.
     
  17. Megakoteyka

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

     
    Mitrandir нравится это.
  18. Mitrandir

    Mitrandir Гуру

    верно, ошибся)
     
  19. roggedhorse

    roggedhorse Гик

    Часто enum удобнее define
    Простой пример:
    Код (Text):
    // двигатели бота (файл drives.h)
    #define LEFT 0
    #define RIGHT 1
    #define JOINT 2
    #define ARM 5
     
    // направление движения (файл movementControls.h)
    #define LEFT 1
    #define RIGHT 2
     
    void move(int drive, int direction);
     
     
    Возникает неоднозначность, поскольку LEFT и RIGHT определены дважды в разных файлах. Кроме того, читаемость такого кода ухудшается.


    В данном случае лучше использовать enum:
    Код (Text):

    enum EDrives {
      LEFT = 0,
      RIGHT = 1,
      JOINT = 2,
      ARM = 5
    };
     
    enum EMovementDirection {
      LEFT = 0,
      RIGHT
    };
     
     
    void move(EDrives drive, EMovementDirection direction);
     
     

    Неоднозначности удалось избежать, поскольку при объявлении параметров функций или переменных мы будем использовать определенные нами типы EDrives и EMovementDirection.
    И читаемость лучше
     
  20. GrayCat

    GrayCat Нуб

    Хоть и с опозданием, благодарю всех ответивших в теме. Во первых мне это очень помогло, а во вторых просто приятно что не послали RTM. Я бы просто не успел. Спасибо.