Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.024 c
4-84838
Silver_
2003-04-25 18:31
2003.06.26
Клаву


14-84667
Вопрошающий
2003-06-10 13:31
2003.06.26
Загадка природы


6-84496
Akni
2003-04-22 16:18
2003.06.26
Nonblocking Socket в отдельном потоке


11-84047
z00100
2002-09-28 04:34
2003.06.26
недопущение запуска второй копии программы


6-84484
Маришка
2003-04-07 16:02
2003.06.26
приложения клиент-сервер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский