Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.26;
Скачать: CL | DM;

Вниз

проблема с параметром-массивом в процедуре   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
14-84652
bearoman
2003-06-10 12:11
2003.06.26
DELPHI 7 стоит ли переходить на него.


7-84808
new comer and co
2003-04-16 16:27
2003.06.26
эмуляция нажатия клавиш


1-84323
[BAD]Angel
2003-06-08 20:31
2003.06.26
Массив случайных не повторяющихся чисел


14-84621
DiamondShark
2003-06-04 12:09
2003.06.26
Supreme2 открыл сайт.


8-84464
JeskelA
2003-03-07 09:42
2003.06.26
Захват изображения рабочего стола