Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Неверно работает typedef struct на Visual Studio / 12 сообщений из 12, страница 1 из 1
27.11.2012, 15:14
    #38054924
Sergio75
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверно работает typedef struct на Visual Studio
Добрый день. Переношу проект с С++ Builder 6 на Visual Studio 2010 С++ использую тот же заглавный файл в котором находятся описания структур, эта структура ниже не верно отрабатывает в Visual Studio 2010

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
#ifndef byte
typedef unsigned char	byte;
#endif

#ifndef word
typedef unsigned short	word;
#endif

#ifndef dword
typedef unsigned int	dword;
#endif

#pragma pack(push, 8)
typedef struct
{
        word        svcId;
        word        logicalChNum;
        word        pmtPid;
        word        pcrPid;
        word        videoPid;
        word        isAc3           : 1;
        word        audioAuto       : 1;
        word        audioRes        : 1;
        word        audioPid        : 13;

        word        nameIndex;
        word        tpIdx;
        dword       favIdx;
        dword       caSystem;
        word        bouquetId;

        dword       tunerNum        : 2;        
        dword       isSkip          : 1;
        dword       isCas           : 1;
        dword       isLock          : 1;
        dword       isRenamed       : 1;
        dword       isUsedLcn       : 1;
        dword       isHd            : 1;
        dword       soundMode       : 3;
        dword       soundLevel      : 2;
        dword       isMosaic        : 1; 
        dword       deleteFlag      : 1;
        dword       subtPid         : 13;
        dword       usbTunerFlag    : 1;
        dword       isHBBTV         : 1;
        dword       resbits2        : 2;   
            
        dword       csProviderId    : 24;      
        dword       tunerBits       : 4;
        dword       resbits4        : 4;               
        dword       videoStreamType : 8;
        dword       audioStreamType : 8;
        dword       csCaSysId       : 16;       
        dword       curCaSystem;
        dword       cwKeyIndex;
} S_FDU_ServiceData;
#pragma pack(pop, 8)



вот в этот участок структуры неверно ложатся данные :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        dword       tunerNum        : 2;        
        dword       isSkip          : 1;
        dword       isCas           : 1;
        dword       isLock          : 1;
        dword       isRenamed       : 1;
        dword       isUsedLcn       : 1;
        dword       isHd            : 1;
        dword       soundMode       : 3;
        dword       soundLevel      : 2;
        dword       isMosaic        : 1; 
        dword       deleteFlag      : 1;
        dword       subtPid         : 13;
        dword       usbTunerFlag    : 1;
        dword       isHBBTV         : 1;
        dword       resbits2        : 2; 



подскажите может какие то настройки компилятору нужно сделать чтобы он эти битове поля правильно разложил ?
Спасибо.
...
Рейтинг: 0 / 0
27.11.2012, 16:11
    #38055059
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверно работает typedef struct на Visual Studio
Sergio75,

а как это "правильно" ?
...
Рейтинг: 0 / 0
27.11.2012, 16:27
    #38055104
Sergio75
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверно работает typedef struct на Visual Studio
вот рисунки на которых все видно
...
Рейтинг: 0 / 0
27.11.2012, 16:28
    #38055109
Sergio75
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверно работает typedef struct на Visual Studio
...
Рейтинг: 0 / 0
27.11.2012, 16:29
    #38055116
Sergio75
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверно работает typedef struct на Visual Studio
VS2010
...
Рейтинг: 0 / 0
27.11.2012, 16:31
    #38055121
Sergio75
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверно работает typedef struct на Visual Studio
к примеру смотреть, должно быть isHd = 0 у студии isHd = 1
...
Рейтинг: 0 / 0
27.11.2012, 17:30
    #38055279
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверно работает typedef struct на Visual Studio
Sergio75,

А где видно что в студии и билдере одни и те же байты в памяти структуры?
Первый дамп он к чему относится: билдеру или студии?

Вообще начните с того что выведите в билдере и студии sizeof(S_FDU_ServiceData) и убедитесь что они равны.
...
Рейтинг: 0 / 0
27.11.2012, 18:03
    #38055349
Sergio75
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверно работает typedef struct на Visual Studio
первый рисунок это набор данных которые натягиваются на структуру размер данных = 48 байт и также sizeof(S_FDU_ServiceData) в билдере и студии равна 48 , на картинках видно что в Студии неверно вычисляются биты в средине структуры

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        dword       tunerNum        : 2;        
        dword       isSkip          : 1;
        dword       isCas           : 1;
        dword       isLock          : 1;
        dword       isRenamed       : 1;
        dword       isUsedLcn       : 1;
        dword       isHd            : 1;
        dword       soundMode       : 3;
        dword       soundLevel      : 2;
        dword       isMosaic        : 1; 
        dword       deleteFlag      : 1;
        dword       subtPid         : 13;
        dword       usbTunerFlag    : 1;
        dword       isHBBTV         : 1;
        dword       resbits2        : 2;
...
Рейтинг: 0 / 0
27.11.2012, 19:45
    #38055453
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверно работает typedef struct на Visual Studio
Sergio75,

Вообще, по стандарту, порядок размещения битовых полей внутри слов каждый компилятор может выбирать какой ему удобно.
Поэтому, вполне может быть вы столкнулись как раз с такой ситуацией что в билдере и студии разный порядок.
...
Рейтинг: 0 / 0
27.11.2012, 23:48
    #38055631
Неверно работает typedef struct на Visual Studio
Anatoly MoskovskySergio75,

Вообще, по стандарту, порядок размещения битовых полей внутри слов каждый компилятор может выбирать какой ему удобно.
Поэтому, вполне может быть вы столкнулись как раз с такой ситуацией что в билдере и студии разный порядок.
А нельзя этот порядок как-то жестко задать в программе для переносимости, если допустим в своем прикладном протоколе использовать битовые поля?
...
Рейтинг: 0 / 0
28.11.2012, 01:24
    #38055686
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверно работает typedef struct на Visual Studio
жестко задатьА нельзя этот порядок как-то жестко задать в программе для переносимости, если допустим в своем прикладном протоколе использовать битовые поля?Стандартное решение через дефайны:

Код: plaintext
1.
2.
3.
4.
5.
#define FLAG_A 0x01
#define FLAG_B 0x02
.... etc
int isFlagA(char field) { return field & FLAG_A; }
char setFlagA(char field) { return field | FLAG_A; }



За реальными примерами можно пойти в любую развитую библиотеку.
...
Рейтинг: 0 / 0
28.11.2012, 12:01
    #38056029
Sergio75
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неверно работает typedef struct на Visual Studio
одно понял что в студии не так работает #pragma pack(push, 8), пришлось в структуру внести изменения для того чтобы можно было применить #pragma pack(push,1)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Неверно работает typedef struct на Visual Studio / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]