Название: Вопрос по QtWin Отправлено: swizar от Май 18, 2006, 16:17 Добрый всем день.
Столкнулся с такой проблемой. Под Win Qt-3.3.5. После создания vc проекта с помощью Код:
По умолчанию стоит выравнивание на 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, не очень получается.
Я например делаю так: Код:
И чето не очень помогает. Во-первых идет куча Warning-ов, на использование pragma pack, во-вторых поведение программы все равно не стабильно. Причем падает на таких функциях как setPalette(), setGeometry () и т.д. добавлено спустя 4 минуты: Да я бы с удовольствием поставил выранивание только там где надо. В Linux-е я так и делаю, а Win, не очень получается. Я например делаю так: Код:
И чето не очень помогает. Во-первых идет куча 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 Спасибо за пример. Вроде получилось. Собралось бе дурацких предупреждений. Правда я все-таки написал так:
Код:
Раз уж тут такая фигня, то можно вопрос не по теме... Попробовал в 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 это було не обязательно и так разбирался. Но теперь на всякий случай буду всегда указывать конкретный тип файла (текст или бинарник). |