There seems to be subtle inconsistancies with accessing 'C' Arrays from PASCAL. I am concerned that array variables need to be treated differently than array parameters. Basically, variables need to be declared as arrays and parameters need to be declared as pointers to arrays.
I would have thought that if I declared a 'C' array variable to be a pointer, and a function parameter to be a pointer, that when I pass the variable to the function, PASCAL should pass a pointer. However, this is not the case for 'C' array variables.
The following code fragments demonstrate this: <<TEST.C>>
int carray[5] = {0x01010101,0x02020202,0x03030303,0x04040404,0x05050505}; int c1array[5] = {0x01010101,0x02020202,0x03030303,0x04040404,0x05050505};
void print_array(int *arr) { int i;
for (i=0; i < 5; i++) printf("%8X\n",arr[i]); }
<<ARRTEST.PAS>>
program ArrTest;
{$L test.c}
type CCARRAY = array[0..4] of Integer; CCARRAY_PTR = ^CCARRAY; var carray : __asmname__ 'carray' CCARRAY_PTR; c1array : __asmname__ 'c1array' CCARRAY; pas_arr : CCARRAY value ($01010101,$02020202,$03030303,$04040404,$05050505); p : CCARRAY_PTR;
procedure print_array(arr : CCARRAY_PTR); AsmName 'print_array';
begin p := &pas_arr; WRITELN('c array'); print_array(&carray); {this & seems wrong} WRITELN('c1 array'); print_array(&c1array); WRITELN('pascal array'); print_array(p); WRITELN('pascal array'); print_array(&pas_arr); end.
PASCAL treats 'C' arrays the same, irrespective of whether they are declared as a plain array or as a pointer to an array. The & operator is required to pass 'C' arrays to 'C' subroutines.
Alternatively, in my PASCAL declarations of 'C' functions, I could declare all 'C' array parameters to be VAR parameters. But this just doesn't seem right.
On another matter, I downloaded the latest binary of GPC (gpc-19980830.i386-djgppv201.zip). Now, I keep getting a linker error about crt0.o. How do I overcome this?
thanks Russell