Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Внизпроблема с параметром-массивом в процедуре Найти похожие ветки
← →
ghg (2003-06-16 09:57) [0]Значится так:
Есть объявление типов.
const Ntmax=1000; Mmax=4*Ntmax; Nmax=Medmax*1; Pmax=1;
type
At = array[1..Ntmax] of extended;
AM = array[1..Mmax] of extended;
AN = array[1..Nmax] of extended;
ANPP = array[1..Nmax+Pmax] of extended;
AP = array[1..Pmax] of extended;
AMNP = array[1..Mmax] of ANpP;
AMP = array[1..Mmax] of AP;
ANP = array[1..Nmax] of AP;
потом идет использование их в процедуре
procedure Ortholin1 (N,M,K:integer; u:AMNP; var X:ANP; eps:extended);
var
g,h,i,j,l,ll,mm : integer;
s,t : extended;
eps2,s0,s1,s2 : extended;
a : AMNP;
B : AMP;
p : AM;
px,pp : AN;
q : array[1..400] of extended;
label 2;
begin {Ortholin1}
...
end;{i}
Так вот перед входом в процедуру мы имеем правильное значение массива u:AMNP;
как только вошли в саму процедуру этот массив ничему не равняется вроде как вообще не определен.
Есть подозрение что Delphi воспринимает этот массив u:AMNP; как динамический и соответственно хочет чтобы я под него память выделял. Прав ли я?
Желательно обосновать.
p.s. сразу говорю писал не я и я так типы определять не стал бы, но копаться во внутренностях не охота.
← →
Skier (2003-06-16 10:01) [1]
> Есть подозрение что Delphi воспринимает этот массив u:AMNP;
> как динамический и соответственно хочет чтобы я под него
> память выделял. Прав ли я?
Вряд ли...
Такие большие массивы лучше передавать по ссылке, а не по значению, т.е.
procedure Ortholin1 (N,M,K:integer; var u:AMNP; var X:ANP; eps:extended); Не спасёт ?
← →
ghg (2003-06-16 10:11) [2]попробуем сейчас.
А вообще когда такое может быть, что до входа в процедуру переменная имеет определенное значение, а после входа в процедуру и передачи этой переменной в нее значение переменной становится неопределенным?
← →
Skier (2003-06-16 10:12) [3]>ghg © (16.06.03 10:11)
Много зависит от того, как ты вызываешь Ortholin1.
← →
ghg (2003-06-16 10:16) [4]эта процедура описана в отдельном модуле (в нем все мат. процедуры)
потом где-то там в головном модуле собственно идет вызов ее и подстановка соответствующих переменных.
Если еще какие подробности нужны то могу дать. :)
← →
Skier (2003-06-16 10:21) [5]>ghg © (16.06.03 10:16)
Вызов - это здесь самая главная "подробность".
От этой "печки" нужно плясать...
← →
Anatoly Podgoretsky (2003-06-16 10:25) [6]Ошибка в 17 строке.
← →
ghg (2003-06-16 10:35) [7]2Anatoly Podgoretsky © (16.06.03 10:25)
между прочим я не спрашивал в какой строке ошибка, и задавал
вопросы которые не связаны конкретно с определенным кодом.
:)
← →
Anatoly Podgoretsky (2003-06-16 10:44) [8]Зато тебя спрашивали
Skier © (16.06.03 10:12)
Skier © (16.06.03 10:21)
Но видимо ответ тебя не интересует.
← →
ghg (2003-06-16 10:52) [9]Ответ меня интересует, но я не понимаю что от меня просят.
Я могу привести весь код, но это много и вам будет не интересно разбираться.
Какие бывают различия в вызове какой-либо процедуры?
Ну идет код, в определенном месте пишется оператор вызова. В качестве параметров стоят какие-либо переменные. Это ведь всегда так. Как можно вызывать по другому?
Сорри если тупой вопрос.
← →
Anatoly Podgoretsky (2003-06-16 11:04) [10]Тебя просят показать как ты вызываешь Ortholin1 и необъодимые объявления переменных, без лишнего мусора.
← →
ghg (2003-06-16 11:15) [11]
unit inver;
Interface
uses Windows, SysUtils, LinMath, Global;
Procedure linver (nt:integer; fi,p1,r1,r2:At; id:ifprr;
nmed:integer; var med:medium; im:imedium;
var fit,p1t,r1t,r2t:At);
Implementation
Procedure linver (nt:integer; fi,p1,r1,r2:At; id:ifprr;
nmed:integer; var med:medium; im:imedium;
var fit,p1t,r1t,r2t:At);
var
M,N,P : integer;
a,b : extended;
AB : AMNP;
x : ANP;
begin
...
Ortholin1 (M,N,P, ab, x, 1e-10);
...
end;
end.
В свою очередь в dpr-файле идет вызов процедуры linver
program head;
{$APPTYPE CONSOLE}
uses global, inver;
var
InFile : text;
nt,nmed,iter,i,j,k : integer;
a : extended;
SSdu,SSp1,SSdfi : extended;
Sdu,Sp1,Sdfi,f,eps : extended;
fi,p1,r1,r2 : At;
fit,p1t,r1t,r2t,aa : At;
med : medium;
id : ifprr;
im : imedium;
begin
...
repeat
linver (nt, fi,p1,r1,r2, id, nmed, med, im, fit, p1t, r1t, r2t);
until ((f<=eps) or (k>=iter));
...
end.
← →
icWasya (2003-06-16 11:21) [12]к стати - локальные переменные процедуры занимают 50 MB, плюс по значению передаются ещё 10 MB - не слишком ли круто размещать такие объекты в стеке?
← →
Skier (2003-06-16 11:22) [13]var
M,N,P : integer;
a,b : extended;
AB : AMNP;x : ANP;
begin
...
Ortholin1 (M,N,P, ab, x, 1e-10);
...
end;
end.
ab нет в списке параметров linver !
← →
ghg (2003-06-16 11:37) [14]2icWasya © (16.06.03 11:21)
говорю же не я делал
2Skier © (16.06.03 11:22)
Ну нету и что.
этот массив заполняется в самой linver и потом передается в Ortholin1 (M,N,P, ab, x, 1e-10);
2all
так что нету криминала? ладно будем копаться сами
← →
Skier (2003-06-16 11:39) [15]>ghg © (16.06.03 11:37)
> Ну нету и что.
Не дурно !
> этот массив заполняется в самой linver и потом передается
> в Ortholin1 (M,N,P, ab, x, 1e-10);
В твоём коде этого не видно !
← →
Lord Warlock (2003-06-16 11:56) [16]я встречался с подобным месяца 4 назад, и решил эту проблему, правда не помню точно как и этого кода у меня уже нет :) попробую восстановить в памяти...
1. Использовал именно динамические массивы, но передавал не ссылку а адрес, те proc(.., @АВ,..) (только точно не помню, убрал потом @ или нет)
2. указание var было точно, без него массив теряется (похоже это противоречит п.1.)
3. Терялся не только массив но и значения формальных переменных, в качестве фактических значений еоторых указывались элементы динамического массива Proc(@A[1],@A[2]) (ну это залечилось указанием var перед формальными переменными)
ЗЫ для тех, кто пиннает за подобное :) я сам знаю что это изврат, но никак иначе в короткие сроки нельзя перевести на паскаль сложную расчетную программу, написанную на фортране в 198? году. К тому же в качестве фактических параметров нескольких функций использовались разные массивы
← →
ghg (2003-06-16 12:03) [17]>ЗЫ для тех, кто пиннает за подобное :) я сам знаю что это изврат, но никак иначе в короткие сроки нельзя перевести на паскаль сложную расчетную программу, написанную на фортране в 198? году. К тому же в качестве фактических параметров нескольких функций использовались разные массивы
во-во-во таже история с Фортраном
Ладно всем спасибо будем копаться.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.025 c