User Tools

Site Tools


allocating_20arrays_20using_20the_20windows_20api

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
allocating_20arrays_20using_20the_20windows_20api [2018/04/17 15:01] – Added syntax highlighting tbest3112allocating_20arrays_20using_20the_20windows_20api [2024/01/05 00:22] (current) – external edit 127.0.0.1
Line 1: Line 1:
-=====Allocating arrays using the Windows API=====+=====Allocating arrays using the Windows or SDL 2.0 API=====
  
 //by Richard Russell, December 2006//\\ \\  You can allocate arrays, using **DIM**, either on BASIC's //heap// (global and PRIVATE arrays) or on the //stack// (LOCAL arrays). Using a combination of these will satisfy the needs of most programs. For example a skeleton program might be structured as follows:\\ \\  //by Richard Russell, December 2006//\\ \\  You can allocate arrays, using **DIM**, either on BASIC's //heap// (global and PRIVATE arrays) or on the //stack// (LOCAL arrays). Using a combination of these will satisfy the needs of most programs. For example a skeleton program might be structured as follows:\\ \\ 
Line 28: Line 28:
   - Destroy first array   - Destroy first array
   - Destroy second array   - Destroy second array
-\\  Because LOCAL arrays are allocated on the //stack// they can only be destroyed in the reverse order from which they were created.\\ \\  In these cases it is possible to utilise the capabilities of the **Windows API** to allocate and free the memory used by arrays. By setting BASIC's internal pointers to the allocated memory such arrays can be used exactly as if they were declared using **DIM**, but the restrictions on size and sequence of creation and destruction are removed.\\ \\  The routines listed below illustrate how this can be achieved. For simplicity a separate routine is listed for 1-dimensional and 2-dimensional arrays. It should be relatively easy to see how this can be extended to arrays with more dimensions:\\ \\ +\\  Because LOCAL arrays are allocated on the //stack// they can only be destroyed in the reverse order from which they were created.\\ \\  In these cases it is possible to utilise the capabilities of the **Windows or SDL 2.0 API** to allocate and free the memory used by arrays. By setting BASIC's internal pointers to the allocated memory such arrays can be used exactly as if they were declared using **DIM**, but the restrictions on size and sequence of creation and destruction are removed.\\ \\  The routines listed below illustrate how this can be achieved. For simplicity a separate routine is listed for 1-dimensional and 2-dimensional arrays. It should be relatively easy to see how this can be extended to arrays with more dimensions:  
 + 
 +**BBC BASIC for Windows:**
 <code bb4w> <code bb4w>
         DEF PROCdim1d(RETURN A(),S%,D1%)         DEF PROCdim1d(RETURN A(),S%,D1%)
Line 49: Line 51:
         ENDPROC         ENDPROC
 </code> </code>
 +
 +**BBC BASIC for SDL 2.0:**
 +<code bb4w>
 +      DEF PROCdim1d(RETURN A(),S%,D1%)
 +      LOCAL a%%
 +      SYS "SDL_malloc", 5+S%*(D1%+1) TO a%%
 +      IF @platform% AND &40 ELSE a%% = !^a%%
 +      ?a%%=1 : a%%!1=D1%+1
 +      PTR(A()) = a%%
 +      ENDPROC
 +
 +      DEF PROCdim2d(RETURN A(),S%,D1%,D2%)
 +      LOCAL a%%
 +      SYS "SDL_malloc", 9+S%*(D1%+1)*(D2%+1) TO a%%
 +      IF @platform% AND &40 ELSE a%% = !^a%%
 +      ?a%%=2 : a%%!1=D1%+1 : a%%!5=D2%+1
 +      PTR(A()) = a%%
 +      ENDPROC
 +
 +      DEF PROCundim(RETURN A())
 +      SYS "SDL_free", PTR(A())
 +      PTR(A()) = 0
 +      ENDPROC
 +</code>
 +
 In each case the parameters supplied to the **PROCdim** procedure are the name of the array to be created, the size (in bytes) of each array element and the array's dimension(s). The element size should be specified as follows:\\ \\  In each case the parameters supplied to the **PROCdim** procedure are the name of the array to be created, the size (in bytes) of each array element and the array's dimension(s). The element size should be specified as follows:\\ \\ 
  
allocating_20arrays_20using_20the_20windows_20api.1523977311.txt.gz · Last modified: 2024/01/05 00:18 (external edit)