LINUX.ORG.RU

Проблема с 64 битами


0

0

Есть чужой код для работы с парадоксовскими таблицами, при компиляции на 64 битной системе работает не корректно:
/* void * are escaped for the 64bit machines
* otherwise they are too long (8bytes)
*/

typedef struct {
signed short recordSize; /* 0x00 */
signed short headerSize; /* 0x02 */
unsigned char fileType; /* 0x04 */
unsigned char maxTableSize; /* 0x05 */
unsigned int numRecords; /* 0x06 */
unsigned short usedBlocks; /* 0x0a */
unsigned short fileBlocks; /* 0x0c */
unsigned short firstBlock; /* 0x0e */
unsigned short lastBlock; /* 0x10 */
unsigned short dummy_1; /* 0x12 */
unsigned char modifiedFlags1; /* 0x14 */
unsigned char IndexFieldNumber; /* 0x15 */
/* void * */ unsigned int primaryIndexWorkspace; /* 0x16 */
/* void * */ unsigned int dummy_2; /* 0x1a */
<кусь>
unsigned short dummy_10; /* 0x76 */

char tableName[79]; /* ---- */
} px_header;

Вот так эту структуру программа заполняет:
int PXparseHeader(char *unp_head, px_header *header) {
int i = 0;
#ifdef DEBUG_HEAD_COPY
#define HEAD_COPY(x) \
copy_from_le(&(header->x), unp_head + i, sizeof(header->x)); \
if (sizeof(header->x) == 1) \
printf("Index: 0x%02x + %i (%s):\t %02x\n",i,sizeof(header->x),#x, header->x); \
else if (sizeof(header->x) == 2) \
printf("Index: 0x%02x + %i (%s):\t %04x\n",i,sizeof(header->x),#x, header->x); \
else if (sizeof(header->x) == 4) \
printf("Index: 0x%02x + %i (%s):\t %08x\n",i,sizeof(header->x),#x, header->x); \
else \
printf("Index: 0x%02x + %i (%s):\t %08x\n",i,sizeof(header->x),#x, header->x); \
i += sizeof(header->x);
#else
#define HEAD_COPY(x) \
copy_from_le(&(header->x), unp_head + i, sizeof(header->x)); \
i += sizeof(header->x);
#endif

HEAD_COPY(recordSize);
HEAD_COPY(headerSize);
HEAD_COPY(fileType);
HEAD_COPY(maxTableSize);
HEAD_COPY(numRecords);
HEAD_COPY(usedBlocks);
HEAD_COPY(fileBlocks);
HEAD_COPY(firstBlock);
HEAD_COPY(lastBlock);
HEAD_COPY(dummy_1);
HEAD_COPY(modifiedFlags1);
HEAD_COPY(IndexFieldNumber);
HEAD_COPY(primaryIndexWorkspace); /* pointer */
HEAD_COPY(dummy_2); /* pointer */
HEAD_COPY(indexRootBlock);
HEAD_COPY(indexLevels);
HEAD_COPY(numFields);
HEAD_COPY(primaryKeyFields);
<и далее по тексту>
Как сделать этот код одинаково работающим и под 64 бита, и под 32?

anonymous

попытайся заюзать определения типов из stdint.h

cvv ★★★★★
()

В общем, я на пару с немцами-авторами этого кода прогнал. Они сами увидели эту проблему:
/* void * are escaped for the 64bit machines
* otherwise they are too long (8bytes)
*/

А после этого использовали вот что:
file_index += read(fd, &ptr, sizeof(ptr));

где ptr это void *ptr;
Однако у парадокса все указатели 4-х байтные, вот и корежил мне структуру таблицы этот код, замена на 'file_index += read(fd, &ptr, 4);' помогла.

PS: Может кто подскажет более изящное решение?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.