С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
1

Битовые поля. Поля без типа и имени

13.06.2017, 08:25. Показов 2440. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вчера сделал очень интересную и болезненную ошибку (с точки зрения времени, так как искал я ее долго)... представьте структуру (битовое поле) с очень большим количеством переменных в ней... и вот там был такой косяк:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// пример
struct SExample
{
   // b1
   unsigned short a   : 1;
   unsigned short b   : 7; 
 
   // b2
   unsigned short c   : 8;
 
   ..................................
   // b(n)
   unsigned short n;  : 3;
   unsigned short m   : 5;
 
   ...............................
};
нужно присмотреться внимательно, чтоб его заметить... из него выплыла одна интересная особенность... я знал, что можно создавать поля без имени, но чтоб создавать нечто подобное:
C++
1
2
3
4
5
6
STest
{
   : 2;
   : 8;
   : 6;
};
и понятия не имел)))

может кто-то объяснит... как и почему этот код компилируется? законно ли это на всех компиляторах или это только кривой MinGW (извините, я его не люблю по целому ряду причин) такое ест?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2017, 08:25
Ответы с готовыми решениями:

Битовые поля и работа с двоичным числом без логических операций
Есть 2 числа. Например, 10110 и 11100 в дв. сист. сч. Нужно разряд первого числа сравнить с тем...

Невозможно выполнить выборку по имени поля (по номеру поля все работает)
Вот кусок кода: conn = new SqlCeConnection("Data Source = Database.sdf;"); ...

Получить значения элемента xml по заданному имени из поля типа Object
Привет! Помогите чайнику. Задача следующая. Имеется поле типа Object внутри которого лежит XML....

Битовые операции, битовые поля.
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций....

16
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.06.2017, 08:27 2
это не будет нигде компилировать, нет ключевого слова struct и типов нет.
1
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.06.2017, 08:35  [ТС] 3
Цитата Сообщение от GbaLog- Посмотреть сообщение
это не будет нигде компилировать, нет ключевого слова struct и типов нет.
уупс.. ошибочка вышла... struct я действительно проглядел...
а вот без типов компилируется прекрасно!

и в том то и дело, что стает вопрос... какого????
0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.06.2017, 08:43 4
Цитата Сообщение от JIawliet Посмотреть сообщение
а вот без типов компилируется прекрасно!
да что вы говорите?!
http://rextester.com/NMJ26557
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
struct A
{
    : 2;
};
 
int main()
{
    
}
Код
source_file.cpp:5:7: error: ISO C++ forbids declaration of ‘type name’ with no type [-fpermissive]
     : 2;
       ^
Добавлено через 17 секунд
какие флаги компиляции и какая версия mingw?
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.06.2017, 08:49  [ТС] 5
Цитата Сообщение от GbaLog- Посмотреть сообщение
какие флаги компиляции и какая версия mingw?
в флагах ничего не менял, какие были в QtCreator, такие и стоят... MinGW 4.9.1 32bit

Цитата Сообщение от GbaLog- Посмотреть сообщение
да что вы говорите?!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <QCoreApplication>
#include <iostream>
 
struct STest
{
  : 2;
  : 3;
  : 5;
  : 6;
};
 
int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
 
  std::cout << sizeof(STest);
 
  return a.exec();
}
Миниатюры
Битовые поля. Поля без типа и имени  
0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
13.06.2017, 08:56 6
странно это, может Qt что-то мудрит.
попробуйте чисто мингвом скомпилить, без Qt.
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.06.2017, 09:07  [ТС] 7
Цитата Сообщение от GbaLog- Посмотреть сообщение
попробуйте чисто мингвом скомпилить, без Qt.
ну вы мне уже скинули ссылку на rextester, как бы там оно не компилируется.. осталось понять почему у меня такое компилируется))) так как вот это строка кода:
Цитата Сообщение от JIawliet Посмотреть сообщение
unsigned short n; : 3;
отняла у меня 3 часа жизни

Добавлено через 9 минут
в общем... компилятор (C:\Qt\Qt5.4.1\Tools\mingw491_32\bin\g++.exe) такой код кушает, так что проблема не в QtCreator (да и что он мог изменить), а в самом компиляторе... может расширение какое-то?
а так даже великий и ужасный clang не ест такой код)))
0
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.06.2017, 09:56 8
Проверил на линуксовом gcc-4.9 - не ест. Ни в режиме Си, ни в режиме Си++.
На всякий случай глянь, с какими там опциями запускается, может есть какая-нибудь читерская
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.06.2017, 10:28  [ТС] 9
Цитата Сообщение от Evg Посмотреть сообщение
Проверил на линуксовом gcc-4.9 - не ест. Ни в режиме Си, ни в режиме Си++.
На всякий случай глянь, с какими там опциями запускается, может есть какая-нибудь читерская
сейчас я напрочь сломаю всю систему))) запустил только что в RAD такой код (ничего не меняя в .h и на форме):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
struct STest
{
  : 2;
  : 6;
};
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
Text = String(sizeof(STest));
}
//---------------------------------------------------------------------------
Миниатюры
Битовые поля. Поля без типа и имени  
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.06.2017, 10:30  [ТС] 10
какой-там компилятор в RAD я не вникал... если не ошибаюсь - у них там свой какой-то... вот, но факт остается фактом... на моем компе (рабочем, я еще сегодня дома проверю), такой код имеет место быть и компилируется нормально...
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
13.06.2017, 10:40 11
Цитата Сообщение от JIawliet Посмотреть сообщение
такой код имеет место быть и компилируется нормально...
Запусти компилятор для своего примера с ключом -v и скинь весь его лог сюда.
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.06.2017, 10:56  [ТС] 12
Цитата Сообщение от DrOffset Посмотреть сообщение
Запусти компилятор для своего примера с ключом -v и скинь весь его лог сюда.
пожалуйста, весь вывод компилятора (компилятор из Qt, стоит еще раз отметить, что такой же код у меня компилируется и в RAD) для этого кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
struct STest
{
  : 2;
  : 6;
  : 8;
  : 8;
};
 
int main()
{
  std::cout << sizeof(STest);
}
Вложения
Тип файла: log Test.log (7.1 Кб, 7 просмотров)
0
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.06.2017, 15:49 13
Цитата Сообщение от JIawliet Посмотреть сообщение
пожалуйста, весь вывод компилятора (компилятор из Qt, стоит еще раз отметить, что такой же код у меня компилируется и в RAD) для этого кода
Никаких левых или читерских опций не видно. Странно как-то всё это
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.06.2017, 16:21  [ТС] 14
Цитата Сообщение от Evg Посмотреть сообщение
Никаких левых или читерских опций не видно. Странно как-то всё это
потому что дело не в компиляторе скорее всего... так как такой код компилится и в RAD и в QtCreator...
более того... он компилится не только на моем компьютере... только что проверял за соседним, тот же QtCreator и та же RAD (10.1 Berlin) и все компилилось...

на счет компилятора в RAD: стоит галочка "Use 'classic' Borland compiler"
0
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
13.06.2017, 21:05 15
ДА фиг с ним, с борландовским компилятором. У тебя по логу из-под QtCreator'а запускается g++ (mingw). У меня gcc ни линуксовй, ни виндузовый это не едят

Добавлено через 1 минуту
Опаньки. Под виндой я запускал версию из-под cygwin'а. Но вот взял и запустил чистый MinGW и там сожралось. Такое ощущение, что windows-версия gcc это жрёт для поддержки совместимости. Возможно с Borland'овским компилятором. Возможно, с чем-то ещё. У кого есть MSVC, проверьте пожалуйста

Добавлено через 1 минуту
Фиг-то там. Просто mingw у меня либо не работает, либо что-то ещё, но при этом не выдаёт никаких ошибок или сообщений

Добавлено через 5 минут
mingw с gcc-4.6.3 не жрёт, а mingw с gcc-4.8.1 не запускается
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
13.06.2017, 22:59  [ТС] 16
Цитата Сообщение от Evg Посмотреть сообщение
У кого есть MSVC, проверьте пожалуйста
MVS 2017 плюется от такого кода еще в редакторе...

ну как бы что такой код не легален я вроде как понимал... я удивился от такого, что он скомпилился... и если кто-то объяснит почему - буду очень-очень рад)
0
Evg
14.06.2017, 22:14     Битовые поля. Поля без типа и имени
  #17

Не по теме:

Цитата Сообщение от JIawliet Посмотреть сообщение
MVS 2017 плюется от такого кода еще в редакторе
Про MSVC я написал, когда у меня вдруг под gcc "заработало". Но потом оказалось, что это компилятор молча запускается и ничего не делает

0
14.06.2017, 22:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2017, 22:14
Помогаю со студенческими работами здесь

вычисляемые поля - обработка зависит от типа поля?
Коллеги, что-то не могу понять и найти в хелпе про тонкости &quot;Refresh fields on keyword change&quot;/...

Передача поля в контроллер из вьюшки без пападания поля во вьюшку
Здравствуйте. Имеется контроллер: public class TestController { public long...

Insert без идентификаторов для поля типа SERIAL
Есть поле &quot;id&quot; serial (sequences:blabla) Primary key ('id') Как то получается по дурацки т.е....

Битовые поля
Дать пользователю возможность ввести N чисел После чего вывести диаграмму боковую отображающую...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru