массив char внутри структуры - как заполнить?
- Войдите на сайт для отправки комментариев
Чт, 13/09/2012 - 11:56
коллеги, прошу проявить снисхождение к убогому (т.е. ко мне), ибо перерыл весь интернет на тему, а компилятор как ругался, так и продолжает ругаться.
Есть необходимость создания структуры (ну да, да, для EEPROM read-write), чтобы в ней хранились некие ключи. И не могу блин с ними работать! взгляните на это безобразие, пожалуйста:
#include <EEPROM.h> #include "EEPROMAnything.h" typedef struct keys_t { char* keyvalue[2]; char* keyname[8]; unsigned int last_used; unsigned int total_used; }; keys_t keys; void setup() { keys.keyvalue = {{'0xff'}, {'0xff'}}; } void loop() { }
не компилируется! подскажите, пожалуйста, где я ошибся, либо посоветуйте хороший источник для описания работы со структурами в arduino.
заранее премного благодарен,
Алексей.
А зачем Вам массивы ссылок?
По логике, Вам нужны массивы char, а не char*
Уберите звездочки, обьявите их как unsigned char или uint8_t
Массив как {0xff, 0xff} можно задавать только при объявлении, в тексте придется поэлементно.
Кстати, со структурами. Есть еще такая засада (баг ардуины) - нельзя передавать в качестве параметров в функции. Компилятор будет вопить.
Но... если typedef вынести в отдельный .h файл (не .ino) и подключить его - то все заработает. везде. даже в функциях которые в .ino объявлены.
Кстати, со структурами. Есть еще такая засада (баг ардуины) - нельзя передавать в качестве параметров в функции. Компилятор будет вопить.
У меня не получилось (компилятор не вопит):
в вашем случае,если я правильно понял код должен выглядеть так :
вот еще 17-ая строчка глаз мазолит.
я сам больше привык когда
Кстати, со структурами. Есть еще такая засада (баг ардуины) - нельзя передавать в качестве параметров в функции. Компилятор будет вопить.
У меня не получилось (компилятор не вопит):
Пардон. Немного перепутал. Значит со структами какая-то другая проблема был (или в старых версиях).
Но с enum точно есть такая проблема. Проверил
Вопит. Если вынести дефай enum-а в отдельный .h - все хорошо.
P.S. Но передали, в качестве параметра, вы не структуру, а ссылку на структуру. Хотя и структуру таким же макаром получается передавать.
P.S. Но передали, в качестве параметра, вы не структуру, а ссылку на структуру. Хотя и структуру таким же макаром получается передавать.
Ну так ведь:
setupStruct() - ссылка на структуру в качестве параметра (а как еще изменить передаваемый параметр?)
outStruct() - структура в качестве параметра
P.S. Но передали, в качестве параметра, вы не структуру, а ссылку на структуру. Хотя и структуру таким же макаром получается передавать.
Ну так ведь:
outStruct() - структура в качестве параметра
Вы опять правы. А я, опять, не совсем внимателен.
Просто удивился что ваш пример компильнулся. Руками поменял ссылку на структуру в первой функции. Тоже заработало, а во вторую не вгляделся. Просто сильно удивился что "ведь помню же что мучился и пришлось в отдельный файл выносить". Полез в архив искать "проблемный пример", нашел что там был, все-таки enum. Ну и "поспешил поделится с миром" ;)
Часто объявляют параметры подобного типа без ключевого слова struct - и имеют скандальные взаимоотношения с компилятором.
Часто объявляют параметры подобного типа без ключевого слова struct - и имеют скандальные взаимоотношения с компилятором.
Не. Вот такое я точно не могу даже представить. typedef потерять - это могу вообразить. public, по привычке всобачить - это да. А struct потерять?
Ведь сам же процесс мышления идет "хочу объявить структуру...", ну значит struct напишется раньше чем имя придумается.
Но в любом случае спасибо. А то бы так вечно и выносил все в отдельный файлы, даже в простых случаях. Хотя в любом более менее серьезном скетче приходится это делать.
Не из-за struct, так enum. Не enum так порядок объявления функций (да, иногда он не хочет видеть функцию объявленную ниже по коду).
Коллеги, спасибо за помощь. Ваши советы помогли! оказывается, такой способ заполнения массива неприменим в теле программы. А я не знал...
Крайне, бесконечно вам благодарен!!!
компилируется! на саму работоспособность ещё не проверял, но, думаю, всё будет хорошо -- сейчас всё засуну в протеус, посмотрю что получится.
спасибо огромное!!!!!
Ведь сам же процесс мышления идет "хочу объявить структуру...", ну значит struct напишется раньше чем имя придумается.
Я имел в виду несколько иную ситуацию - более отдаленную по времени:
уже после объявления типа бдительность притупляется и при определении функции вместо "struct keys_t" вполне можно объявить параметр типа "keys_t".