[Implemented] Aligned structures

Got an idea for enhancing PureBasic? New command(s) you'd like to see?
User avatar
mback2k
Enthusiast
Enthusiast
Posts: 257
Joined: Sun Dec 02, 2007 12:11 pm
Location: Germany

[Implemented] Aligned structures

Post by mback2k »

It would be great if PB had a new built-in keyword for C-aligned structures, e.g.:

Code: Select all

Structure Test
  a.b ; 1 byte
  b.l ; 4 byte at offset 1
  c.w ; 2 byte at offset 5
  d.q ; 8 byte at offset 7
  e.l ; 4 byte at offset 15
EndStructure

StructureC Test
  a.b ; 1 byte
      ; 3 byte padding
  b.l ; 4 byte at offset 4 (= 4*1)
  c.w ; 2 byte at offset 8
      ; 6 byte padding
  d.q ; 8 byte at offset 16 (= 8*2)
  e.l ; 4 byte at offset 24
      ; 4 byte padding to fill the structure to size 32 (= 8*4)
EndStructureC
This would make the work with x64 structures a lot easier.

More information: http://en.wikipedia.org/wiki/Data_struc ... cts_on_x86
User avatar
mback2k
Enthusiast
Enthusiast
Posts: 257
Joined: Sun Dec 02, 2007 12:11 pm
Location: Germany

Post by mback2k »

Example for annoying x64 padding:

Code: Select all

Enumeration
  #MAX_ADAPTER_ADDRESS_LENGTH = 8
  #MAX_ADAPTER_DESCRIPTION_LENGTH = 128
  #MAX_ADAPTER_NAME = 128
  #MAX_ADAPTER_NAME_LENGTH = 256
EndEnumeration

Structure IP_ADDR_STRING
  *pNext
  IpAddress.b[16]
  IpMask.b[16]
  Context.l
EndStructure

Structure IP_ADAPTER_INFO
  *pNext
  ComboIndex.l
  AdapterName.b[#MAX_ADAPTER_NAME_LENGTH+4]
  Description.b[#MAX_ADAPTER_DESCRIPTION_LENGTH+4]
  AddressLength.l
  Address.b[#MAX_ADAPTER_ADDRESS_LENGTH]
  Index.l
  Type.l
  DhcpEnabled.l
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    PB_Alignment1.b[4]
  CompilerEndIf
  *CurrentIpAddress.IP_ADDR_STRING
  IpAddressList.IP_ADDR_STRING
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    PB_Alignment2.b[4]
  CompilerEndIf
  GatewayList.IP_ADDR_STRING
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    PB_Alignment3.b[4]
  CompilerEndIf
  DhcpServer.IP_ADDR_STRING
  HaveWins.l
  PrimaryWinsServer.IP_ADDR_STRING
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    PB_Alignment4.b[4]
  CompilerEndIf
  SecondaryWinsServer.IP_ADDR_STRING
  LeaseObtained.l
  LeaseExpires.l
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    PB_Alignment5.b[4]
  CompilerEndIf
EndStructure
The paddings are required because of the substructures, so this should also be supported by StructureC.

And another weird case:

Code: Select all

Structure IP4_ARRAY
  AddrCount.l
  AddrArray.l[1]
EndStructure

Structure IP6_ADDRESS
  IP6Dword.l[4]
EndStructure

Structure DNS_A_DATA
  IpAddress.l
EndStructure

Structure DNS_PTR_DATA
  *pNameHost
EndStructure

Structure DNS_TXT_DATA
  dwStringCount.l
  *pStringArray[0]
EndStructure

Structure DNS_AAAA_DATA
  Ip6Address.IP6_ADDRESS
EndStructure

Structure DNS_RECORD
  *pNext
  *pName
  wType.w
  wDataLength.w
  StructureUnion
    DW.l
    S.i
  EndStructureUnion
  dwTtl.l
  dwReserved.l
  StructureUnion
    A.DNS_A_DATA
    PTR.DNS_PTR_DATA
    CNAME.DNS_PTR_DATA
    TXT.DNS_TXT_DATA
    AAAA.DNS_AAAA_DATA
  EndStructureUnion
EndStructure
How would you align the StructureUnion substructures here?
User avatar
Josh
Addict
Addict
Posts: 1183
Joined: Sat Feb 13, 2010 3:45 pm

Re: Aligned structures

Post by Josh »

i searched for the idea StructureC and found this topic. would be fine and it would make many things easier
sorry for my bad english
User avatar
kenmo
Addict
Addict
Posts: 2033
Joined: Tue Dec 23, 2003 3:54 am

Re: Aligned structures

Post by kenmo »

I'm not 100% sure what you guys want...

but if I understand correctly, you can accomplish it with macros (like nearly everything it seems).

Code: Select all

Macro pad(number,bytes)
  _#number#.s{bytes}
EndMacro

Structure Test
  a.b       ; 1 byte
  pad(1,3)  ; 3 byte padding
  b.l       ; 4 byte at offset 4 (= 4*1)
  c.w       ; 2 byte at offset 8
  pad(2,6)  ; 6 byte padding
  d.q       ; 8 byte at offset 16 (= 8*2)
  e.l       ; 4 byte at offset 24
  pad(3,4)  ; 4 byte padding to fill the structure to size 32 (= 8*4)
EndStructure

Debug "Structure Size: " + Str(SizeOf(Test))
Debug ""
Debug "Offset of a: " + Str(OffsetOf(Test\a))
Debug "Offset of b: " + Str(OffsetOf(Test\b))
Debug "Offset of c: " + Str(OffsetOf(Test\c))
Debug "Offset of d: " + Str(OffsetOf(Test\d))
Debug "Offset of e: " + Str(OffsetOf(Test\e))
EDIT - oh, I think you guys want the compiler to pad certain structures automatically.... I see.
User avatar
Josh
Addict
Addict
Posts: 1183
Joined: Sat Feb 13, 2010 3:45 pm

Re: Aligned structures

Post by Josh »

@kenmo
it's not so simple, that you can use a macro

this structure you can use with c-structures

Code: Select all

Structure Test
  a.l
  b.w
  c.w
  d.l
Structure
in this case, you have to pad with an additional w

Code: Select all

Structure Test
  a.l
  b.w
  d.l
Structure
kenmo wrote:EDIT - oh, I think you guys want the compiler to pad certain structures automatically.... I see.
the compiler shouldn't fill in any padding variables, it should be use the correct offsets and sizes of structures to put and get structured data, written in other languages then pb.

i think many pb-users already failed, because they didn't know, that they can't simply use pb-structures for exchanging datas with other applications
sorry for my bad english
User avatar
inSANE
User
User
Posts: 10
Joined: Tue Nov 16, 2010 3:17 pm

Re: Aligned structures

Post by inSANE »

Any comments on this from the PB-Team?

Maybe you plan to implement an "auto-padding" version of the Structure command?
BorisTheOld
Enthusiast
Enthusiast
Posts: 542
Joined: Tue Apr 24, 2012 5:08 pm
Location: Ontario, Canada

Re: Aligned structures

Post by BorisTheOld »

I believe that any sort of auto-padding of structures is a bad idea.

Firstly, vendors of hardware and software all have their own ideas about this topic, so catering to one "standard" could create a nightmare for PB programmers.

Secondly, perhaps auto-padding is not appropriate for the situation. Having an undefined and undocumented field in a structure creates the potential for problems.

Thirdly, I believe that programmers should be more attuned to what's happening in their code. Therefore, they should be the ones adding any required padding to their structures. And they should document why they are doing it.
For ten years Caesar ruled with an iron hand, then with a wooden foot, and finally with a piece of string.
~ Spike Milligan
Thorium
Addict
Addict
Posts: 1305
Joined: Sat Aug 15, 2009 6:59 pm

Re: Aligned structures

Post by Thorium »

BorisTheOld wrote:I believe that any sort of auto-padding of structures is a bad idea.

Firstly, vendors of hardware and software all have their own ideas about this topic, so catering to one "standard" could create a nightmare for PB programmers.

Secondly, perhaps auto-padding is not appropriate for the situation. Having an undefined and undocumented field in a structure creates the potential for problems.

Thirdly, I believe that programmers should be more attuned to what's happening in their code. Therefore, they should be the ones adding any required padding to their structures. And they should document why they are doing it.
On x64 all WinAPI structures are aligned automaticly. Thats microsofts (VC++) standard. If you just copy a structure from MSDN it can lead to crashes in PB, because PB does not align the structure members.
There may be some software that still dont allign structure members, even if it's adviced to do so by Intel and AMD. (Variables should be aligned to a memory address dividable by the length of it's type. word = 2, long = 4, quad = 8 bytes)

To keep compatiblity with software interfaces that dont follow that rule there could be a keyword to create unaligned structures.
User avatar
Josh
Addict
Addict
Posts: 1183
Joined: Sat Feb 13, 2010 3:45 pm

Re: Aligned structures

Post by Josh »

Thorium wrote:To keep compatiblity with software interfaces that dont follow that rule there could be a keyword to create unaligned structures.
To keep backward compatibility to old PB code it would be better, that 'Structure' is what it is. If wished an aligned structure, there should be a other keyword, like StructureC or something like this.
sorry for my bad english
BorisTheOld
Enthusiast
Enthusiast
Posts: 542
Joined: Tue Apr 24, 2012 5:08 pm
Location: Ontario, Canada

Re: Aligned structures

Post by BorisTheOld »

I agree - the default should be "no alignment".

PB is a cross-platform language, therefore it should not default to the quirks of a particular platform or programming language.

And remember, not everyone interfaces with MS code. There are lots of other "standards".
For ten years Caesar ruled with an iron hand, then with a wooden foot, and finally with a piece of string.
~ Spike Milligan
User avatar
leonhardt
Enthusiast
Enthusiast
Posts: 220
Joined: Wed Dec 23, 2009 3:26 pm

Re: Aligned structures

Post by leonhardt »

Do you mean the record field allignment? that's the default compiler settings for both Delphi or VB,
type TRec=record
a:byte;
b:integer;
end;
then sizeof(TRec)=8,not 5,it would be greate if PB suport this as it will speed apps up,though you can do it manually.

Code: Select all

structure TRec
a.b
Empty1.w
Empty2.b
b.i
poor English...

PureBasic & Delphi & VBA
BorisTheOld
Enthusiast
Enthusiast
Posts: 542
Joined: Tue Apr 24, 2012 5:08 pm
Location: Ontario, Canada

Re: Aligned structures

Post by BorisTheOld »

leonhardt wrote:...it would be greate if PB suport this as it will speed apps up,though you can do it manually.
Support it, yes, but do not make it the default.
For ten years Caesar ruled with an iron hand, then with a wooden foot, and finally with a piece of string.
~ Spike Milligan
Thorium
Addict
Addict
Posts: 1305
Joined: Sat Aug 15, 2009 6:59 pm

Re: Aligned structures

Post by Thorium »

BorisTheOld wrote: And remember, not everyone interfaces with MS code. There are lots of other "standards".
It's not realy MS standard. It's Intel and AMD's standard and MS is following it. There are not a lot of standards if it comes to structure member alignment. You align or you dont align, thats it.
Post Reply