Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 09.07.2018
Сообщений: 10

Как определить размер структуры и объединения?

20.07.2018, 11:53. Показов 5039. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef union{
      float Float;
      short int Logic;
      short int Byte;
      short Short;
      long int Long;
      char String[100]
} vartype;
 
 
typedef struct {
       short Stat;
       vartype Var;
 } varible;
подскажите как мне определить размер структуры varible в зависимости от типа vartype?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.07.2018, 11:53
Ответы с готовыми решениями:

Как обратиться к полям объединения, которое находится внутри структуры?
Например, дан массив структур struct a { union b { char *c1; int c2; }; }d;

Структуры и объединения
Дано натуральное число n и массив (или текстовый файл) содержащий информацию о n клиентов банка: фамилия; имя; отчество; адрес (город улица...

Структуры и объединения
Помогите пожалуйста. В списке студентов группы вычислить количество студентов с именами: Наталья, Владимир, Роман

20
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.07.2018, 11:56
С помощью оператора sizeof. Правда размер юниона будет одинаковым т.к. компилятор просто выделяет достаточно памяти чтобы поместился самый большой тип (в вашем случае как минимум 100 байт).
0
1 / 1 / 0
Регистрация: 09.07.2018
Сообщений: 10
20.07.2018, 12:08  [ТС]
это я понимаю. а например если у меня Var будет типа Logic и мне необходтмо считать из файла размер varible. я ж не могу считывать sizeof(shirt int)+sizeof(short int) байт (я имею в виду размер Stat+размерVar, который для примера у меня short int) ?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
20.07.2018, 12:21
GYLFIK, размер union всегда равен размеру самого "толстого" типа в объединении.
В вашем случае - char String[100]
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.07.2018, 16:41
Цитата Сообщение от GYLFIK Посмотреть сообщение
одскажите как мне определить размер структуры varible в зависимости от типа vartype?
GYLFIK, Размер типа vartype у вас может быть или sizeof(vartype) или sizeof(vartype). То есть, зависимости быть не может если не считать зависимость высоты телеграфного столба от среднего уровня тестостерона населения, зависимостью, требующей строгого учёта и контроля.
0
1 / 1 / 0
Регистрация: 09.07.2018
Сообщений: 10
23.07.2018, 14:13  [ТС]
да спасибо, это я понимаю. просто пошел не в ту сторону
0
23.07.2018, 16:33

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
зависимость высоты телеграфного столба от среднего уровня тестостерона населения
Это что-то фрейдистское... :D

0
23.07.2018, 21:55

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это что-то фрейдистское... :D
Не уверен. Я не считаю Фрейда шарлатаном, но не всегда понимаю почему. Думаю, он преувеличивает. Когда-то, критерием независимости считалась фраза "Влияние лунного света на рост телеграфных столбов". Я не люблю повторять избитое, но... я люблю столбы. Остальное никак нельзя объяснить, поэтому оно совершенно логично. То есть, по-моему Фрейд не при чём. :)

0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
24.07.2018, 10:33
Мне кажется (возможно, я ошибаюсь), что у ТС имеется файл, в который напиханы данные разных типов, и перед каждым типом двухбайтовым short-ом обозначено, что именно. И все это надо прочесть в массив
C++
1
struct variable S[...];
Если это действительно так, то задача не очень сложная, и я мог бы попробовать набросать код. Думаю, не только я один.

Добавлено через 2 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я не считаю Фрейда шарлатаном, но не всегда понимаю почему.
Имхо, у всех этих "объяснятелей мира" есть один грех. Как сказал кто-то, "Молотку весь мир кажется гвоздем"
1
24.07.2018, 14:52

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
И все это надо прочесть в массив
Байт, тут нет интриги. :)
union это такой зверь, который позволяет застолбить несколько типов на одном куске памяти. Логично, что кусок равен размеру самого боьшого типа. А писать и читать можно любой. Стандарт гарантирует корректность чтения, только типа записанного последним. Хотя говорят, что в большинстве реализаций можно читать как угодно. Но гуру уговаривают бояться strict aliasing rule. А размер всё равно равен размеру созданного union в соответствии с самым большим членом данных.

0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
24.07.2018, 15:04
Цитата Сообщение от IGPIGP Посмотреть сообщение
Стандарт гарантирует корректность чтения, только типа записанного последним. Хотя говорят, что в большинстве реализаций можно читать как угодно.
Что имеется в виду? Если записать в объединение тип float, то тип int оттуда уже не прочитаешь.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.07.2018, 15:06
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если записать в объединение тип float, то тип int оттуда уже не прочитаешь.
Это вопрос или утверждение?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
24.07.2018, 15:53
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это вопрос или утверждение?
Вроде расставлял знаки препинания...
То, что после записи целого числа в ячейку памяти, невозможно считать оттуда дробное число, а тем более строку или что-то еще - очевидно. Поэтому мне непонятно что вы имели в виду фразой "в большинстве реализаций можно".
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.07.2018, 16:18
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вроде расставлял знаки препинания...
Так я и думал. Утверждение, то есть. Однако, я имелл ввиду не магию чтения того, что уже стёрто. Я имел ввиду переинтерпритацию представления. Такое можно делать и приведением указателей на массивах char например.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
union FlintJohn
{
    int intik;
  float floatik;
};
int main(int argv, char*argc[])
{
FlintJohn fj;
fj.floatik = 1.23;
cout<<fj.floatik<<endl;//1.23
int amCrazy=fj.intik;
cout<<fj.intik<<endl;
fj.intik=123;//поломали float(1.23)
cout<<fj.intik<<endl;
cout<<fj.floatik<<endl;//поломанный флот
fj.intik=amCrazy;//востановили битовое представление для float(1.23)
cout<<fj.floatik<<endl;//снова 1.23
 
 cin.get();
    return 0;
}
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
24.07.2018, 16:43
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То, что после записи целого числа в ячейку памяти, невозможно считать оттуда дробное число,
прочитать то возможно, весь вопрос что получится
но вот такое
C++
1
2
3
4
5
union
{
 int a;
 unsigned char b[sizeof(int)];
}
можно ли записать массив байт, а прочитать целое число? байты приходят например через COM порт
вроде как по стандарту нельзя
а вот в промышленном программировании сто раз видел, например чтение дескрипторов в USB
2
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
24.07.2018, 16:51
ValeryS, стандарт предполагает что лучшее средство для этого - memcpy . Но на практике да, копировать лишний раз данные только потому, что они принимались в ином виде, не всегда рационально.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
25.07.2018, 10:28
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я имел ввиду переинтерпритацию представления
Обычно объединения делаются для хранения принципиально разных данных в одном и том же объеме. Например, вроде, в SDL событие EVENT может содержать как код нажатой клавиши, так и координаты мыши, сообщения окну и кучу других. Нет, попытаться интерпретировать оконное событие как клавишу, конечно, можно. Вот только пользы от такой "информации" ноль.
Цитата Сообщение от ValeryS Посмотреть сообщение
можно ли записать массив байт, а прочитать целое число? байты приходят например через COM порт
вроде как по стандарту нельзя
В стандарте не определен порядок байтов. На одной машине сначала может идти старший, потом младший. На другой - наоборот. Также не определен размер целого числа: в AVR это 16 бит, в x86 это 32 бита, в x64 - 64 бита. Если порядок байт известен, можно сделать явное преобразование:
C
1
int32_t res = (byte[3] << 24 | byte[2] << 16 | byte[1] << 8 | byte[0]);
А для чтения фиксированных структур необходимо чтобы порядок байт и размер типов данных во внутреннем представлении контроллера совпадал с передатчиком.
Цитата Сообщение от TRam_ Посмотреть сообщение
стандарт предполагает что лучшее средство для этого - memcpy
Как memcpy поможет при разном порядке байтов и размере переменных?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
25.07.2018, 11:02
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В стандарте не определен порядок байтов.
в стандарте не определен, а в протоколе определен
посему эта реализация платформозависимая , так же как и
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
C++
1
int32_t res = (byte[3] << 24 | byte[2] << 16 | byte[1] << 8 | byte[0]);
только мороки меньше
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.07.2018, 11:08
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Обычно объединения делаются для хранения принципиально разных данных в одном и том же объеме.
Всегда. А вот с какой целью это Ваши внутренние процессы. Вы написали:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если записать в объединение тип float, то тип int оттуда уже не прочитаешь.
Я показал, как писать одно, а читать - другое. И это не я придумал. Тут высказались и другие в данном плане. То что это объявлено незаконным я знаю. И... COKPOWEHEU, давайте будем высказывать своё мнения не с целью кого-то поправить. Программисты упрямы как и все математики.

Не по теме:

Если программиста С++ спросить о том, почему в С++ нет сборщика муссора, он может попытаться вас убить с криком "Свобода это всё!". А если спросить его, почему оптимизация нарушает свободу действий, - он точно вас убьёт. Но молча.

0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
25.07.2018, 11:54
Цитата Сообщение от ValeryS Посмотреть сообщение
в стандарте не определен, а в протоколе определен
Так задача-то перевести из протокола, где определен, во внутреннее представление, где не определен.
Цитата Сообщение от ValeryS Посмотреть сообщение
посему эта реализация платформозависимая , так же как и
А вот и нет. В моем примере идет работа с int32_t на уровне языка, а не реализации. Если в протоколе старшим является byte[3], то независимо от внутреннего представления (byte[3]<<24) окажется именно старшим байтом числа.
Другой вариант - через макрос определить порядок байт и выбрать реализацию:
C
1
2
3
4
5
6
7
8
9
10
union int32_un{
  int32_t ival;
  struct{
#ifdef ENDIAN
    char b0, b1, b2, b3;
#else
    char b3, b2, b1, b0;
#endif
  };
}
Цитата Сообщение от IGPIGP Посмотреть сообщение
А вот с какой целью это Ваши внутренние процессы.
Чтобы уточнить смысл вашей фразы "в большинстве реализаций можно читать как угодно"
Цитата Сообщение от IGPIGP Посмотреть сообщение
И... COKPOWEHEU, давайте будем высказывать своё мнения не с целью кого-то поправить.
Напротив! Давайте стремиться к максимальной точности и однозначности формулировок.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Если программиста С++ спросить
Хорошо что я не "чистокровный" программист С++
Хотя споры по философским основам и могут быть занимательными.
Например, void func() это процедура, это функция, ничего не возвращающая или это функция, которая возвращает "ничего"?
Или родственные отношения между подпрограммой, процедурой, функцией и методом. Кто является чьим подклассом, кто чьим потомком и т.д.?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.07.2018, 11:54
Помогаю со студенческими работами здесь

Структуры и объединения
Исправить ошибки в программе и добавить нужное из условия в скобках(Записная книжка. Ф.И.О, дата рождения, адрес, телефон, место работы...

Структуры и объединения
Нужно написать приложение «Организация работы конференции», которое должно содержать хотя бы одно объединение и одну структуру.

Структуры, Объединения, Перечисления
Реализовать программу для хранения информации о студентах одного потока. Предусмотреть следующие поля: ФИО, группа. Для иногородних...

Структуры, объединения и типы пользователя
Доброго времени суток! Помогите, пожалуйста, с заданием: Создать список произвольной организации. Областью данных каждого элемента...

Структуры, объединения и определяемые пользователем типы. Массивы структур
Здравтсвуйте! Помогите, пожалуйста, разобраться с одной задачкой! Условие следующее: Разработать программу обработки данных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru