Results 1 to 9 of 9

Thread: "Restore" command replacement for thinbasic?

  1. #1

    "Restore" command replacement for thinbasic?

    I am looking for an alternative command (or similiar command) for a) "RESTORE" (from freebasic ) for thinbasic and if it's possible to convert a b) "READ$" command and c) "DATA" for thinbasic too. Some infos I place at the begin of script example. any help is appreciated here :-), bye largo

    ' Empty GUI script created on 09-04-2012 09:55:46 by  (thinAir)
    
    ' RESTORE (Label)
    ' "RESTORE" shows what saved Variables from DATA of next READ command can be read
    
    ' fictive pseudo code as followed (not working at all):
    
    Uses "console"
    
    Local x As Long, y As Long
    RESTORE lbar
    'Read x
    Console_Read x
    Print x
    
    RESTORE
    'Read x,y
    Console_Read x,  y
    Print x,  y
    
    RESTORE foo
    'Read x,y
    Console_Read x, y
    Print x, y
    
    DATA 1, 2
    foo:
    DATA 3
    
    lbar:
    DATA 4
    'Sleep
    waitkey
    '------------------ freebasic part ---------- //
    '
    ' result from freebasic:
    ' 4
    ' 1   2
    ' 3   4
    '
    
    Attached Images Attached Images
    Last edited by largo_winch; 04-09-2012 at 10:44.

  2. #2
    Senior Member Lionheart008's Avatar
    Join Date
    Sep 2008
    Location
    Germany, Bad Sooden-Allendorf
    Age
    51
    Posts
    934
    Rep Power
    109
    hi largo, perhaps you can split the command "restore" and try to build an module if there is no other way for converting a code example.

    I have not more closer knowledge about freebasic but if you have no other chance to convert split the command with sub or function to investigate what's behind it.

    my try for this way could be:

    "freebasic":

    DECLARE SUB restorey (a As Integer)  
    
    Dim As Long x,y,bar,foo,zero
    'RESTORE bar
    restorey bar
    READ x 'console_read (thinbasic)
    PRINT x
    
    restorey zero 'here's a unlikely problem!
    'RESTORE
    READ x, y 'console_read (thinbasic)
    PRINT x,y
    
    'RESTORE foo
    restorey foo
    READ x,y 'console_read (thinbasic)
    PRINT x,y
    
    DATA 1, 2
    foo:
    DATA 3
    bar:
    DATA 4
    sleep
    
    sub restorey (a As Integer)   
        Restore
    End Sub
    
    ' I don't know if there is a "optional byval" paramaeter for function/sub's
    

    2) other idea to ask in freebasic forum what's the task of "restore" command.

    best regards, frank
    Last edited by Lionheart008; 05-09-2012 at 12:14.
    you can't always get what you want, but if you try sometimes you might find, you get what you need

  3. #3
    Senior Member Lionheart008's Avatar
    Join Date
    Sep 2008
    Location
    Germany, Bad Sooden-Allendorf
    Age
    51
    Posts
    934
    Rep Power
    109
    again: I've found these infos from freebasic websites and my source code archives.. perhaps you can see what's the problem to convert a whole freebasic based function into thinbasic. better and easier to use a module for it, that's my personal opinion or find a fitted command that works with same power.

    "DataRestore" / problems are FBSYMBOL PTR and ASTNODE PTR, it won't be easy to convert this "types" for thinbasic.

    DECLARE FUNCTION rtlDataRestore _
        ( _
            BYVAL label AS FBSYMBOL PTR, _
            BYVAL afternode AS ASTNODE PTR  _ '= NULL
        ) AS INTEGER
    
    DECLARE FUNCTION rtlDataRead _
        ( _
            BYVAL varexpr AS ASTNODE PTR _
        ) AS INTEGER
    
    
    FUNCTION rtlDataRestore _
        ( _
            BYVAL label AS FBSYMBOL PTR, _
            BYVAL afternode AS ASTNODE PTR _
        ) AS INTEGER
    
        DIM proc AS ASTNODE PTR  = any, expr = any
        DIM expr AS ANY PTR
        DIM sym AS FBSYMBOL PTR  = any
    
        FUNCTION = FALSE
    
        proc = astNewCALL( PROCLOOKUP( DATARESTORE ), NULL )
    
        '' byval labeladdrs as void ptr
        IF( LABEL = NULL ) THEN
            sym = astGetFirstDataStmtSymbol( )
    
            '' blank RESTORE used before any DATA was found? damn..
            IF( sym = NULL ) THEN
                '' create an empty stmt, it should just contain a link to the next DATA
                expr = astDataStmtBegin( )
                astDataStmtEnd( expr )
                astDelNode( expr )
    
                sym = astGetFirstDataStmtSymbol( )
            END IF
    
        ELSE
            sym = astDataStmtAdd( LABEL, 0 )
        END IF
    
        expr = astNewADDROF( astNewVAR( sym, 0, FB_DATATYPE_BYTE ) )
        IF( astNewARG( proc, expr ) = NULL ) THEN
            EXIT FUNCTION
        END IF
    
        ''
        IF( afternode = NULL ) THEN
            astAdd( proc )
        ELSE
            astAddAfter( proc, afternode )
        END IF
    
        FUNCTION = TRUE
    
    END FUNCTION
    
    frank
    Last edited by Lionheart008; 05-09-2012 at 19:04.
    you can't always get what you want, but if you try sometimes you might find, you get what you need

  4. #4
    Super Moderator Petr Schreiber's Avatar
    Join Date
    Aug 2005
    Location
    Brno - Czech Republic
    Posts
    7,128
    Rep Power
    732
    Hi guys,

    I hate when this happens to me (I ask about solution of problem and I get response I solve wrong problem), but...

    I don't want to break the party, but I think the DATA, READ$ and RESTORE made sense mostly in legacy BASICs.

    As you can easily read files in ThinBASIC, I think it is much more systematic to separate data and application code, and save all you need to separate file.

    One of the possible approaches is to use INI file - you can have named sections (like labels in your code) and you can read data (name them as you need) from them.

    I attach supersimple example for you - it is not rework of the FB code above, but something to give idea.


    Petr
    Attached Files Attached Files
    Last edited by Petr Schreiber; 05-09-2012 at 20:44.
    Learn 3D graphics with ThinBASIC, learn TBGL!
    Windows 10 64bit - Intel Core i5-3350P @ 3.1GHz - 16 GB RAM - NVIDIA GeForce GTX 1050 Ti 4GB

  5. #5
    it's often a problem to convert "alien" basic language code example. Thanks to frank and petr for your example. Data and restore example is for me a constant problem as I have tried to converte code example from freebasic to thinbasic in general. I can approach a lot of other example too but that's not important here.
    I will check my problem here for converting freebasic stuff to thinbasic (better to powerbasic). load data that's not the problem but the restore probleme to make a new order for data read import files. nevertheless many thanks for frank and petr for your example and deeper knowledge. thinbasic is great. but to solve a problem with another problem (petr!) it's same stuff to make a magic function I don't know too (initkey and so one...). I am here to understand more about progamming language. and I am curious to know more about difference about powerbasic-thinbasic-freebasic and see what happens after knowing that with code example. thanks, bye, largo

  6. #6
    Hmmm...
    I'm not sure but DATA block is a sort of storage or container..
    so maybe is possible to use some sort of linked list to restore them.

  7. #7
    thinBasic MVPs
    Join Date
    May 2007
    Location
    UK
    Posts
    1,427
    Rep Power
    159

    Lightbulb Not everything is black and white apart from black and white

    Here is a rough idea that I am sure Petr or Eros could improve on.

    Simple idea is you put the data into an array and then call the restore command with a few parameters , pointer to the array, number of elements in the array and datatype size in bytes.

    Dim myData1(10) As Byte
    Dim myData2(10) As Word
    Dim pMyData1    As DWord
    Dim pMyData2    As DWord
    Dim a,b,c,d,e   As Byte
    Dim f,g,h,i,j   As Word
    
    
    Dim sMsg As String
    Dim Datasize1 As DWord
    Dim Datasize2 As DWord
    
    
    Mydata1(1) = 1,2,3,4,5
    Mydata2(1) = &h11AA,&h5522,&h3663,&h4CC4,&h578A
    'pMyData1 = VarPtr(MyData1(1))
    'pMyData2 = VarPtr(MyData2(1))
    
    
    Datasize1 = UBound(myData1)*SizeOf(Mydata1(1))
    Datasize2 = UBound(myData2)*SizeOf(Mydata2(1))
    
    
    sMsg  = "Data before : "+$CRLF(2)
    sMsg += "a = "+Hex$( a,SizeOf(a)*2 )+$CRLF
    sMsg += "b = "+Hex$( b,SizeOf(b)*2 )+$CRLF
    sMsg += "c = "+Hex$( c,SizeOf(c)*2 )+$CRLF
    sMsg += "d = "+Hex$( d,SizeOf(d)*2 )+$CRLF
    sMsg += "e = "+Hex$( e,SizeOf(e)*2 )+$CRLF(2)
    
    
    
    
    Restore(VarPtr(MyData1(1)), UBound(myData1), SizeOf(Mydata1(1)))
    Read(a,b,c,d,e)
    
    
    sMsg += "Data After :"+$CRLF(2)
    sMsg += "a = "+Hex$( a,SizeOf(a)*2 )+$CRLF
    sMsg += "b = "+Hex$( b,SizeOf(b)*2 )+$CRLF
    sMsg += "c = "+Hex$( c,SizeOf(c)*2 )+$CRLF
    sMsg += "d = "+Hex$( d,SizeOf(d)*2 )+$CRLF
    sMsg += "e = "+Hex$( e,SizeOf(e)*2 )+$CRLF(2)
    MsgBox 0, smsg
    
    
    
    
    sMsg  = "Data before : "+$CRLF(2)
    sMsg += "f = "+Hex$( f,SizeOf(a)*2 )+$CRLF
    sMsg += "g = "+Hex$( g,SizeOf(b)*2 )+$CRLF
    sMsg += "h = "+Hex$( h,SizeOf(c)*2 )+$CRLF
    sMsg += "i = "+Hex$( i,SizeOf(d)*2 )+$CRLF
    sMsg += "j = "+Hex$( j,SizeOf(e)*2 )+$CRLF(2)
    
    
    Restore(VarPtr(MyData2(1)), UBound(myData2), SizeOf(Mydata2(1)))
    Read(f,g,h,i,j)
    
    
    
    
    sMsg += "Data After :"+$CRLF(2)
    sMsg += "f = "+Hex$( f,SizeOf(f)*2 )+$CRLF
    sMsg += "g = "+Hex$( g,SizeOf(g)*2 )+$CRLF
    sMsg += "h = "+Hex$( h,SizeOf(h)*2 )+$CRLF
    sMsg += "i = "+Hex$( i,SizeOf(i)*2 )+$CRLF
    sMsg += "j = "+Hex$( j,SizeOf(j)*2 )+$CRLF(2)
    MsgBox 0, smsg
    
    
    Stop
    '
    '  Restore usage :
    '
    '  Restore(DataIn, Elements,DataSize )
    '  Datain   = the address of the array 
    '  Elements = the size of the array
    '  Datasize = the number of bytes for the datatype (byte=1,word=2,...)
    '                
    Function Restore(DataIn, Elements,DataSize )
    Static Data    As DWord
    Local  cParams As Long
    Local  flag     As Long
    
    
      Flag = 1
      cParams = Function_CParams 
      If CParams = 0 Then   Exit Function
      If (Function_CParams => 2) Then
        Data = DataIn
        Read(Flag, DataIn, Elements, Datasize)
      End If 
      
    End Function
                                   
    Function READ(Optional ByRef aa,ByRef bb,ByRef cc,ByRef dd,ByRef ee,ByRef ff,ByRef gg,ByRef hh,ByRef ii,ByRef jj,ByRef kk,ByRef ll)
    Static counter     As DWord
    Static Data        As DWord
    Static DataSize    As DWord
    Static Elements    As DWord 
    Local  cParam      As DWord
    Local  varList(12) As DWord
    Local  N, M        As DWord
                            
      cParam = Function_CParams  ' return the number of passed paramaters
    
    
      If aa = 1 Then
        Data     = bb
        Elements = cc
        Datasize = dd
        Counter  = 0
        Exit Function
      Else
        Incr n : VarList(n) =  VarPtr(aa)
        Incr n : VarList(n) =  VarPtr(bb)
        Incr n : VarList(n) =  VarPtr(cc)
        Incr n : VarList(n) =  VarPtr(dd)
        Incr n : VarList(n) =  VarPtr(ee)
        Incr n : VarList(n) =  VarPtr(ff)
        Incr n : VarList(n) =  VarPtr(gg)
        Incr n : VarList(n) =  VarPtr(hh)
        Incr n : VarList(n) =  VarPtr(ii)
        Incr n : VarList(n) =  VarPtr(jj)
        Incr n : VarList(n) =  VarPtr(kk)
        Incr n : VarList(n) =  VarPtr(ll)
        ReDim Preserve Varlist(CParam)      ' Clean up variable list
        For n = 1 To CParam ' Variable counter loop
          For M = 0 To Datasize-1
            If Counter > Elements Then Counter = 0
            Poke( VarList(n)+m, Peek( Data+Counter) )
            Incr counter 
          Next   ' m
        Next     ' n
      End If
    
    
    End Function
    
    Home Desktop : Windows 7 - Intel Pentium (D) - 3.0 Ghz - 2GB - Geforce 6800GS
    Home Laptop : WinXP Pro SP3 - Intel Centrino Duo - 1.73 Ghz - 2 GB - Intel GMA 950
    Home Laptop : Windows 10 - Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz, 2401 Mhz, 2 Core(s), 4 Logical Processor(s) - 4 GB - Intel HD 4400
    Work Desktop : Windows 10 - Intel I7 - 4 Ghz - 8GB - Quadro Fx 370

  8. #8
    Senior Member Lionheart008's Avatar
    Join Date
    Sep 2008
    Location
    Germany, Bad Sooden-Allendorf
    Age
    51
    Posts
    934
    Rep Power
    109
    my attempts failed to use a module for "Data", "restore" and "read". the problem is to write a command for "Data", that's not possible to make it with function or sub. "data" is old fasion. better you use array instead of antique basic commands or types.

    I've done a dummy convertion though. see my comments, largo. add the testfile in zip folder.

    @michael: looks good your idea

    Uses "restore2", "console"
    
    ' Empty GUI script created on 03-01-1999 01:54:28 by  (thinAir)
    Declare Function restore Lib "thinbasic_restore2.dll" Alias "restoreme" () As Long
    Declare Function read Lib "thinbasic_restore2.dll" Alias "readme" () As Long
    Declare Function data Lib "thinbasic_restore2.dll" Alias "datas" () As Long
    
    Declare Function LoadLibraryA Lib "Kernel32.dll" Alias "LoadLibraryA" _
        (lpLibFileName As Asciiz) As DWord
    
    Function TBMain () As Long
    Dim x As Long, y As Long
    Dim s As String
    Dim RetValue As Long
    
    MsgBox 0,"test load library"
    RetValue = LoadLibraryA("thinbasic_restore2.dll")
    MsgBox 0,"return code from LoadLibrary: " & Str$(RetValue)
    
    Console_WriteLine "the convertion failed here after some tests, sorry"
    
    MsgBox 0,"test1"
    restoreme 
    readme(x) 
    Console_WriteLine x
    MsgBox 0, Str$(x)
    
    MsgBox 0,"test2"
    'restoreme '(x) => restoreme(x) doesn't work
    readme(x) 
    readme(y) 
    MsgBox 0, Str$(x) + Str$(y)
    Console_WriteLine "result for x+y: " + Str$(x) + Str$(y)
    
    MsgBox 0,"test3"    
    restoreme
    readme(x)
    readme(y) 
    Datas 'this command is like a dummy because you have no chance to type in new values or chars
    
    ' a) DATA doesn't work in a function or sub, thats the main problem here!
    ' b) I have predefined these Data in my freebasic example: 
    ' 
    ' Data 1, 2
    ' foo:
    ' Data 3
    ' Bar:
    ' DATA 4
    
    MsgBox 0, "result3: " + Str$(x)+ Str$(y)
    Console_WriteLine "result3 for x+y with restore.. " + Str$(x)+ Str$(y)
    Console_WriteLine ""
    ' c) problem is that variable x + y doesnt catch the DATA from freebasic because they cannot
    ' be programmed like a simple command like "DATA" in a function for parsing
    Console_WriteLine "push a key to exit"
    
    WaitKey
    End Function
    
    regards, frank
    Attached Files Attached Files
    you can't always get what you want, but if you try sometimes you might find, you get what you need

  9. #9
    sorry for late reply. many thanks michael and frank for your help. I haven't found good solution for my problem, I can try to give an array to replace the strange restore or load data a chance , bye, largo

Similar Threads

  1. "macro" convert how into thinbasic?
    By largo_winch in forum Modules specific issues
    Replies: 3
    Last Post: 19-01-2012, 22:01
  2. googling for "thinbasic" strange links
    By largo_winch in forum General
    Replies: 1
    Last Post: 08-09-2011, 16:13
  3. thinBasic mentioned in "Webster's Quotations, Facts and Phrases"
    By Petr Schreiber in forum thinBasic where ...
    Replies: 0
    Last Post: 17-08-2010, 11:18
  4. thinBasic listed in "automation" page
    By ErosOlmi in forum thinBasic where ...
    Replies: 0
    Last Post: 13-02-2009, 12:23

Members who have read this thread: 0

There are no members to list at the moment.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •