Russian Qt Forum

Qt => Общие вопросы => Тема начата: swizar от Май 18, 2006, 16:17



Название: Вопрос по QtWin
Отправлено: swizar от Май 18, 2006, 16:17
Добрый всем день.
Столкнулся с такой проблемой. Под Win Qt-3.3.5.
После создания vc проекта с помощью
Код:

qmake -t vcapp roect.dsp proect.pro

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

Да все двоичные файлы, я читаю readBlock, а потом сам при не обходимости разбираю.


Название: Вопрос по QtWin
Отправлено: Admin от Май 19, 2006, 06:54
я не думаю что qmake умеет ставить выравнивание
придется ручками создавать проект

PS: обычно на выравнивании падает около sizeof(структура)
именно он дает разные результаты


Название: Вопрос по QtWin
Отправлено: alex0303 от Май 19, 2006, 09:00
Устанавливайте выравнивание/упаковку ручками и только там где вам надо.
Если Вы ставите его для всего проекта то те-же qt-header-ы ваш компиллер воспринимает с вашим выравниванием/упаковкой, а сама либа qt скомпилированна с другим, естественно что тут работать не будет. :)


Название: Вопрос по QtWin
Отправлено: swizar от Май 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 () и т.д.


Название: Вопрос по QtWin
Отправлено: DenKor от Май 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

Просто эту директиву надо делать по месту.
Я например делаю так.


Название: Вопрос по QtWin
Отправлено: alex0303 от Май 19, 2006, 11:35
Назад  выравнивание/упаковку возвращяйте.
Ну и можно (или желательно) пользовать:
#pragma pack(push, 1)
...
#pragma pack(pop)


Название: Вопрос по QtWin
Отправлено: swizar от Май 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-ом не так.


Название: Вопрос по QtWin
Отправлено: alex0303 от Май 19, 2006, 16:55
Файл не в текстовом режиме открываешь?


Название: Вопрос по QtWin
Отправлено: swizar от Май 22, 2006, 11:08
Да спасибо большое за наводку. Не указывал при открытии файла _O_BINARY.
Хотя в Linux-e это було не обязательно и так разбирался. Но теперь на всякий случай буду всегда указывать конкретный тип файла (текст или бинарник).