LB Booster
Programming >> Language extensions >> Arrays and REDIM
http://lbb.conforums.com/index.cgi?board=extensions&action=display&num=1430767627

Arrays and REDIM
Post by datwill on May 4th, 2015, 7:27pm

In the LBB help documentation, it says:
Quote:
You can create three- (and more) dimensional arrays using DIM, for example DIM array$(1,2,3,4), but you cannot subsequently resize the array using REDIM (you can, however, use REDIM with the original dimensions simply as a means of emptying the array).

Does it mean you can't redim ANY array (i.e. 1D, 2D ext.), because I've encountered some issue with my main menu of my game (I try to re-dimension a 1D array, but it seems to clear the array...). Or does it mean you cannot redim 3D+ arrays but can with 1D and 2D?
Re: Arrays and REDIM
Post by Richard Russell on May 4th, 2015, 10:10pm

on May 4th, 2015, 7:27pm, Daniel Atwill wrote:
Does it mean you can't redim ANY array (i.e. 1D, 2D ext.)

The documentation is correct. 1D and 2D arrays can be REDIMmed (as is of course essential for compatibility with LB 4.04) but 3D-or-greater arrays - which LB4 doesn't support so there's no compatibility issue - can't.

Quote:
I try to re-dimension a 1D array, but it seems to clear the array...

REDIM is supposed to clear the array, which is why it says it can be used to clear (but not change the dimensions of) a 3D array.

Richard.

Re: Arrays and REDIM
Post by tsh73 on May 5th, 2015, 07:18am

There is user-supplied RedimPreserve at
Passing Arrays
Re: Arrays and REDIM
Post by datwill on May 5th, 2015, 11:01am

Well yes, I guess it does clear it, but I do include code to fill it with appropriate file information after redimming it, but it comes out as clear in the combobox (which displays this info) in my main menu. There is the error of "Bad use of array" with the combobox (which means it is empty, i.e. no files found, which I will fix), but say I do have an item in the array, the combobox comes up with nothing in it (when you click the dropdown arrow, no item is present). Do any of you know why this could happen?
I just tested some more code to create a file before the game crashes, but I still come up with this weird error. Here's my whole code (which there probably will be multiple errors lurking around):
Code:
'Awakening v1.0.0's first coding day was 24/04/2015. The project was reworked on the 1/05/2015 and has been continued to
on error goto [crash]
nomainwin: struct profile, point as ushort, itemC as ushort, itemV as ushort, itemB as ushort, itemN as ushort, itemM as ushort, secretItem as boolean
global iconDir$, dd$, iconHandle
dd$ = DefaultDir$+"\"
iconDir$ = dd$+"bitmaps\icon.ico"
aboutFlags = _MB_ICONINFORMATION or _MB_OK or _MB_SETFOREGROUND
aboutGameFlags = _MB_ICONINFORMATION or _MB_OK or _MB_TOPMOST
open dd$+"data\extra\credit and copyright.txt" for input as #msg
while eof(#msg)=0
    input #msg, holder$
    if returnFeedCheck <> 0 then creditMsg$ += chr$(13)
    creditMsg$ += holder$
    returnFeedCheck += 1
wend
creditMsg$ += chr$(13)+chr$(13)+"You can find a better version of this list in the file entitled credits and copyright.txt in the data\extra folders.": close #msg
BackgroundColor$ = "160 96 52"
dim gameFilesInfo$(9, 9): dim fileList$(0)
[mainMenu]
gosub [refreshFileList]: refreshComboBoxFlag = 1
WindowWidth = 363: WindowHeight = 260
UpperLeftX = int((DisplayWidth-WindowWidth)/2): UpperLeftY = int((DisplayHeight-WindowHeight)/2)
button #main.default, "Play (Enter)", [gameSetup], UL, 5, 165, 170, 30
button #main.about, "About File", [aboutFile], UL, 180, 165, 170, 30
button #main.delete, "Delete", [deleteFile], UL, 5, 195, 170, 30
button #main.quit, "Quit", [quit], UL, 180, 195, 170, 30
combobox #main.gamefiles, fileList$(), [wait], 5, 135, 345, 30
bmpbutton #main.logo, dd$+"bitmaps\logo.bmp", [aboutGame], UL, 5, 5
open "Awakening" for dialog_popup as #main
hwin = hwnd(#main): #main "trapclose [quit] ; font ms_sans_serif bold 10"
#main.gamefiles "refresh": call applyIcon hwin
[wait]
wait

[aboutFile]
call getFileInfo
aboutMessage$ = "Animation Clip/Progress: ";profile.point.struct;chr$(13)+"Item at key C: "+word$("Sling Shot,Bow,Wand of Levitation,Wand of Mobility,Wand of Mobile Levitation,Tourches,Pendant of Agility,Pendant of Protection,Pendant of Smite,Stone Tablet", profile.itemC.struct, ",")+chr$(13)+"Item at key V: "+word$("Sling Shot,Bow,Wand of Levitation,Wand of Mobility,Wand of Mobile Levitation,Tourches,Pendant of Agility,Pendant of Protection,Pendant of Smite,Stone Tablet", profile.itemV.struct, ",")+chr$(13)+"Item at key B: "+word$("Sling Shot,Bow,Wand of Levitation,Wand of Mobility,Wand of Mobile Levitation,Tourches,Pendant of Agility,Pendant of Protection,Pendant of Smite,Stone Tablet", profile.itemB.struct, ",")+chr$(13)+"Item at key N: "+word$("Sling Shot,Bow,Wand of Levitation,Wand of Mobility,Wand of Mobile Levitation,Tourches,Pendant of Agility,Pendant of Protection,Pendant of Smite,Stone Tablet", profile.itemN.struct, ",")+ chr$(13)+"Item at key M: "+word$("Sling Shot,Bow,Wand of Levitation,Wand of Mobility,Wand of Mobile Levitation,Tourches,Pendant of Agility,Pendant of Protection,Pendant of Smite,Stone Tablet", profile.itemM.struct, ",")+chr$(13)+"You "+word$("don't do", profile.secretItem.struct+1)+" have "+word$("??? ????? ??????!,the stone tablet!", profile.secretItem.struct+1, ",")
aboutCaption$ = "About File "+nameOfFile$
calldll #user32, "MessageBoxExA", hwin as ulong, aboutMessage$ as ptr, aboutCaption$ as ptr, aboutFlags as long, 0 as word, r as long
wait

[deleteFile]
calldll #user32, "MessageBeep", _MB_ICONWARNING as long, r as boolean
confirmCaption$ = "Are you sure you want to delete file "+nameOfFile$+"?"
confirm confirmCaption$;r$
if r$ = "no" then wait
kill dd$+"data\"+nameOfFile$+".dat": gosub [refreshFileList]
wait

[aboutGame]
calldll #user32, "MessageBoxExA", hwin as ulong, creditMsg$ as ptr, "About Awakening!" as ptr, aboutGameFlags as long, 0 as word, r as long
wait

[gameSetup]
#main.gamefiles "contents? fileName$"
if val(gameFilesInfo$(0, 0))-1 <> 0 then
    for loopVar = 0 to val(gameFilesInfo$(0, 0))-1
        if fileName$ = fileList$(loopVar) then
            notice "This name has already been used! So Awakening will create the file for you."
            open dd$+"\data\"+fileName$+".dat" for output as #newfile
            #newfile "0"+chr$(13)+"0"+chr$(13)+"0"+chr$(13)+"0"+chr$(13)+"0"+chr$(13)+"0"+chr$(13)+"0"
            close #newfile
        end if
    next
end if
if nameOfFile$ = "" then notice "No file selected!"+chr$(13)+"There is nothing selected/typed in the combobox! Type in a file name not used to create a new file called the name typed, or select an existing file in the combobox list.": wait
call getFileInfo

[quit]
close #main
calldll #user32, "DestroyIcon", iconHandle as ulong, r as boolean
end

[crash]
crashMessage$ = Err$+" (Code: ";Err;")"+chr$(13)+"If you are having serious problems visit http://www.awakening_by_datwill310.com!"
crashFlags = _MB_ICONERROR or _MB_OK or _MB_TOPMOST
calldll #user32, "MessageBoxExA", hwin as ulong, crashMessage$ as ptr, "Awakening Crashed!" as ptr, crashFlags as long, 0 as word, r as long
end

[refreshFileList]
files dd$+"data\", "*.dat", gameFilesInfo$()
redim fileList$(val(gameFilesInfo$(0, 0))-1)
if val(gameFilesInfo$(0, 0))-1 <> 0 then
    for loopVar = 0 to val(gameFilesInfo$(0, 0))-1
        fileList$(loopVar) = left$(gameFilesInfo$(loopVar+1, 0), len(gameFilesInfo$(loopVar+1, 0))-4)
    next
end if
if refreshComboBoxFlag = 1 then #main.gamefiles "refresh"
if gameFilesInfo$(0, 0) = "0" then
    notice "There are no game files in the data directory!"+chr$(13)+"In order to continue, Awakening will need to make one game file."
    prompt "What do you wish to call your file?";newFileName$
    if newFileName$ = "" then notice "Awakening will quit!": goto [quit]
    open dd$+"data\"+newFileName$+".dat" for output as #newfile
    #newfile "0"+chr$(13)+"0"+chr$(13)+"0"+chr$(13)+"0"+chr$(13)+"0"+chr$(13)+"0"+chr$(13)+"0"
    close #newfile
end if
return

sub applyIcon windowHandle
    flag = _LR_LOADFROMFILE or _LR_DEFAULTSIZE: setIconFlag = 0 or 1
    calldll #user32, "GetWindowLongA", windowHandle as ulong, _GWL_HINSTANCE as long, hInst as ulong
    calldll #user32, "LoadImageA", hInst as ulong, iconDir$ as ptr, _IMAGE_ICON as long, 0 as long, 0 as long, flag as long, iconHandle as ulong
    calldll #user32, "SendMessageA", windowHandle as ulong, _WM_SETICON as long, setIconFlag as long, iconHandle as ulong, r as long
end sub

sub getFileInfo
    #main.gamefiles "selection? nameOfFile$"
    open dd$+"data\"+nameOfFile$+".dat" for input as #file
    input #file, profile.point.struct: input #file, profile.itemC.struct
    input #file, profile.itemV.struct: input #file, profile.itemB.struct
    input #file, profile.itemN.struct: input #file, profile.itemM.struct
    input #file, profile.secretItem.struct: close #file
end sub 

Re: Arrays and REDIM
Post by Richard Russell on May 5th, 2015, 1:05pm

on May 5th, 2015, 11:01am, Daniel Atwill wrote:
after redimming it, but it comes out as clear in the combobox

I don't see any RELOAD command in your program.

From the LB docs: "If some time later it becomes necessary to change the contents of the combobox, simply change the contents of the array and send a RELOAD command to the combobox".

Richard.

Re: Arrays and REDIM
Post by datwill on May 5th, 2015, 1:25pm

Dammit, I used refresh instead of reload angry angry sad sad Well, now I know...