Code:
I use this method in a mapping project to manipulate m-dimensional numeric arrays and numeric binary files as if both are (m, n)-dimensional arrays. I also use a variation of this method to store and retrieve two positive integer values in a single integer. An (m, n)-array is simply a matrix with "m" rows down and "n" columns across. An (m)-array can be substituted by setting it the size of m * n. Then specific values within the array can be set or retrieved by: Record number = Row * Array Width + Column Where: Row : is "down" in the M-dimension Array Width: is the number of elements in N-dimension Column: : is "right" in the N-dimension If the array is written out to a binary file specific records within the file can be accessed by: Record number = Row * (Array Width + 1) * Size of Value + (Column * Size of Value) Where: Size of Value: is the number of bytes required to store the value 1: is an alignment into the binary file This method can be used with binary files written by both (m)- and (m, n)-dimensional arrays. It can also be used to write to specific locations within the binary file. To store two values as a single value: Number = Value1 * Width + Value2 Where: Value1: is some number Width: is some known width Value2: is some number Width can be: number of bytes number of words number of columns width of a world some arbitrary number To retrieve the two values stored as a single value: Value1 = Number \ Width Value2 = Number MOD Width If you have questions, send me a personal message or start a thread in the support forum refering to this topic.
Code:
'Date : 4-24-2009 'Author : Walt Decker 'Subject : Single Dimension Numeric Arrays and Numeric Binary Files 'Topic : N-Arrays & Bin Files '===================================================================== 'Text ' Released to Public Domain by the author. ' I use this method in a mapping project to manipulate m-dimensional ' numeric arrays and numeric binary files as if both are (m, n)-dimensional ' arrays. I also use a variation of this method to store and retrieve two ' positive integer values in a single integer. ' An (m, n)-array is simply a matrix with "m" rows down and "n" columns across. ' An (m)-array can be substituted by setting it the size of m * n. Then ' specific values within the array can be set or retrieved by: ' Record number = Row * Array Width + Column ' Where: ' Row : is "down" in the M-dimension ' Array Width: is the number of elements in N-dimension ' Column: : is "right" in the N-dimension ' If the array is written out to a binary file specific records within ' the file can be accessed by: ' Record number = Row * (Array Width + 1) * Size of Value + (Column * Size of Value) ' Where: ' Size of Value: is the number of bytes required to store the value ' 1: is an alignment into the binary file ' This method can be used with binary files written by both (m)- and (m, n)-dimensional ' arrays. It can also be used to write to specific locations within the binary file. ' To store two values as a single value: ' Number = Value1 * Width + Value2 ' Where: ' Value1: is some number ' Width: is some known width ' Value2: is some number ' ' Width can be: ' number of bytes ' number of words ' number of columns ' width of a world ' some arbitrary number ' To retrieve the two values stored as a single value: ' Value1 = Number \ Width ' Value2 = Number MOD Width '================================================================================= ' If you have questions, send me a personal message or start a thread in the support ' forum refering to this topic. '================================================================================= #COMPILE EXE #BREAK ON DEFLNG A - Z FUNCTION PBMAIN () AS LONG LOCAL Rad AS SINGLE CONSOLE SET SCREEN 10, 20 CONSOLE SET LOC 200, 300 BmpWide = 72 BmpHigh = 72 WinWide = BmpWide ' width of window WinHigh = BmpHigh ' height of window AryWide = BmpWide - 1 ' n-elements in (m, n)-array AryHigh = BmpHigh - 1 ' m-elements in (m, n)-array Rad! = (4 * ATN(1)) / 180! ' value of radians for trig functions Dist = (AryWide \ 2) - 10 ' distance Cx = AryWide \ 2 ' column center Cy = AryHigh \ 2 ' row center DIM Map(AryWide * AryHigh) MAT Map() = CON(%BLUE) ' make all values blue '==================================================== ' DRAW A CIRCLE IN THE SINGLE DIMENSIONAL ARRAY. ' THIS DATA COULD ALSO BE WRITTEN DIRECTLY TO A ' BINARY FILE '===================================================== FOR I = 0 TO 360 X = Cx + Dist * SIN(I * Rad!) Y = Cy - Dist * COS(I * Rad!) Rec = Y * AryWide + X 'first equation above Map(Rec) = %WHITE NEXT I GRAPHIC WINDOW "test", 200, 100, BmpWide, BmpHigh TO WinHndl GRAPHIC ATTACH WinHndl, 0, REDRAW OPEN "FileTest.Tst" FOR BINARY AS #1 BASE = 0 X = 0 Y = 0 '===================================================== ' DRAW THE CIRCLE IN THE WINDOW AND STORE THE DATA ' IN A BINARY FILE '===================================================== FOR I = 0 TO AryHigh Row = I * AryWide 'first equation FOR J = 0 TO AryWide Rec = Row + J 'first equation GRAPHIC SET PIXEL (X, Y), Map(Rec) PUT #1, , Map(Rec) 'sequential write INCR X NEXT J INCR Y X = 0 NEXT I GRAPHIC REDRAW CONSOLE SET FOCUS PRINT "Press a key" WAITKEY$ '====================================================== ' RETRIEVE ONLY THE CIRCLE FROM THE BINARY FILE '====================================================== FOR I = 0 TO 360 X = Cx + Dist * SIN(I * Rad!) Y = Cy - Dist * COS(I * Rad!) Row = Y * (AryWide + 1) * 4 'second equation Rec = Row + (X * 4) 'second equation GET #1, Rec, Map(0) GRAPHIC SET PIXEL (X, Y), Map(0) AND 255 'change display color NEXT I GRAPHIC REDRAW CLOSE #1 KILL "FileTest.Tst" LOCATE 1, 1 COLOR 4, 7 PRINT "Press a key WAITKEY$ GRAPHIC WINDOW END END FUNCTION