массив char внутри структуры - как заполнить?

lechat
Offline
Зарегистрирован: 13.09.2012

коллеги, прошу проявить снисхождение к убогому (т.е. ко мне), ибо перерыл весь интернет на тему, а компилятор как ругался, так и продолжает ругаться.

 

Есть необходимость создания структуры (ну да, да, для 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.

заранее премного благодарен, 

Алексей.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

А зачем Вам массивы ссылок?

По логике, Вам нужны массивы char, а не char*

Уберите звездочки, обьявите их как unsigned char или uint8_t  

Массив  как {0xff, 0xff} можно задавать только при объявлении, в тексте придется поэлементно. 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Кстати, со структурами. Есть еще такая засада (баг ардуины) - нельзя передавать в качестве параметров в функции. Компилятор будет вопить.

Но... если typedef вынести в отдельный .h файл (не .ino) и подключить его - то все заработает. везде. даже в функциях которые в .ino объявлены.

step962
Offline
Зарегистрирован: 23.05.2011

leshak пишет:

 Кстати, со структурами. Есть еще такая засада (баг ардуины) - нельзя передавать в качестве параметров в функции. Компилятор будет вопить.

У меня не получилось (компилятор не вопит):

typedef struct keys_t {
     char keyvalue[2];
     char keyname[8];
     unsigned int last_used;
     unsigned int total_used;

};

keys_t keys;

void setupStruct(struct keys_t *vs) {
  vs->keyvalue[0] = 0xf1;
  vs->keyvalue[1] = 0xf2;
  vs->keyname[0] = 'T';
  vs->keyname[1] = 'e';
  vs->keyname[2] = 's';
  vs->keyname[3] = 't';
  vs->keyname[4] = 0;
}

void outStruct(struct keys_t vs) {
  Serial.println(vs.keyvalue[0], HEX);
  Serial.println(vs.keyvalue[1], HEX);
  Serial.println(vs.keyname);
}

void setup() {
  setupStruct(&keys);
  Serial.begin(9600);
  outStruct(keys);
}

void loop() {
}

 

mixail844
Offline
Зарегистрирован: 30.04.2012

в вашем случае,если я правильно понял код должен выглядеть так :

01	#include <EEPROM.h>
02	#include "EEPROMAnything.h"
03	 
04	typedef struct keys_t
05	{
06	     char keyvalue[2];//в вашем случае добавление звездочки приводило к созданию массива указателей типа char,то есть указатель на указатель.
07	     char keyname[8];
08	     unsigned int last_used;
09	     unsigned int total_used;
10	 
11	}keys_t;
12	 
13	keys_t keys;
14	 
15	void setup()
16	{
17	keys.value={0xff,0xff}//все же думаю в вашем случае правильнее посылать сам код символа без кавычек,а вот при посылке символа ковычки добавляються ,кпримеру '0' или 'а'
18	}
19	 
20	void loop()
21	{
22	}

 вот еще 17-ая строчка глаз мазолит.

я сам больше привык когда

keys.value[0]=0xff;
keys.value[1]=0xff;

 

leshak
Offline
Зарегистрирован: 29.09.2011

step962 пишет:

leshak пишет:

 Кстати, со структурами. Есть еще такая засада (баг ардуины) - нельзя передавать в качестве параметров в функции. Компилятор будет вопить.

У меня не получилось (компилятор не вопит):

Пардон. Немного перепутал. Значит со структами какая-то другая проблема был (или в старых версиях).

Но с enum точно есть такая проблема. Проверил

enum STATES {
		READY_STATE,
		LOCK_STATE,
		OPEN_STATE
	};

void setState(STATES  newState){

} 

void setup(){
}
void loop(){}

Вопит. Если вынести дефай enum-а в отдельный .h - все хорошо.

P.S. Но передали, в качестве параметра, вы не структуру, а ссылку на структуру. Хотя и структуру таким же макаром получается передавать.

 

step962
Offline
Зарегистрирован: 23.05.2011

leshak пишет:

P.S. Но передали, в качестве параметра, вы не структуру, а ссылку на структуру. Хотя и структуру таким же макаром получается передавать.

Ну так ведь:

setupStruct() - ссылка на структуру в качестве параметра (а как еще изменить передаваемый параметр?)

outStruct() - структура в качестве параметра

leshak
Offline
Зарегистрирован: 29.09.2011

 

step962 пишет:

leshak пишет:

P.S. Но передали, в качестве параметра, вы не структуру, а ссылку на структуру. Хотя и структуру таким же макаром получается передавать.

Ну так ведь:

outStruct() - структура в качестве параметра

Вы опять правы. А я, опять, не совсем внимателен.
Просто удивился что ваш пример компильнулся. Руками поменял ссылку на структуру в первой функции. Тоже заработало, а во вторую не вгляделся. Просто сильно удивился что "ведь помню же что мучился и пришлось в отдельный файл выносить". Полез в архив искать "проблемный пример", нашел что там был, все-таки enum. Ну и "поспешил поделится с миром" ;)

step962
Offline
Зарегистрирован: 23.05.2011

 Часто объявляют параметры подобного типа без ключевого слова struct - и имеют скандальные взаимоотношения с компилятором.

leshak
Offline
Зарегистрирован: 29.09.2011

step962 пишет:

 Часто объявляют параметры подобного типа без ключевого слова struct - и имеют скандальные взаимоотношения с компилятором.

Не. Вот такое я точно не могу даже представить. typedef потерять - это могу вообразить. public, по привычке всобачить - это да. А struct потерять?

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

Но в любом случае спасибо. А то бы так вечно и выносил все в отдельный файлы, даже в простых случаях. Хотя в любом более менее серьезном скетче приходится это делать.

Не из-за struct, так enum. Не enum так порядок объявления функций (да, иногда он не хочет видеть функцию объявленную ниже по коду).

lechat
Offline
Зарегистрирован: 13.09.2012

Коллеги, спасибо за помощь. Ваши советы помогли! оказывается, такой способ заполнения массива неприменим в теле программы. А я не знал...

Крайне, бесконечно вам благодарен!!!

 

#include <EEPROM.h>
#include "EEPROMAnything.h"

typedef struct keys_t
{
     unsigned char keyvalue[2];
     unsigned char keyname[8];
     unsigned int last_used;
     unsigned int total_used;

};

keys_t keys = { {0xff,0xff},
'keyname1',
1,
1
}; 

void setup()
{
   EEPROM_writeAnything(0, keys);
}

void loop()
{
}

 

компилируется! на саму работоспособность ещё не проверял, но, думаю, всё будет хорошо -- сейчас всё засуну в протеус, посмотрю что получится.

спасибо огромное!!!!!

step962
Offline
Зарегистрирован: 23.05.2011

leshak пишет:

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

Я имел в виду несколько иную ситуацию - более отдаленную по времени:

уже после объявления типа бдительность притупляется и при определении функции вместо "struct keys_t" вполне можно объявить параметр типа "keys_t".