Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2018, 09:31   #1
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 49
Сообщение Помогите с двумя теоретическими вопросами

Буквально два вопроса, можно ответить просто да/нет. Дело в том, что препод засыпал, а я не уверен прав ли он.

Структура в языке С представляет собой непрерывный участок памяти, размер которого равен произведению наибольшего размера и количество полей? (да/нет)
Структура в языке С не может содержать поля типа "структура"? (да/нет)

Сидел проверял размер структуры, ну действительно ведь произведению равен размер. Может, в Паскале размер структуры равен сумме всех полей, и из-за этого препод забыл?
На первый я ответил "Да", на второй "Нет".
Как правильно?
Yudin вне форума Ответить с цитированием
Старый 30.05.2018, 10:15   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Засыпал... Ха-ха...

Цитата:
Сообщение от Yudin Посмотреть сообщение
Сидел проверял размер структуры, ну действительно ведь произведению равен размер. Может, в Паскале размер структуры равен сумме всех полей, и из-за этого препод забыл?
Он и в С так же равен, только стоит учитывать выравнивание.
Смотрим https://ideone.com/5wkKe6 три поля, большее размером 4. По вашему размер структуры 12, а программа упорно выдает 8...

Цитата:
Сообщение от Yudin Посмотреть сообщение
Структура в языке С не может содержать поля типа "структура"? (да/нет)
Смотрим https://ideone.com/I9nHqr Структура есть? - есть. Поле в ней типа структура есть? - есть. Компилится и работает? - да. Вывод - ...

Последний раз редактировалось p51x; 30.05.2018 в 10:21.
p51x вне форума Ответить с цитированием
Старый 30.05.2018, 10:19   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Yudin Посмотреть сообщение
Сидел проверял размер структуры
Что Вы там проверяли - непонятно
Код:
#include <stdio.h>

struct {
  char a;
  char b;
  char c;
  int  d;
} s;

int main() { 
  printf("%s: %d\n", "s", sizeof(s)); 
  printf("%s: %d\n", "s.a", sizeof(s.a)); 
  printf("%s: %d\n", "s.b", sizeof(s.b)); 
  printf("%s: %d\n", "s.c", sizeof(s.c)); 
  printf("%s: %d\n", "s.d", sizeof(s.d)); 
}
Код:
s: 8
s.a: 1
s.b: 1
s.c: 1
s.d: 4
Black Fregat вне форума Ответить с цитированием
Старый 30.05.2018, 10:27   #4
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 49
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение

Он и в С так же равен, только стоит учитывать выравнивание.
Смотрим https://ideone.com/5wkKe6 три поля, большее размером 4. По вашему размер структуры 12, а программа упорно выдает 8...
Простите, я на первом курсе, не очень понимаю, что за типы "uint8_t, uint8_t, uint32_t". Я сделал проще с типами, которые я знаю. Я не уверен правильно ли я вас понял.
Изображения
Тип файла: jpg photo_2018-05-30_10-23-21.jpg (44.7 Кб, 139 просмотров)
Yudin вне форума Ответить с цитированием
Старый 30.05.2018, 10:34   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

1. По секрету - у вас С++. Это немного другое.
2. Уж на первом курсе при изучении программирования отмазываться отговорками типа нам не рассказали глупо. Прочитайте в документации, что это за типы.
3. И? Какие выводы вы сделали из своего теста? Что показали результаты?
p51x вне форума Ответить с цитированием
Старый 30.05.2018, 10:36   #6
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Что Вы там проверяли - непонятно
Код:
#include <stdio.h>

struct {
  char a;
  char b;
  char c;
  int  d;
} s;

int main() { 
  printf("%s: %d\n", "s", sizeof(s)); 
  printf("%s: %d\n", "s.a", sizeof(s.a)); 
  printf("%s: %d\n", "s.b", sizeof(s.b)); 
  printf("%s: %d\n", "s.c", sizeof(s.c)); 
  printf("%s: %d\n", "s.d", sizeof(s.d)); 
}
Код:
s: 8
s.a: 1
s.b: 1
s.c: 1
s.d: 4
Я не понимаю, как 8 получилось. Прикрепил скрин того, что я там проверял.
Yudin вне форума Ответить с цитированием
Старый 30.05.2018, 10:38   #7
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 49
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
1. По секрету - у вас С++. Это немного другое.
2. Уж на первом курсе при изучении программирования отмазываться отговорками типа нам не рассказали глупо. Прочитайте в документации, что это за типы.
3. И? Какие выводы вы сделали из своего теста? Что показали результаты?
Что в С++ размер структуры равен произведению наибольшего размера поля и количества полей. И что структуру может содержать поле "структура".
Yudin вне форума Ответить с цитированием
Старый 30.05.2018, 10:43   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Цитата:
Сообщение от Yudin Посмотреть сообщение
Я не понимаю, как 8 получилось.
1 + 1 + 1 + 4 = 7 и +1 от компилятора для выравнивания

Цитата:
Сообщение от Yudin Посмотреть сообщение
Что в С++ размер структуры равен произведению наибольшего размера поля и количества полей.
Вам уже два примера привели, что это не так. Попераставляйте поля в своем примере, заведите больше переменных с разным размером.
p51x вне форума Ответить с цитированием
Старый 30.05.2018, 10:55   #9
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 49
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение

Вам уже два примера привели, что это не так. Попераставляйте поля в своем примере, заведите больше переменных с разным размером.
Попереставлял, попроверял... Моя жизнь никогда не станет прежней, я свято верил, что размер равен произведению, а оказывается компилятор просто добавляет к сумме значения, чтобы результат был кратен максимальному полю...
Yudin вне форума Ответить с цитированием
Старый 30.05.2018, 10:56   #10
Yudin
Пользователь
 
Регистрация: 11.01.2018
Сообщений: 49
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Засыпал... Ха-ха...
Ну получается не засыпал, но я этого не знал... Спасибо большое за ответ...
Yudin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с вопросами alhon Помощь студентам 2 14.01.2016 22:06
Помогите с вопросами пожалуйста Silensir111 Помощь студентам 0 20.11.2015 19:39
Помогите с вопросами R@MZ[E]$ Помощь студентам 6 21.05.2009 17:51
Помогите с вопросами... R@MZ[E]$ Паскаль, Turbo Pascal, PascalABC.NET 5 21.05.2009 09:40