Работает такой вариант:
## Код:
```
MODULE MyDll;
(* sample module to be linked into a dll *)
IMPORT SYSTEM;
      
PROCEDURE ArrayIncrement*(VAR x: ARRAY [untagged] OF INTEGER; num: INTEGER);
VAR i: INTEGER;
BEGIN
 FOR i := 0 TO num - 1 DO
   INC(x[i]);
END;
END ArrayIncrement;
      
END MyDll.
```


Delphi:
## Код:
```
PROCEDURE ArrayIncrement(x: pointer; num: integer); stdcall; external 'MyDll.dll';

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
    a: array [0..4] of integer;
begin
  for i:= 0 to 4 do
  begin
      a[i] := 0;
  end;
  ArrayIncrement(@a[0], 5);
end;
```

После ArrayIncrement(@a[0], 5) все 5 элементов массива a равны 1.
Информация к размышлению:
1) Любой из вариантов описания процедуры ArrayIncrement:
## Код:
```
PROCEDURE ArrayIncrement(var x: array of integer; num: integer); stdcall; external 'MyDll.dll';
```

## Код:
```
PROCEDURE ArrayIncrement(x: array of integer; num: integer); stdcall; external 'MyDll.dll';
```
не проходит. После вызова процедуры слюбымnum, последний элемент массива aвсегдаравен 0(?!).
2) Вызов ArrayIncrement(@a[0], 500) не производит никакой исключительной ситуации(!);


> -- Цитата:
> И все равно, мне кажется, для любых данных, приходящих извне, надо использовать [untagged], мало ли какие побочные эффекты могут быть...
Действительно, вчера исходный пример вызывал исключение, а сегодня, после перекомпиляции, выдавал то же самое, что и у Trurl:
> -- Цитата:
> выводит 1 1 1 1 0