2013-11-18 3 views
2

У меня есть 2 двумерных массива и функция.Массив как аргумент функции

Я хотел бы, чтобы эта функция принимала массив в качестве аргумента.

Я попытался следующий код:

var array1:array[1..10,1..10] of integer; 
    array2:array[1..20,1..10] of integer; 
function name(var my_array:array of array of integer, n:integer); 
function name(var my_array:array[1..n,1..10] of integer;const n:integer); 

Но я получил ошибки при попытке компиляции кода. Какие-нибудь советы?

Если вы хотите, чтобы я вставлял коды ошибок для каждой версии, пожалуйста, оставьте комментарий с запросом.

Для

function name(var my_array:array of array of integer, n:integer); 

Код ошибки: "несовместимый тип для агд. №: Got "Array [0..10] из массива [0..10] из SmallInt", как ожидается" Открытой массив спосо SmallInt»каждый раз, когда я вызываю функцию.

+0

Чтобы быть ясным, я не декларировал функцию в обоих направлениях в одно и то же время :). – James

ответ

1

Вы должны объявить свой собственный тип, а затем использовать этот тип в качестве параметра вашей функции. Вместо того чтобы передавать размерность массива, используйте Low и High функции от System , они будут работать как с статическими (предварительно объявленными), так и с динамическими массивами, а также избегать жестких размеров массивов и ite rators.

Вы хотите, чтобы избежать целых индексов с жестким кодированием, статические массивы becaue в Pascal не должны начинаться с индекса 0; следующее совершенно правовой Паскаля декларации массива, где границы массива являются из индекса -3 в 3:

var 
    Arr: array[-3..3] of Integer; 

Вот пример использования динамического массива (array of array of Integer), что петли через двухмерного массива и суммирует значения; он инициализирует массив 5 x 5, заполняет его данными и затем вызывает функцию SumTwoDimIntArray для суммирования значений.

program Project2; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

type 
    TTwoDimIntArray = array of array of Integer; 

function SumTwoDimIntArray(Arr: TTwoDimIntArray): Integer; 
var 
    i, j: Integer; 
begin 
    Result := 0; 
    for i := Low(Arr) to High(Arr) do 
    for j := Low(Arr[i]) to High(Arr[i]) do 
     Result := Result + Arr[i][j]; 
end; 

var 
    MyArr: TTwoDimIntArray; 
    i, j: Integer; 
begin 
    SetLength(MyArr, 5); 
    for i := Low(MyArr) to High(MyArr) do 
    begin 
    SetLength(MyArr[i], 5); 
    for j := Low(MyArr[i]) to High(MyArr[i]) do 
     MyArr[i][j] := j + 1; 
    end; 
    WriteLn(Format('Sum is %d', [SumTwoDimIntArray(MyArr)])); 
    ReadLn; 
end. 
1

В этих ситуациях вы используете новый тип. например:

Type 
    vector = array [1..20,1..20] of integer; 
var array1:vector; 
array2:vector; 
function name(var my_array:vector, n:integer); 
function name(var my_array:vector;const n:integer); 
Смежные вопросы