From: DavMac AT iname DOT com (Davin McCall) Newsgroups: comp.os.msdos.djgpp Subject: Re: Help with array of structures in which I will make an array of one dimensional row pointers to... Date: Wed, 25 Aug 1999 16:05:43 GMT Organization: Monash Uni Lines: 68 Distribution: world Message-ID: <37c411ef.47141100@newsserver.cc.monash.edu.au> References: <199908250534 DOT BAA23515 AT delorie DOT com> NNTP-Posting-Host: damcc5.halls.monash.edu.au X-Trace: towncrier.cc.monash.edu.au 935597072 3828 130.194.198.138 (25 Aug 1999 16:04:32 GMT) X-Complaints-To: abuse AT monash DOT edu DOT au NNTP-Posting-Date: 25 Aug 1999 16:04:32 GMT X-Newsreader: Forte Free Agent 1.1/32.230 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com On Thu, 26 Aug 1999 06:21:38 -0700, "Dan Gold" wrote: >here we have my tile struct as it is so far: > >typedef struct TILE { > int type; > int src_x, src_y; >} TILE; > >Would a pointer to TILE point to the member "type" and add the offset >accordingly down the line as you reference the other members (meaning it >only used one 4 byte pointer) OR does it make 3 pointers each one to a >different member? Only one four-byte pointer. The other members, when they accessed, are done so by adding an offset to the pointer (this is done automatically by the compiler). >now If I allocate the data like so for all the tiles... >MAP * the_map; >the_map->dat = (TILE *)malloc(w * h * sizeof(TILE)); > >And since I want to be able to reference the data like a two dimensional >array I need a bunch of line pointers to get the correct offset for the >start of each row. So I then add a TILE * tile[0]; member to the MAP >structure so I can dynamically allocate all the line pointers at run time >when creating the memory for the MAP structure to hold the data as so (this >is done before the allocation of TILE data ofcourse). > >the_map = (MAP *)malloc(sizeof(MAP) + (sizeof(TILE) * h)); > >Now once I've assigned all the line pointers to the tile data at their >appropriote positions is I reference the tiles as: >the_map->tile[3][2]; // would the second array bracket offset by a TILE >meaning it would jump to the second tile. yes > Or would it offset the size of a >char like the line pointers in Allegro? This occurs because the line pointers are char pointers (or possibly void pointers). >. If they do offset to the next >tile, would it be faster to reference them by creating a pointer to every >single TILE in the map data, considering the compiler would have to offset >[2] with a multiplication of the size of TILE. Maybe, maybe not. The multiplication is not likely to cause a significant speed reduction so I wouldn't bother (especially as you will be saving memory, which can lead to speed increase in other ways, such as increased cache effectiveness). >Would compiler optimization change my struct to a size which could be bit >shifted, by the column value for the address? Can you view compiler >optimized code with the -s extension when compiling? Not by itself, though I stress that it's not such an important issue. Incidentally the TILE structure you gave above would normally be of size 8 bytes, which is a shift-left by three. Davin. __________________________________________________________ *** davmac - sharkin'!! davmac AT iname DOT com *** my programming page: http://yoyo.cc.monash.edu.au/~davmac/