[Lazarus] QuickSort procedure - raised exception class 'External SIGSEGV'

Peter Williams pewilliams2010 at live.com
Mon Mar 14 05:29:36 CET 2011


Hi All,
I am trying to use some legacy Delphi QuickSort code.
The problem is that the original defines this var:  Var    d       : ptrArray Absolute da;and I have changed this in my version and it crashes with an error.
Project Island_maker.exe raised exception class 'External SIGSEGV'
I am trying to use my version of the code, not the original.
Original code ---Unit Qsort;
{
Copyright 1990 Trevor J CarlsenAll rights reserved.
Author:   Trevor J Carlsen          PO Box 568          Port Hedland WA 6721          A general purpose sorting Unit.

}
Interface
Type  updown   = (ascending,descending);  str255   = String;  dataType = str255;     { the Type of data to be sorted }  dataptr  = ^dataType;  ptrArray = Array[1..10000] of dataptr;  Arrayptr = ^ptrArray;  Const   maxsize  : Word = 10000;  SortType : updown = ascending; Procedure QuickSort(Var da; left, right : Word);
{============================================================================}Implementation Procedure swap(Var a,b : dataptr);  { Swap the Pointers }  Var  t : dataptr;  begin    t := a;    a := b;    b := t;  end;     Procedure QuickSort(Var da; left,right : Word);  Var    d       : ptrArray Absolute da;    pivot   : dataType;    lower,    upper,    middle  : Word;
  begin    lower := left;    upper := right;    middle:= (left + right) div 2;    pivot := d[middle]^;    Repeat      Case SortType of      ascending :  begin                     While d[lower]^ < pivot do inc(lower);                     While pivot < d[upper]^ do dec(upper);                   end;      descending:  begin                     While d[lower]^ > pivot do inc(lower);                     While pivot > d[upper]^ do dec(upper);                   end;      end; { Case }                          if lower <= upper then begin        { swap the Pointers not the data }        swap(d[lower],d[upper]);        inc(lower);        dec(upper);      end;    Until lower > upper;    if left < upper then QuickSort(d,left,upper);    if lower < right then QuickSort(d,lower,right);  end;  { QuickSort }
end.

My version-----Type  map_detail = record                 Terrain : Terrain_type;                 Terrain_char : char;                 description : string;                 x, y, location_number : integer;                 exits : exit_type;               end;
  island_single_type = array[ 1..(array_max_x * array_max_y) ] of                         map_detail;
Type  updown = (ascending, descending);
Const  SortType : updown = ascending;
var  Form1: TForm1;  max_x, max_y,  max_locations,  start_x, start_y,  finish_x, finish_y : integer;  island : island_2D_type;  island_single_array : island_single_type;
implementation
uses set_max;
{--------------------------------------------------------------------}
Procedure swap(Var a,b : map_detail);  { Swap the Pointers }  Var  t : map_detail;  begin    t := a;    a := b;    b := t;  end;{--------------------------------------------------------------------}
Procedure QuickSort( Var island_single_array : island_single_type;  left, right : integer);  Var    d       : island_single_type;    pivot   : integer;    lower,    upper,    middle  : integer;
  begin    lower := left;    upper := right;    middle:= (left + right) div 2;    pivot := island_single_array[middle].location_number;    Repeat      Case SortType of      ascending :  begin                     While island_single_array[lower].location_number < pivot do                       inc(lower);                     While pivot < island_single_array[upper].location_number do                       dec(upper);                   end;      descending:  begin                     While island_single_array[lower].location_number > pivot do                       inc(lower);                     While pivot > island_single_array[upper].location_number do                       dec(upper);                   end;      end; { Case }      if lower <= upper then      begin        { swap the Pointers not the data }        swap(d[lower],d[upper]);        inc(lower);        dec(upper);      end;    Until lower > upper;    if left < upper then      QuickSort(d,left,upper);    if lower < right then      QuickSort(d,lower,right);  end;  { QuickSort }{--------------------------------------------------------------------}----- 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20110314/efa6f459/attachment-0002.html>


More information about the Lazarus mailing list