HardWareMan,ты щедрый на комментарии Но если я правильно понял то ты передаёшь не двумерный массив, ты передаёшь что-то вроде указателя.
КЭП. Все дело в том, что какому-то пи@#$у на заре х86 пришло в голову передавать параметры в процедуру или функцию через системный(!) стэк(!!) кода(!!!) вместо простого указателя ВР на кучу, где все, собственно, по факту и лежит. Естественно, туда не влезут все массивы, поэтому на большие структуры передаются указатели. Эту говноидею подхватили все компиляторописаки и вот мы имеет то, что мы имеем (класс сбоя/уязвимости "переполнение буфера", позволяющий исполнить код). Но это все лирика, да.
Спецификация же не позволяет создать функцию
void print(int a[][], int z)
что в с++ что в делфи. Но логично что это можно обойти и сделать что-то вроде этого
Да, объявить многомерный динамический массив как параметр функции не могу по причине ограничений компилятора (он требует "[Error] Unit1.pas(23): Identifier expected but 'ARRAY' found"). Но никто не мешает идентификатор сделать многомерным массивом, правда? В остальном ты прав, так делают все серьезные программисты, особенно кто пишет под систему и в особенности драйвера: передаем указатель(ли) и размер. Тому, кто работал с WINAPI это знакомо.
Mr2,точнее функций от подпрограмм что называют там процедурами. Функции там нужна для одного значения, а процедура для работы с несколькими. Что-то вроде различия между int (int a) и void (int a). При этом их нельзя путать, я поначалу путал помню в паскале, там одна из них (наверное функция) должна обязательно при этом возвращать значение...
Садись, два. Определение функци и процедуры звучит примерно так: функция возвращает
в себе результат, а процедура нет. Тем не менее, конструкции типо:
procedure MyProc(var A:dword; const B:word); и
function MyFunc(var A:dword; const B:word):boolean; будут одинаково возвращать результат в A (если А будет изменено внутри процедуры или функции), и использовать B как константу. Если
var не писать, то подразумевается
const. Функция в таком случае удобна тем, что может возвращать булево как признак ошибки. Например:
var A:string;
c:integer;
function GetBuf(var A:string;B:byte):boolean;
begin
GetBuf:=true;
case B of
0 : A:='Some 0';
1 : A:='Some 1';
else GetBuf:=false;
end;
end;
....
c:=0;
while GetBuf(A,0) do begin
writeln(A); inc(c);
end;
...