Russian Qt Forum
Апрель 28, 2024, 23:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по QtWin  (Прочитано 4791 раз)
swizar
Гость
« : Май 18, 2006, 16:17 »

Добрый всем день.
Столкнулся с такой проблемой. Под Win Qt-3.3.5.
После создания vc проекта с помощью
Код:

qmake -t vcapp roect.dsp proect.pro

По умолчанию стоит выравнивание на 8б, я читаю свои файлы, и не только свои файлы и мне нужно выравнивание на 1б. После сборки прога с выравниванием на 1б падает хрен знает где, а если собирать на 8б, то работает, но данные естественно читает коряво, и нет гарантии, что на других файлах не грохнется. Просто я еще не все модули включил.
Если кто сталкивался подскажите в чем дело.

Да все двоичные файлы, я читаю readBlock, а потом сам при не обходимости разбираю.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Май 19, 2006, 06:54 »

я не думаю что qmake умеет ставить выравнивание
придется ручками создавать проект

PS: обычно на выравнивании падает около sizeof(структура)
именно он дает разные результаты
Записан
alex0303
Гость
« Ответ #2 : Май 19, 2006, 09:00 »

Устанавливайте выравнивание/упаковку ручками и только там где вам надо.
Если Вы ставите его для всего проекта то те-же qt-header-ы ваш компиллер воспринимает с вашим выравниванием/упаковкой, а сама либа qt скомпилированна с другим, естественно что тут работать не будет. Улыбающийся
Записан
swizar
Гость
« Ответ #3 : Май 19, 2006, 09:53 »

Да я бы с удовольствием поставил выранивание только там где надо. В Linux-е я так и делаю, а Win, не очень получается.
Я например делаю так:
Код:

#ifdef Q_WS_WIN
#pragma warning ( disable : 4103 )
#pragma pack ( 1 )
#endif
// здесь идет описание данных

#ifdef Q_WS_WIN
#pragma warning ( disable : 4081 )
#pragma
#pragma warning ( default : 4103 4081 )
#endif

И чето не очень помогает. Во-первых идет куча Warning-ов, на использование pragma pack, во-вторых поведение программы все равно не стабильно. Причем падает на таких функциях как setPalette(), setGeometry () и т.д.

добавлено спустя 4 минуты:

 Да я бы с удовольствием поставил выранивание только там где надо. В Linux-е я так и делаю, а Win, не очень получается.
Я например делаю так:
Код:

#ifdef Q_WS_WIN
#pragma warning ( disable : 4103 )
#pragma pack ( 1 )
#endif
// здесь идет описание данных

#ifdef Q_WS_WIN
#pragma warning ( disable : 4081 )
#pragma
#pragma warning ( default : 4103 4081 )
#endif

И чето не очень помогает. Во-первых идет куча Warning-ов, на использование pragma pack, во-вторых поведение программы все равно не стабильно. Причем падает на таких функциях как setPalette(), setGeometry () и т.д.
Записан
DenKor
Гость
« Ответ #4 : Май 19, 2006, 11:26 »

#ifndef KSTRUCT_H
#define KSTRUCT_H

#include <qsettings.h>

#pragma pack (1)


/*--------------------------------------------------------------------------*/
/* FIDO Message attributes (attr) (informational)                           */
/*--------------------------------------------------------------------------*/
#define MSGPRIVATE 0x0001  /* private message,          0000 0000 0000 0001 */
#define MSGCRASH   0x0002  /* accept for forwarding +   0000 0000 0000 0010 */
#define MSGREAD    0x0004  /* read by addressee         0000 0000 0000 0100 */
#define MSGSENT    0x0008  /* sent OK (remote)          0000 0000 0000 1000 */
#define MSGFILE    0x0010  /* file attached to msg  +   0000 0000 0001 0000 */
#define MSGFWD     0x0020  /* being forwarded           0000 0000 0010 0000 */
#define MSGORPHAN  0x0040  /* unknown dest node         0000 0000 0100 0000 */
#define MSGKILL    0x0080  /* kill after mailing    +   0000 0000 1000 0000 */
#define MSGLOCAL   0x0100  /* FidoNet vs. local         0000 0001 0000 0000 */
#define MSGXX1     0x0200  /*                           0000 0010 0000 0000 */
#define MSGXX2     0x0400  /* STRIPPED by FidoNet<tm>   0000 0100 0000 0000 */
#define MSGFRQ     0x0800  /* file request              0000 1000 0000 0000 */
#define MSGRRQ     0x1000  /* receipt requested     +   0001 0000 0000 0000 */
#define MSGCPT     0x2000  /* is a return receipt       0010 0000 0000 0000 */
#define MSGARQ     0x4000  /* audit trail requested     0100 0000 0000 0000 */
#define MSGURQ     0x8000  /* update request            1000 0000 0000 0000 */

#define DB_DELETED          0x0001   // This structure is marked for deletion
#define DB_MARKED_FOR_PURGE 0x0002   // Area marked for purging
#define DB_AREA_LOCKED      0x0004   // This area is actually locked
#define DB_MAIL_READ        0x0008   // Mail already read
#define DB_AREA_MODIFIED    0x0010   // Area must be SCANNED
#define DB_MAIL_CREATED     0x0020   // A new created MAIL
#define DB_MAIL_SCANNED     0x0040   // The SCANNER has already seen this mail
#define DB_NEVER_DELETE     0x0080   // Never delete this MAIL
#define DB_MAIL_ROUTED      0x0100   // send to Boss, otherwise - to Point direct
#define DB_DUPE_MAIL        0x0200   // Mail is a DUPE
#define DB_FROZEN_MAIL      0x0400   // frozen Mail
#define DB_USERMARKED       0x0800   // user marked Mail
#define DB_ANSWERED         0x1000   // this Mail have been answered
#define DB_CONVERTED        0x2000   // Message File of Area was converted

// combined flags
#define DB_NOTSCAN   (DB_MAIL_SCANNED | DB_FROZEN_MAIL | DB_DELETED) // not scan this mail



#define ULONG   unsigned long
#define USHORT  unsigned short
#define LPSTR   char*

typedef struct _gconfig
{
  QString msgBase;
  QString inBase;
  QString outBase;
};

struct _magicid
{
  long affe1;
  long affe2;
  long count1;
  long count2;
};

typedef struct areadef
{
  long index;                     // Index for simple identify
  long structlen;                 // length of structure
  long status;                    // diverse Status Information
  char description[129];          // area description
  char echotag[101];              // echotag
  char filename[FILENAMELEN] ;    // Basis name without path and extension
  unsigned long lastread;         // number of last read mail (Begin  0)
  unsigned long hheader;          // File Pointer to header file
  unsigned long hmessage;         // File Pointer to message file
  char aka[21];                   // AKA
  char uplink[31];                // Uplink
  char group[12];                 // Group
  int  membership;                // Base Group of this Area
  int  purge_age_create;          // Purge info
  int  purge_age_recipt;          // Purge info
  int  purge_max_num;             // Purge info
  int  purge_flag_create;         // Purge info
  int  purge_flag_age_recipt;     // Purge info
  int  purge_flag_nrmails;        // Purge info
  int  number_of_mails;           // total number of mails
  int  number_of_already_read;    // number of read mails
  long localmail;                 // Never export this area
  int  additional_days;           // Add days for non read mails before purge
  long area_creation_date;        // creation date for area
  long udefindex;                 // NEW: index in userdef list, -1 - if not in list
  long dummy4;                    //
  long dummy5;                    //
  long dummy6;                    //
  long dummy7;                    //
  long dummy8;                    //
  long dummy9;                    //
  long dummy10;                   //
  long dummy11;                   //
  long dummy12;                   //
  long dummy13;                   //
  long dummy14;                   //
  long dummy15;                   //
  long affe1;                     //  OLD dummy16
  long affe2;                     //  OLD dummy17
  long count1;                    //  OLD dummy18
  long count2;                    //  OLD dummy19
} *pareadef;


#pragma pack ()

#endif

Просто эту директиву надо делать по месту.
Я например делаю так.
Записан
alex0303
Гость
« Ответ #5 : Май 19, 2006, 11:35 »

Назад  выравнивание/упаковку возвращяйте.
Ну и можно (или желательно) пользовать:
#pragma pack(push, 1)
...
#pragma pack(pop)
Записан
swizar
Гость
« Ответ #6 : Май 19, 2006, 12:04 »

Спасибо за пример. Вроде получилось. Собралось бе дурацких предупреждений. Правда я все-таки написал так:

Код:

#ifdef Q_WS_WIN
#pragma warning ( disable : 4103 )
#pragma pack (1)
#endif
typedef struct
{
...
} MSTRUCT;

#ifdef Q_WS_WIN
#pragma warning ( disable : 4081 )
#pragma pack ()
#pragma warning ( default : 4103 4081 )
#endif


Раз уж тут такая фигня, то можно вопрос не по теме...
Попробовал в Win использовать для чтения файлов read. И он мне возвращает левое значение (например размер файла 65К, а прочитано 144б). Это к чему. Проект начинался не как Qt, есть достаточно много мест где происходит чтение, запись файлов и иногда просто нападает лень переписывать  :lol: (как сегодня). Вот в одном месте сейчас поправил и использую QFile и т.д. Пробовал там же использовать fread все корректно работает. Может кто знает что с read-ом не так.
Записан
alex0303
Гость
« Ответ #7 : Май 19, 2006, 16:55 »

Файл не в текстовом режиме открываешь?
Записан
swizar
Гость
« Ответ #8 : Май 22, 2006, 11:08 »

Да спасибо большое за наводку. Не указывал при открытии файла _O_BINARY.
Хотя в Linux-e это було не обязательно и так разбирался. Но теперь на всякий случай буду всегда указывать конкретный тип файла (текст или бинарник).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.