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

Kevin Fishburne kevinfishburne at ...1887...
Mon Aug 12 06:35:46 CEST 2013


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

-------------- next part --------------
' 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


More information about the User mailing list