Очень нужна помощь по 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); }
Ну хотелось бы брать имена переменных из массива pinNameStrings и создавать переменные типа byte с этими именами, затем присваивать им значения.
Нет, это так не работает. Вы не можете создавать переменные внутри откомпилированной программы. C++ не интерпретируемый язык и не рассчитан на работу с управляемым кодом, как Java или C#. Однако, то что вы пытаетесь сделать, можно выразить по-другому. Если хотите хранить базу данных в виде пар "ключ"-"значение", то это можно сделать, но на микроконтроллере очень нехорошо из-за жуткого расхода и без того малой памяти. Для чего вы именно так хотели сделать?
Я думаю char* pinNameStrings[]={"H1","H2","H3","H4"...}; не нужно. Лично я инициализировал так: char* pinNameStrings[21]={0}; Почему? Потому что если просто инициализировать "char* pinNameStrings[21];" в массиве будет "мусор" из чисел. ИМХО, работает по разному, лучше подстраховаться А так честно - недогнал чего вы хотите добиться.
На данный момент я пытаюсь написать программу для 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;
Код (Text): enum {StepR, DirR, StepZ1, ... , KeysCount} keys; byte values[KeysCount]; values[StepR] = 123;
На сколько я понял мы в дигитал Врайт номер разъема пишем? Код (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);
Unixon, спасибо большое! Мне это очень помогло, в том числе и в плане общего освоения языка. Mitrandir, боюсь не очень понял... в #define тоже должны стоять 5 7 8 10?
Вообще то препроцессор это отдельная, доязыковая штука. Он тупо отрабатывает текст, не задумываясь над смыслом выражений. А вот компилятор - наоборот, все "понимает".
так то оно так, но иногда дефайн довольно полезен, предпочитаю константы им объявлять, чтоб память экономить
Часто 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. И читаемость лучше
Хоть и с опозданием, благодарю всех ответивших в теме. Во первых мне это очень помогло, а во вторых просто приятно что не послали RTM. Я бы просто не успел. Спасибо.