В общем, для проверки всех высказанных тут идей была состряпана библиотечка с таким кодом:
- Код: Выделить всё
#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" подобные массивы в сишных библиотеках встречаются сплошь и рядом.
У вас нет необходимых прав для просмотра вложений в этом сообщении.