Помогите В чём ошибка при создании динамического массива?

releyshic
Offline
Зарегистрирован: 20.11.2015
struct Timer
{  
  uint8_t ID_TIMER = 0;  
  uint8_t WEEK_OR_EACH_DAY = 1; // 1 for 1st week, 2 for 2nd week, 0 - each day  
  bool ACTIVE_TIMER = true; 
  uint8_t DOW = 0;
  uint8_t TIME[8];   
  uint8_t DAY = 0;
  uint8_t MONTH = 0;
  uint16_t YEAR = 0; //format XX  
};

Timer* Timers_pointer;
//Создаём Массив размером s
Timers_pointer = (Timer*)malloc(sizeof(Timer)); // Под 1 Таймер 

сама ошибка:

"_1_NewSortirovka_21.10.16_Time:365: error: 'Timers_pointer' does not name a type" и она первая в списке ошибок

С обычным массивом "Timer Timers[TIMERS];" ошибок нет

Не могу понять почему он думает что указатель это тип?

Или может библиотеку надо какуюто подключить?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Надо бы структуру Timer и переменную Timer назвать по разному.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Обычно это делается так:

typedef struct _TIMER
{  
  uint8_t ID_TIMER = 0;  
  uint8_t WEEK_OR_EACH_DAY = 1; // 1 for 1st week, 2 for 2nd week, 0 - each day  
  bool ACTIVE_TIMER = true; 
  uint8_t DOW = 0;
  uint8_t TIME[8];   
  uint8_t DAY = 0;
  uint8_t MONTH = 0;
  uint16_t YEAR = 0; //format XX  
} * PTIMER, TIMER;

PTIMER Timers_pointer;
//Создаём Массив размером s
Timers_pointer = ( PTIMER ) malloc( sizeof( TIMER ) ); // Под 1 Таймер 

 

releyshic
Offline
Зарегистрирован: 20.11.2015

Это же Тип структуры а не имя, не понял что к чему

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Открой MSDN

typedef struct mystructtag
{
    int   i;
    double f;
} mystruct;

mystruct - это тип твоей переменной;

mystructtag - это тэг структуры.

releyshic
Offline
Зарегистрирован: 20.11.2015

1 "'PTimer' does not name a type" на 13 пока не добавил "typedef" - очень странно, опять закидоны A IDE

2 Теперь ошибка "'Timers_pointer' does not name a type" в 15

releyshic
Offline
Зарегистрирован: 20.11.2015

в твоём примере mystruct - это имя переменной, mystructtag - это новый тип данных

открой любой учебник

или тот же мсдн

https://msdn.microsoft.com/ru-ru/library/64973255.aspx

releyshic
Offline
Зарегистрирован: 20.11.2015

uni пишет:

Обычно это делается так:

typedef struct _TIMER
{  
  uint8_t ID_TIMER = 0;  
  uint8_t WEEK_OR_EACH_DAY = 1; // 1 for 1st week, 2 for 2nd week, 0 - each day  
  bool ACTIVE_TIMER = true; 
  uint8_t DOW = 0;
  uint8_t TIME[8];   
  uint8_t DAY = 0;
  uint8_t MONTH = 0;
  uint16_t YEAR = 0; //format XX  
} * PTIMER, TIMER;

PTIMER Timers_pointer;
//Создаём Массив размером s
Timers_pointer = ( PTIMER ) malloc( sizeof( TIMER ) ); // Под 1 Таймер 

Твой пример не работает ))

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Если есть typedef, то  mystruct - это имя типа, а всё что между ними - описание базового типа, на основе которого объявляется описание нового типа. В этом примере typedef использовался для объявления двух типов сразу - типа структуы TIMER и указателя на эту структуру PTIMER. Таким образом описаны структуры во всех стандартных заголовочниках windows. 

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Мой пример работает. Я его скомпилировал, прежде чем писать сюда.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

На всякий случай. Вызов функции malloc() можно делать только внутри setup() или loop(), но не при объявлении указателя.

releyshic
Offline
Зарегистрирован: 20.11.2015

uni пишет:

Мой пример работает. Я его скомпилировал, прежде чем писать сюда.

а уменя не работает, я отсюда копировал код. блин

Он у тебя где в скетче написан, перед setup?

releyshic
Offline
Зарегистрирован: 20.11.2015

uni пишет:

На всякий случай. Вызов функции malloc() можно делать только внутри setup() или loop(), но не при объявлении указателя.

спасибо и мой код заработал ) чёт затупил и правда, все функции ведь из майна вызываюся )

только внутри setup() или loop() или в вообще в любой функции?

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Внутри любой, но не в глобальной области при объявлении переменных.