News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Arrays of Structures

Started by Astro, September 12, 2009, 01:48:32 AM

Previous topic - Next topic

Astro

 :bg

I feel like I'm starting to get somewhere now.

Sorry if I'm sounding like a broken record over this...

Given what has been said in the past regarding memory, etc.. if I wanted to increase the number of elements of t from 99 to 5000 progmatically, can it be done?

.386
.model flat,stdcall

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

TST struct
na dword ?
TST ends

TST2 struct
na dword ?
TST2 ends

.data?
t TST 99 dup (<>)
t2 TST2 50 dup (<>)

.data
a1 db "Array 1",0
a2 db "Array 2",0
a3 db "DELIMITER",0

.code

start:
int 3

mov ecx,0
mov dword ptr t.na[ecx],offset a1

mov ecx,1*sizeof TST
mov dword ptr t.na[ecx],offset a2

mov ecx,10*sizeof TST
mov dword ptr t.na[ecx],offset a1

mov ecx,5*sizeof TST
mov dword ptr t2.na[ecx],offset a1

push 0
push t.na
push t.na
push 0
call MessageBox

xor eax,eax
ret

end start


Best regards,
Astro.


hutch--

Astro,

You need to dynamically allocate memory to be able to resize it. Contrary to popular opinion, the old GlobalAlloc() API wth the GMEM_FIXED flag set is a good option for doing work like this. The "alloc" macro uses it. As usual you ensure the element size is a multiple of 4 or even 8 to ensure element alignment.

The trick is to set up an array of pointers to each element, there is a procedure in the MASM32 library that does this and I have posted a faster one some months ago. It can get a bit more complicated if you want to keep resizing the array but if they are only small, just create a new one and copy the elements from the old one into it. Then delete the old array.

PS: You are doing fine, all of this stuff is complicated.  :U
Download site for MASM32      New MASM Forum
https://masm32.com          https://masm32.com/board/index.php

sinsi

You can use GlobalAlloc to get your original 99, then you can use GlobalRealloc to resize it and keep the contents. HeapAlloc/HeapRealloc does the same (I think).
You tend to run out after about 2GB though...
Light travels faster than sound, that's why some people seem bright until you hear them.

daydreamer

Quote from: sinsi on September 12, 2009, 07:21:01 AM
You can use GlobalAlloc to get your original 99, then you can use GlobalRealloc to resize it and keep the contents. HeapAlloc/HeapRealloc does the same (I think).
You tend to run out after about 2GB though...

1:there is a XP hack, used by poser users, that allow for usage of 3gb
2:if you run a 64bit OS, your 32bit application can make full use of 4gb in emulation mode