В общем, для проверки всех высказанных тут идей была состряпана библиотечка с таким кодом:
- Код: Выделить всё
- #include <stdio.h>
 
 void printarr(int *arr, int count)
 {
 int i;
 
 for(i=0;i<count;i++)
 {
 printf("arr[%d] = %dn", i, arr[i]);
 }
 }
Компиляция:
gcc -Wall -fPIC -c lib.c
gcc -shared -o libcore.so lib.o
И две тестовые программки:
- Код: Выделить всё
- {$mode objfpc}{$h+}
 {Вариант №1.
 В процедуру сишной библиотеки передаётся
 указатель на первый элемент массива.}
 program test1;
 
 procedure printarr(arr: Pinteger; count: integer); cdecl; external 'libcore.so' name 'printarr';
 
 Var
 a: array[0..5] of integer;
 i: integer;
 
 Begin
 for i:=0 to 5 do
 a[i]:=i;
 
 i:=6;
 printarr(@a[0], i);
 
 End.
- Код: Выделить всё
- {$mode objfpc}{$h+}
 {Вариант №2.
 В процедуру сишной библиотеки передаётся
 сам массив.}
 program test2;
 
 procedure printarr(arr: array of integer; count: integer); cdecl; external 'libcore.so' name 'printarr';
 
 Var
 a: array[0..5] of integer;
 i: integer;
 
 Begin
 for i:=0 to 5 do
 a[i]:=i;
 
 i:=6;
 printarr(a, i);
 
 End.
Обе программы выдают один и тот же результат. Так что оба варианта рабочие.
Снег Север. Вполне возможно, что во второй версии компилятора передача открытого массива в сишную процедуру не поддерживалось, а в третьей проблему исправили.
Добавлено спустя 4 минуты 32 секунды:daesher писал(а):А есть ли вообще смысл передавать открытые массивы без указания const?
Риторический вопрос... 

 Я только делаю паскалевский заголовок для сишной библиотеки, а уж почему они там "const" не всунули - сии тайны мадридского двора мне неизвестны... 

 От себя могу сказать, что без "const" подобные массивы в сишных библиотеках встречаются сплошь и рядом.
У вас нет необходимых прав для просмотра вложений в этом сообщении.