delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1998/03/12/08:46:26

From: Ian Chapman <ichapman AT nortel DOT ca>
Newsgroups: comp.os.msdos.djgpp
Subject: PACKED situation
Date: Thu, 12 Mar 1998 07:33:45 -0500
Organization: Nortel
Lines: 96
Message-ID: <3507D629.73E2@nortel.ca>
Reply-To: ichapman AT nortel DOT ca
NNTP-Posting-Host: bcarib90.bnr.ca
Mime-Version: 1.0
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

Hi all,
	standard problem with PACKED taken from faq.
It's a bug in a version of djgpp which according to the faq s been fixed
in the djdev201.zip version.  The faq says that the structure gets
messed up.  I get the error below where the ";" is stated as missing. 
I've been running djdev201.zip derived files for about a year.  So
version should not be my problem.

 
typedef struct { 
  DWORD style; 
  DWORD dwExtendedStyle; 
  short x; 
  short y; 
  short cx; 
  short cy; 
  WORD  id; 
} PACKED DLGITEMTEMPLATE;  //Error ; missing after struct declaration.
From the FAQ
22.10 C++ doesn't pack structs!
===============================

**Q*: When I use `struct ffblk' from the header `dir.h' in a C++
program, I get garbage in some fields of the structure!*

*A* :  There is a known bug in GCC 2.7.2: the C++ compiler effectively
ignores the `__attribute__((packed))' directives, so the structures end
up being not packed.  DJGPP v2.01 comes with GCC 2.7.2.1 which corrected
that bug, so upgrade.  As a work-around, surround the declaration of the
structure that needs to be packed with `#pragma pack', like this:

       #ifdef __cplusplus
       #pragma pack(1)
       #endif
       .
       .
       .
       #ifdef __cplusplus
       #pragma pack()
       #endif

//=============================================================

	So I tried this and still get the error:-
#ifdef  __cplusplus
#pragma Pack(1)
#endif
typedef struct { 
  DWORD style; 
  DWORD dwExtendedStyle; 
  short x; 
  short y; 
  short cx; 
  short cy; 
  WORD  id; 
} PACKED DLGITEMTEMPLATE;  //Error ; missing after struct declaration.
#ifdef  __cplusplus
#pragma Pack()
#endif
//	So what have I done wrong?
	This is a part of structure.h file from cygnus which is all about
getting unix stuff running under win95.  I'm using the cygnus gnu
windows.h and associated files in place of MS as I think it's a more
appropriate starting point for what I'm doing.  Should I try  changing
the file names from dot.cpp to dot.cc?
====================================================

After looking in the mail archives I find this advice:-
//======================================================
  struct any {
                                long l1,l2 PACKED;
                                byte b: PACKED;
                                int i: PACKED;
                        };
            is WRONG. The correct way to do it is:
                        struct any {
                                long l1 PACKED;
                                long l2 PACKED;
                                byte b: PACKED;
                                int i: PACKED;
                        };
Assuming:-
#ifndef PACKED
    #ifdef __GNUC__
        #define PACKED  __attribute__ ((packed))
    #else
        #define PACKED
    #endif
#endif
//=================================================
	Quite a change, is this what I have to do.



	Hoping for some of that great help
		Regards Ian.

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019