Можно ли сбросить пользовательский тип данных, обратившись к содержимому с типом адреса в C? - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь сбросить значения до 0 в массивах, созданных пользователем для определенного типа данных и стандартного типа данных, как в коде, показанном ниже.

(Случай 1)

 uint8_t source[2] = {1,1};
 uint8_t data[2];

typedef struct 
{
    uint32_t           event3;
    float32_t          event4;
    float32_t          event5;
} test_Data_ts;

test_Data_ts test_Data_s[32];

void main()
{
test_Data_ts test_Data_s2 = {0};

//This Works    
(*(uint32_t*)(data)) = 0;
(*(uint16_t*)(&data[0])) = (*(uint16_t*)(&source[0]));

//This Works
(*(test_Data_ts*)(&test_Data_s[0])) = test_Data_s2; 
}

Следующие строки кода приводят к ошибке (Случай 2)

(*(test_Data_ts*)(&test_Data_s[0])) = *(test_Data_ts*)0x00; //do not execute
(*(test_Data_ts*)(&test_Data_s[0])) = (test_Data_ts)0; //**Error -> conversion to non-scalar type requested   
(*(test_Data_ts*)(&test_Data_s[0])) = 0;//**Error -> incompatible types when assigning to type 'test_Data_ts' from type 'int

Почему вторые 3 случая неверны?Может ли кто-нибудь также дать объяснения ошибок?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

*(test_Data_ts*)(&test_Data_s[0]) является первым элементом таблицы test_Data_s и имеет тип test_Data_ts

В первом распределении типы являются исправленными.

 (*(test_Data_ts*)(&test_Data_s[0])) = *(test_Data_ts*)0x00; //do not execute

, но вы пытаетесь разыменоватьпустой указатель.

(*(test_Data_ts*)(&test_Data_s[0])) = (test_Data_ts)0; //**Error -> conversion to non-scalar type requested   

Это не работает, потому что вы просите компилятор преобразовать скалярный тип (0 - int) в struct.

 (*(test_Data_ts*)(&test_Data_s[0])) = 0;//**Error -> incompatible types when assigning 
              //to type 'test_Data_ts' from type 'int

Вы не запрашиваете преобразование, как в предыдущей строке, но компилятор сообщает вам, что типы с обеих сторон назначения не совместимы.Один - это int (0), а другой - struct.

0 голосов
/ 26 января 2019

Я думаю, это то, что вы ищете

memset(&test_Data_s, 0, sizeof test_Data_s);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...