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

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

13.06.2017, 08:25. Показов 2427. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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
21280 / 8303 / 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
21280 / 8303 / 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
21280 / 8303 / 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
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru