jenya7 0 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба Сделал такую проверку void *var_ptr; uint8_t test1; uint32_t test2; test1 = 5; var_ptr = &test1; test2 = *((uint32_t *)(var_ptr)); Получаю test2 = 5. Почему результат правильный? Я же привел не к тому типу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 4 минуты назад, jenya7 сказал: Получаю test2 = 5. Почему результат правильный? Я же привел не к тому типу? Потому что повезло что рядом с test1 оказался 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 7 minutes ago, jenya7 said: Получаю test2 = 5. Почему результат правильный? Я же привел не к тому типу? Натравите на это cppcheck. Должно предупредить о некорректном преобразовании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 мая, 2019 Опубликовано 12 мая, 2019 (изменено) · Жалоба 1 hour ago, jcxz said: Потому что повезло что рядом с test1 оказался 0. Я тоже так подумал. Усложнил проверку typedef struct { uint8_t state; uint8_t direction; uint8_t prev_direction; uint8_t action; uint8_t flimsw_state; uint8_t rlimsw_state; }MOTOR_RT_PARAMS; MOTOR_RT_PARAMS mot_rt_params; mot_rt_params.direction = 5; mot_rt_params.action = 7; mot_rt_params.flimsw_state = 8; uint32_t test; var_ptr = &mot_rt_params.flimsw_state; test = *((uint32_t *)var_ptr); test = *((uint32_t *)var_ptr); Получаю test = 8. Изменено 12 мая, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба Padding... Упакуйте структуру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 1 hour ago, Arlleex said: Padding... Да. Может быть. То есть по любому надо приводить к нужному типу обязательно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 5 минут назад, jenya7 сказал: Я тоже так подумал. Усложнил проверку ... Получаю test = 8. И что? А сколько там должно быть по вашему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 1 hour ago, jcxz said: И что? А сколько там должно быть по вашему? ((uint32_t *)var_ptr) должен взять 4 байта а переменная 1 байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 2 минуты назад, jenya7 сказал: Да. Может быть. То есть по любому надо приводить к нужному типу обязательно? По-любому вам надо наконец-то начать учить язык си. Обязательно! 1 минуту назад, jenya7 сказал: ((uint32_t *)var_ptr) должен взять 4 байта а переменная 1 байт. и что? См. моё первое сообщение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 12 минут назад, jenya7 сказал: Да. Может быть. То есть по любому надо приводить к нужному типу обязательно? Не понятна цель экскремента эксперимента... Мусор в переменной получить лишний? Так Вы его получили. Рядом стоящий мусор оказался нулями, как уже было отмечено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 1 hour ago, Arlleex said: Не понятна цель экскремента эксперимента... Мусор в переменной получить лишний? Так Вы его получили. Рядом стоящий мусор оказался нулями, как уже было отмечено. Я хочу передовать войдовый указатель в функцию в качестве аргумента. Хотел 100% быть уверенным что точный каст обязателен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба Обязателен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 1 hour ago, jenya7 said: Получаю test2 = 5. Почему результат правильный? Я же привел не к тому типу? Ваше "счастье" определено наличием (?) инициализированной нулями памяти (как выше отмечалось) и "интеловским" порядком следования байт, по младшему адресу расположен младший байт данных (кажется big-endian). Если этот код откомпилировать для мотороловского процессора (little-endian) - "счастье" не случится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 21 минуту назад, k155la3 сказал: Ваше "счастье" определено наличием (?) инициализированной нулями памяти (как выше отмечалось) и "интеловским" порядком следования байт, по младшему адресу расположен младший байт данных (кажется big-endian). Если этот код откомпилировать для мотороловского процессора (little-endian) - "счастье" не случится. Да, только LE/BE местами попутаны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 12 мая, 2019 Опубликовано 12 мая, 2019 · Жалоба 2 minutes ago, Arlleex said: Да, только LE/BE местами попутаны. Да, есть такой грех. диавол такие термины придумал, все запомнить-понять не могу, сено-солома Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться