Peter Schorn wrote:
- Procedure type assignment compatibility with specialized parameters
program prog2; { compile with gpc --mac-pascal prog2.pas } type baseType = object end;
derivedType = object(baseType) end;
procedure p1(x: baseType); begin end; procedure p2(x: derivedType); begin end; var pv: procedure(x: baseType); begin pv := p1; pv := p2; { error: incompatible types in assignment } end.
A similar problem occurs when using procedural parameters with untyped parameters:
program testsort1;
procedure qsort( const var data; membercount, membersize: sizetype; function comparator( const var e, f): cinteger); external name 'qsort';
type elementtype = integer;
function compare( const var i, j : elementtype): cinteger; begin if i = j then compare:= 0 else if i < j then compare:= -1 else compare:= +1 end;
const k = 10; var a: array[ 1..k] of elementtype value ( 4, 9, 6, 1 ,3, 4, 4, 6, 8, 7); n: integer; begin writeln( 'unsorted'); for n:= 1 to k do writeln( a[ n]); qsort( a, k, SizeOf( elementtype), compare); writeln( 'sorted'); for n:= 1 to k do writeln( a[ n]) end.
or the generic Pointer type:
program testsort2;
procedure qsort( pdata: pointer; membercount, membersize: sizetype; function comparator( p1, p2: pointer): cinteger); external name 'qsort';
type elementtype = integer; elementptr = ^elementtype;
function compare( p1, p2: elementptr): cinteger; begin if p1^ = p2^ then compare:= 0 else if p1^ < p2^ then compare:= -1 else compare:= +1 end;
const k = 10; var a: array[ 1..k] of elementtype value ( 4, 9, 6, 1 ,3, 4, 4, 6, 8, 7); n: integer; begin writeln( 'unsorted'); for n:= 1 to k do writeln( a[ n]); qsort( @a, k, SizeOf( elementtype), compare); writeln( 'sorted'); for n:= 1 to k do writeln( a[ n]) end.
The first program also shows another problem
program testsort1; {<- syntax error before `;'}
which may be due to a compiler problem with untyped "const var" parameters.
Regards.
Adriaan van OS