Этот пример демонстрирует использование импортированных модулей в Delphi. Показано обращение к модулю, создание, применение и передача динамических массивов. Файлы расположены в каталоге Samples\Delphi.

Параметры процедуры FloidSearchPath
N         - число вершин в графе.
W         - array [1..N,1..N] of Real.
            W[I,J]  -   вес  ребра,  идущего  из I в J. Граф может быть
            несимметричен. W[I,I]=0 для всех I.
S         - результат  работы.  True,  если  алгоритм сработал успешно,
            False если найден контур с   суммарным отрицательным весом.
D         - array [1..N,1..N] of Real.  D[I,J] - стоимость минимального
            пути из I в J.
P         - array [1..N,1..N] of Real.  P[I,J] - номер    предпоследней
            вершины в пути из I в J.

Сгенерированный при импорте модуль FloidUnit.Pas

unit FloidUnit;
interface
uses Math, Ap, Arrays1D, Arrays2D;

procedure FloidSearchPath(N : Integer; W : TReal2DArray; var S : Boolean; var D : TReal2DArray; var P : TInteger2DArray);

implementation

procedure FloidSearchPath(N : Integer; W : TReal2DArray; var S : Boolean; var D : TReal2DArray; var P : TInteger2DArray);
var
    I : Integer;
    J : Integer;
    M : Integer;
    A : Double;
label __Finalizing;
begin
    //Initializers
    W := TReal2DArray.Create(W);

    //Body
    D.SetBounds(1 , N , 1 , N);
    P.SetBounds(1 , N , 1 , N);
    i := 1;
    repeat
        j := 1;
        repeat
            p[i,j] := i;
            d[i,j] := w[i,j];
            j := j+1;
        until  not (j<=n);
        i := i+1;
    until  not (i<=n);
    m := 1;
    s := True;
    repeat
        i := 1;
        repeat
            j := 1;
            repeat
                a := W[i,m]+W[m,j];
                if a<w[i,j] then
                begin
                    if i=j then
                    begin
                        s := False;
                    end
                    else
                    begin
                        d[i,j] := a;
                        p[i,j] := p[m,j];
                    end;
                end;
                j := j+1;
            until  not ((j<=n) and s);
            i := i+1;
        until  not ((i<=n) and s);
        i := 1;
        repeat
            j := 1;
            repeat
                W[i,j] := D[i,j];
                j := j+1;
            until  not (j<=n);
            i := i+1;
        until  not (i<=n);
        m := m+1;
    until  not ((m<=n) and S);

    //Finalizers
__Finalizing:
    W.Destroy;
end;

end.


Файл Sample1.Dpr

program Sample1;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  FloidUnit in 'FloidUnit.pas',
  Math,
  Ap,
  Arrays1D,
  Arrays2D;

var
    N   :   Integer;
    W   :   TReal2DArray;
    S   :   Boolean;
    D   :   TReal2DArray;
    P   :   TInteger2DArray;

    I   :   Integer;
    J   :   Integer;
    T   :   Double;

    First, Last : Integer;
begin
    W := TReal2DArray.Create;
    D := TReal2DArray.Create;
    P := TInteger2DArray.Create;

    //установка размеров
    Write ( 'Enter N ' );
    ReadLn( N );
    if N<2 then
    begin
        WriteLn( 'Wrong N');
        ReadLn;
        Exit;
    end;
    W.SetBounds(1, N, 1, N);
    D.SetBounds(1, N, 1, N);
    P.SetBounds(1, N, 1, N);

    //ввод массива
    for I:=1 to N do
        W[I,I] := 0;
    for I:=1 to N do
      for J:=1 to N do
          if J>I then
          begin
              Write( 'W[', I, ' , ', J, ' ] = ');
              ReadLn( T );
              W[I,J] := T;
              W[J,I] := T;
          end;

    //расчёт
    FloidSearchPath(N, W, S, D, P);
    if not S then
    begin
        WriteLn( 'Wrong matrix' );
        ReadLn;
        Exit;
    end;

    //вывод указанного пути
    Write( 'First = ');
    ReadLn( First );
    Write( 'Last = ');
    ReadLn( Last );
    if (First<1) or (First>N) or (Last<1) or (Last>N) then
    begin
        WriteLn( 'Wrong first or last points');
        ReadLn;
        Exit;
    end;

    WriteLn( First );
    repeat
        WriteLn( P[Last, First] );
        First := P[Last, First];
    until First=Last;
    ReadLn;

    W.Free;
    D.Free;
    P.Free;
end.