[Gambas-user] segfault with insanely large array of structures

Jussi Lahtinen jussi.lahtinen at ...626...
Mon Aug 12 16:31:44 CEST 2013


Can you make this crash code into runnable project?

Jussi


On Mon, Aug 12, 2013 at 7:35 AM, Kevin Fishburne <
kevinfishburne at ...1887...> wrote:

> I know this code is horrible (it will be changed), but the following
> declarations and procedure raise a signal 11 and populate some of the array
> properties with non-zero values:
>
> ' Plan structures and array (server).
> Public Struct PlanBlockStructure ' Structure containing individual block
> data.
>   Created As Boolean      ' If block PWO has already been created.
>   Skin As Short           ' Block skin.
>   HeightCurrent As Single ' Current height in feet of block.
>   HeightTarget As Single  ' Target height in feet of block.
>   Grading As Boolean      ' If grading is required.
>   WorldX As Integer       ' Hard coordinates of block once construction
> has been initiated.
>   WorldY As Integer       ' Hard coordinates of block once construction
> has been initiated.
> End Struct
> Public Struct PlanStructure ' Structure containing individual plan data.
>   Block[300, 300] As Struct PlanBlockStructure
>   Stage As Byte       ' Current build stage (0 = design, 1 = clear and
> grade, 2 = wall construction, 3 = roofing construction, 4 = flooring
> construction, 5 = finished/maintenance).
>   CurrentX As Short   ' Current position in block array.
>   CurrentY As Short   ' Current position in block array.
>   GradeTo As Single   ' Elevation in feet to grade landscape to.
>   CenterX As Integer  ' Build site center coordinate.
>   CenterY As Integer  ' Build site center coordinate.
> End Struct
> Public Plan[2000] As Struct PlanStructure ' Architecutral plans.
>
> ' Plan maintenance (server).
> Public LastTime As Single = Timer ' Time last architectural plan was
> maintained.
>
> Public Sub Plan_Maintenance()
>
>   ' Maintain architectural plans.
>
>   ' General declarations.
>   Dim Index As Short        ' Plan to maintain.
>   Dim Elevation As Integer  ' Elevation of current tile in inches.
>   Dim Excavation As Integer ' Number of inches to excavate to match
> specified grade.
>
>   ' Check if plans are due to be updated.
>   If Timer < (LastTime + 0.1) Then Return
>   LastTime = Timer
>
>   ' Cycle through plans.
>   For Index = 0 To 1999
>
>     ' Check if plan stage requires maintenance.
>     If Plan[Index].Stage <> 0 Then
>
>       ' Check plan stage.
>       Select Case Plan[Index].Stage
>
>         ' Clear and grade.
>         Case 1
>           ' Advance position in plan to next position requiring grading.
>           Do Until Plan[Index].Block[Plan[Index].**CurrentX,
> Plan[Index].CurrentY].Grading
>             ' Increment X position in grid.
>             Plan[Index].CurrentX += 1
>             ' Check if X position needs wrapping.
>             If Plan[Index].CurrentX >= 300 Then
>               ' Wrap X position.
>               Plan[Index].CurrentX = 0
>               ' Increment Y position in grid.
>               Plan[Index].CurrentY += 1
>               ' Check if Y position needs wrapping.
>               If Plan[Index].CurrentY >= 300 Then
>                 ' Advance to next stage.
>                 Plan[Index].Stage += 1
>               Endif
>             Endif
>           Loop
>           ' Clear snow and vegetation depths.
> Tiles.Depth_Assign_Snow(Plan[**Index].Block[Plan[Index].**CurrentX,
> Plan[Index].CurrentY].WorldX, Plan[Index].Block[Plan[Index].**CurrentX,
> Plan[Index].CurrentY].WorldY, 0)
> Tiles.Depth_Assign_Vegetation(**Plan[Index].Block[Plan[Index].**CurrentX,
> Plan[Index].CurrentY].WorldX, Plan[Index].Block[Plan[Index].**CurrentX,
> Plan[Index].CurrentY].WorldY, 0)
>           ' Calculate hard elevation.
>           Elevation = Tiles.Depth_Get_Hard(Plan[**
> Index].Block[Plan[Index].**CurrentX, Plan[Index].CurrentY].WorldX,
> Plan[Index].Block[Plan[Index].**CurrentX, Plan[Index].CurrentY].WorldY)
>           ' Calculate excavation amount.
>           Excavation = Elevation - Plan[Index].GradeTo * 12
>           ' Grade landscape.
>           Tiles.Excavate(Plan[Index].**Block[Plan[Index].CurrentX,
> Plan[Index].CurrentY].WorldX, Plan[Index].Block[Plan[Index].**CurrentX,
> Plan[Index].CurrentY].WorldY, Excavation, True)
>           ' Mark block as graded.
>           Plan[Index].Block[Plan[Index].**CurrentX,
> Plan[Index].CurrentY].Grading = False
>
>         ' Wall construction.
>         Case 2
>
>         ' Roofing construction.
>         Case 3
>
>         ' Flooring construction.
>         Case 4
>
>         ' Finished/maintenance.
>         Case 5
>
>
>       End Select
>
>     Endif
>
>   Next
>
> End
>
> ' END OF CODE
>
> I attached the above code for better readability. It's notable that if the
> For...Next loop only addresses the first few indices of Plan[] that it
> works, which leads me to believe the array of structures is improperly
> allocated, probably due to its ridiculous size. The fact that some of the
> array property values read as non-zero before being assigned makes me think
> their pointers are pointing to out-of-process RAM being used by something
> else entirely. I suck at low-level programming so I'm just speculating
> ignorantly, sorry.
>
> --
> Kevin Fishburne
> Eight Virtues
> www: http://sales.eightvirtues.com
> e-mail: sales at ...1887...
> phone: (770) 853-6271
>
>
>
> ------------------------------------------------------------------------------
> Get 100% visibility into Java/.NET code with AppDynamics Lite!
> It's a free troubleshooting tool designed for production.
> Get down to code-level detail for bottlenecks, with <2% overhead.
> Download for free and get started troubleshooting in minutes.
> http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user
>
>



More information about the User mailing list