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

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

20.07.2018, 11:53. Показов 5010. Ответов 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
9006 / 4707 / 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,916
24.07.2018, 15:04
Цитата Сообщение от IGPIGP Посмотреть сообщение
Стандарт гарантирует корректность чтения, только типа записанного последним. Хотя говорят, что в большинстве реализаций можно читать как угодно.
Что имеется в виду? Если записать в объединение тип float, то тип int оттуда уже не прочитаешь.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.07.2018, 15:06
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если записать в объединение тип float, то тип int оттуда уже не прочитаешь.
Это вопрос или утверждение?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,916
24.07.2018, 15:53
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это вопрос или утверждение?
Вроде расставлял знаки препинания...
То, что после записи целого числа в ячейку памяти, невозможно считать оттуда дробное число, а тем более строку или что-то еще - очевидно. Поэтому мне непонятно что вы имели в виду фразой "в большинстве реализаций можно".
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 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,867
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,916
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,867
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
9006 / 4707 / 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,916
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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru