BBC BASIC for Windows
« Variable storage in memory : Sub-Structures »

Welcome Guest. Please Login or Register.
Apr 5th, 2018, 10:10pm



ATTENTION MEMBERS: Conforums will be closing it doors and discontinuing its service on April 15, 2018.
Ad-Free has been deactivated. Outstanding Ad-Free credits will be reimbursed to respective payment methods.

If you require a dump of the post on your message board, please come to the support board and request it.


Thank you Conforums members.

BBC BASIC for Windows Resources
Online BBC BASIC for Windows documentation
BBC BASIC for Windows Beginners' Tutorial
BBC BASIC Home Page
BBC BASIC on Rosetta Code
BBC BASIC discussion group
BBC BASIC for Windows Programmers' Reference

« Previous Topic | Next Topic »
Pages: 1  Notify Send Topic Print
 thread  Author  Topic: Variable storage in memory : Sub-Structures  (Read 709 times)
Andy Parkes
Developer

member is offline

Avatar




PM

Gender: Male
Posts: 25
xx Variable storage in memory : Sub-Structures
« Thread started on: Jul 6th, 2015, 7:25pm »

Hi folks,

Structures can contain sub-structures, which can be integral to the container structure, or included from a structure prototype. E.g:

Code:
DIM Struct{Sub1{a, b}, Sub2{}=Protostruct{}}
 


Is it correct to assume that the format block for an integral sub-structure such as Sub1{}, will always follow immediately after its data block offset value? E.g:

[address of next member]Sub1{0[address of format block][offset into data block][format block for Sub1{}...]

Conversely, is it correct to assume that the format block of a sub-structure included from a prototype, will never be located immediately after its data block offset value?

If these assumptions are correct, am I right in thinking that this is sufficient for a program to be able to differentiate between an integral sub-structure and a prototype sub-structure?

Many thanks for your help

Andy
User IP Logged

rtr2
Guest
xx Re: Variable storage in memory : Sub-Structures
« Reply #1 on: Jul 6th, 2015, 8:27pm »

on Jul 6th, 2015, 7:25pm, Andy Parkes wrote:
Is it correct to assume that the format block for an integral sub-structure such as Sub1{}, will always follow immediately after its data block offset value?

To make a guarantee of that sort I would have to study the code of BB4W and work out what can happen in all possible circumstances. That's completely impractical I'm afraid; it's several years since the code was written and I no longer understand it in anything like the detail that would be needed.

So all I can suggest, which is no doubt what you have already done, is to try as many examples as you can to see if it seems always to be the case. If it does, you will have to decide whether the statistics give you enough confidence to rely on it.

Richard.
User IP Logged

Andy Parkes
Developer

member is offline

Avatar




PM

Gender: Male
Posts: 25
xx Re: Variable storage in memory : Sub-Structures
« Reply #2 on: Jul 7th, 2015, 10:06am »

Hi Richard,

Thanks very much for your reply.

Here is a program which randomly generates structures and tests them against the assumptions I made above. I have run it several times without encountering a problem. There might be less obvious exceptional cases that I have not thought of, otherwise the rule appears to be true.

Code:
      REM Random structure generator

      ON ERROR CLOSE#0 : PRINT REPORT$ : END

      nStruct% = 200
      tempFile$ = @tmp$ + "randomStructures.bbc"
      F% = OPENOUT(tempFile$)

      PROC_writeAsTok(F%, "DIM pFrmt%(" + STR$ nStruct% + ")")

      FOR Struct% = 1 TO nStruct%
        Name$ = "Struct" + STR$ Struct%
        Struct$ = FN_generateStruct(Name$)
        PROC_writeAsTok(F%, "DIM " + Struct$)
        PROC_writeAsTok(F%, "pFrmt%(" + STR$ Struct% + ") = !^" + Name$ + "{}")
      NEXT

      PROC_writeAsTok(F%, "nStruct% = " + STR$ nStruct%)
      RESTORE +1
      DATA "FOR I% = 1 TO nStruct%"
      DATA "IF NOT FN_structFormatAsAssumed(pFrmt%(I%)) PRINT "" GLOBAL Struct"";I%;"" not as expected!"""
      DATA "NEXT"
      DATA "PRINT ""Finished checking "";nStruct%;"" GLOBAL structures"""
      DATA "PROC_localStructs"
      DATA "END"
      DATA "DEF FN_structFormatAsAssumed(P%)"
      DATA "LOCAL L%, A%"
      DATA "P% += 4"
      DATA "REPEAT"
      DATA "L% = LEN $$(P% + 4)"
      DATA "IF ?(P% + 3 + L%) == &7B THEN"
      DATA "A% = !(P% + 5 + L%)"
      DATA "IF ?(P% + 1 + L%) == &69 THEN"
      DATA "IF A% <> P% + 13 + L% : =FALSE"
      DATA "ELSE"
      DATA "IF A% == P% + 13 + L% : =FALSE"
      DATA "ENDIF"
      DATA "IF NOT FN_structFormatAsAssumed(A%) : =FALSE"
      DATA "ENDIF"
      DATA "P% = !P%"
      DATA "UNTIL P% == 0"
      DATA "=TRUE"
      DATA ""

      REPEAT
        READ Line$
        PROC_writeAsTok(F%, Line$)
      UNTIL Line$ == ""

      PROC_writeAsTok(F%, "DEF PROC_localStructs")
      PROC_writeAsTok(F%, "LOCAL pfrmt%(), I%")
      PROC_writeAsTok(F%, "DIM pfrmt%(" + STR$ nStruct% + ")")
      FOR Struct% = 1 TO nStruct%
        Name$ = "struct" + STR$ Struct%
        PROC_writeAsTok(F%, "LOCAL " + Name$ + "{}")
        Struct$ = FN_generateStruct(Name$)
        PROC_writeAsTok(F%, "DIM " + Struct$)
        PROC_writeAsTok(F%, "pfrmt%(" + STR$ Struct% + ") = !^" + Name$ + "{}")
      NEXT

      RESTORE +1
      DATA "FOR I% = 1 TO nStruct%"
      DATA "IF NOT FN_structFormatAsAssumed(pfrmt%(I%)) PRINT "" LOCAL Struct"";I%;"" not as expected!"""
      DATA "NEXT"
      DATA "PRINT ""Finished checking "";nStruct%;"" LOCAL structures"""
      DATA "ENDPROC"
      DATA ""

      REPEAT
        READ Line$
        PROC_writeAsTok(F%, Line$)
      UNTIL Line$ == ""

      BPUT#F%,0
      BPUT#F%,&FF
      BPUT#F%,&FF
      CLOSE#F%

      SYS "ShellExecute", @hwnd%, "open", tempFile$, 0, 0, 1
      END



      DEF FN_generateStruct(name$)
      LOCAL s$, M%, N%, L%
      REPEAT
        s$ = name$ + "{"
  
        N% = RND(10) : REM number of members
        FOR M% = 1 TO N%
    
          REPEAT
            T% = RND(9) : REM member type
          UNTIL Struct% > 1 OR T% <> 2
    
          IF T% > 2 s$ += CHR$(96 + M%)
    
          CASE T% OF
            WHEN 1 : s$ += FN_generateStruct("i" + CHR$(96 + M%))
            WHEN 2 : s$ += "p" + CHR$(96 + M%) + "{}=Struct" + STR$(FN_rnd(Struct% - 1)) + "{}"
            WHEN 3 : s$ += "&"
            WHEN 4 : s$ += "%"
            WHEN 5 : s$ += "$"
            WHEN 6 : s$ += "%%"
            WHEN 7 : s$ += "#"
            WHEN 8 : s$ += "(1)"
          ENDCASE
    
          s$ += ","
    
          IF LEN s$ > 247 s$ = LEFT$(s$, L%) : EXIT FOR
          L% = LEN s$
    
        NEXT
      UNTIL L%
      =LEFT$(s$) + "}"



      DEF PROC_writeAsTok(F%, a$)
      LOCAL A%
      PRINT a$
      A% = EVAL("0:" + a$)
      a$ = $(!332 + 2)
      IF LEN a$ > 251 ERROR 100, "Line too long"
      BPUT#F%, LEN a$ + 4
      BPUT#F%, 0
      BPUT#F%, 0
      BPUT#F%, a$;
      BPUT#F%, &D
      ENDPROC



      DEF FN_rnd(N%)
      IF N% < 2 : =1
      =RND(N%)

 
User IP Logged

rtr2
Guest
xx Re: Variable storage in memory : Sub-Structures
« Reply #3 on: Jul 7th, 2015, 11:50am »

on Jul 7th, 2015, 10:06am, Andy Parkes wrote:
Here is a program which randomly generates structures and tests them against the assumptions I made above.

It runs here, and no exceptions were reported. You can replace the ShellExecute with a CALL to run the test code in the same process context if you want to:

Code:
      CALL tempFile$ 

Richard.
User IP Logged

Pages: 1  Notify Send Topic Print
« Previous Topic | Next Topic »

| |

This forum powered for FREE by Conforums ©
Terms of Service | Privacy Policy | Conforums Support | Parental Controls