Помощь - Поиск - Пользователи - Календарь
Полная версия: Переменные
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
-Александр-
Возможно ли сделать так, чтобы в TP7 не было ограничений по количеству переменных?

P.S.Написал программу по моделированию движения тел под действие гравитационных сил, а максимум тел которые могу рассматривать всего лишь 140, а очень хочеться больше.
volvo
Цитата
Возможно ли сделать так, чтобы в TP7 не было ограничений по количеству переменных?
Я так понимаю, что вопрос связан с переполнением сегмента данных (данные статические)? Тогда переходи на использование динамической памяти. 640К больше чем 64К, правда?

Мажет быть есть и другие пути, например, уменьшение объема памяти, необходимого для хранения информации о каждом "теле", но это уже надо смотреть программу...
andriano
Чтобы не было никаких ограничений, сделать, естественно, невозможно в принципе. Но в разных случаях ограничения могут быть различными. Для твоих структур примерно так:
16-разрядный сегмент данных в реальном режиме - 140,
16-разрядный режим с динамической памятью - 1000,
16-разрядный защищенный режим - 30000,
32-разрядный режим при памяти 1 Гбайт - 2000000,

Вообще же, ты бы привел структуру данных, которой описываешь объект. Пол-килобайта навскидку кажется многовато для одного объекта.
Гость
Цитата(andriano @ 19.06.2008 23:06) *

Вообще же, ты бы привел структуру данных, которой описываешь объект. Пол-килобайта навскидку кажется многовато для одного объекта.


У меня в программе 3 графических модуля. Вот их нее верхушки с переменными:

const Nn1=10; dim1=3; N1=Dim1*2*Nn1; NPR=1; G_grav=6.67E-11;
var Yu,Y,D,YG:array [1..2*N1] of extended;
TPR:array [1..NPR] of extended;
M,R:array [1..Nn1] of extended;
i,ii,j,Pn1,hi,hi1,dn,n0,pp,pp1,PN,PH,BB,C,CLR,Nn,N05,dim,N:longint;
Hour,Minute,Second,Sec100:word;
sec:array [1..4] of extended;
Sm,Sm1,T,EPS,EPS1,H,P,Rr,U,Ek,E0,YY,RT0,RT,TR,t1,wd,dat,data,EUK,Xt,Yt,W:extende
d;
ch:char;
var Gd,Gm,Mx,My:integer;
Xpl,Ypl,D,N,C:longint;
Xkp,Ykp,Xkp0,Ykp0,Xp,Yp,Xc,Yc:extended;
Wxx,Wyy,Wx,Wy:array [1..2] of extended;
Xmax,Ymax,Xmin,Ymin:array [1..3] of extended;
Px,Py:array [1..2] of longint;
AT,AT0:string;
const Nn=300; dimm=4; Ntt=2;
var X,Y:array [1..Nn,1..dimm,1..Ntt] of extended;
Nc,Nt,Nt1:array [1..dimm,1..Ntt] of longint;
Dim,N,dtl,ij,J,T:longint;
AT0,AT1:string;
Ymax,Ymin,Xmax,Xmin,Wy,Wx,Wxx,Wyy,Xc,Yc:array [1..Ntt] of extended;
Xp,Yp:extended;
D,I:longint;
AT:string;

Вообще программа не просто моделирует систему из N тел, она расчитана для нахождения наилучшего времени для того чтобы сбить астероид движущийся к Земле(естественно астероид выдуманный smile.gif , но можно и реальный yes2.gif ). И естественно графика в программе достаточно сложная(1 универсальный модуль для построения любого числа графиков из любого количества точек(хоть миллион точек, хоть 10 миллионов), но построения ведется не вреальном времени, тоесть сначала вы передаете все точки модулю а после он только сроит. В торой модуль ведет построение тоже по точкам только в реальном времени и естественно как и предыдущий модуль автоматически масштабирует его. А вот третий модуль выводит на экран три проекции происходящего и трех мерное изображение).

Немного о переменных, наверное все знают что для того чтобы описать движение N под действием гравитационных полей друг друга надо решить систему состоящую из 2*N дифференциальных уравнений, при этом можно воспользоваться разными методами численного интегрирования(Гира, Рунг- Кутт 1-4).

Переменные которые служат для реализация Ронге Кутта 4 порядка:
const Nn=140; Количество тел
dim=3; Количество измерений(X,Y,Z)
N=Dim*2*Nn; Колличество дифференциальных уравнений
N05=Dim*Nn;
NPR=10;
var Y,D,YG:array [1..N] of extended;
TPR:array [1..NPR] of extended;
I,K1,NP:Longint;
T0,TT,TP,H1,H02,H03,H06,EPSM,X,Z,SIGMA,EPSZ,YI:extended;
Y0,D0,D02,D02X:array [1..N] of extended;
KH:boolean;

переменные для того чтобы описать тело
R[1..Nn];
M[1..Nn];

Скажу так если работать в программе без каково то не было графического интерфейса то количесво тел которые можно с моделировать равно 250.

И вот еще ты пишеш про динамическую память, как ее можно активировать в TP7,
Если я не ошибаюсь, то какую то память можно меня через глобальную директиву {$M}, это то или не то?
klem4
Бросается в глаза: много массивов of Extended, неужели настолько высокая точность нужна ? На них можно было-бы памяти сэкономить.
hardcase забыл пароль
Компилятор сменить..... 21 век на дворе никак, а вы все в 16 разрядном режиме....
-Александр-
Цитата(klem4 @ 20.06.2008 15:04) *

Бросается в глаза: много массивов of Extended, неужели настолько высокая точность нужна ? На них можно было-бы памяти сэкономить.


точность, да нужна очень высокая.

А насчет новых компиляторов, у меня возникают проблемы при работе с файлами, а она в программе очень интенсивно ведется, речь идет о FreePascal'е
klem4
Цитата
у меня возникают проблемы при работе с файлами


Это какие например ? Ты бы поконкретней.
-Александр-
Цитата(klem4 @ 20.06.2008 19:20) *

Это какие например ? Ты бы поконкретней.

Например в обычном TP7 вот эта простенькая программка работает спокойно, а вот во FreePascal'е пишит вот такую ошибку

RunTime error 2 at 0*0040105E
0*0040105E
0*004020F5

Сама программка

uses crt;
var a:longint;
begin
assign(input,'Y.txt');
reset(input);
readln(a);
writeln(a);
readkey;
end.

Что может быть не так7
klem4
попробуй скачать последнюю версию компилятора с оф. сайта.
Гость
Цитата(klem4 @ 20.06.2008 20:36) *

попробуй скачать последнюю версию компилятора с оф. сайта.

Все равно выдает ошибку, что делать?
Гость
Все проблема решена.

Но появился новый вопрос. Возможно ли сделать так чтобы когда активируется графический режим и рисуется графика, а мне к примеру нужно чтобы я в это время нажал любую кнопку, то для этого должна быть активна(лежать поверх графического окна)консоль, что естественно портит весь вид, вопрос заключаеться в том как сделать так чтобы можно было нажимать клавиши а при этом консоли на экране не было?
andriano
Цитата(-Александр- @ 20.06.2008 21:22) *

Например в обычном TP7 вот эта простенькая программка работает спокойно, а вот во FreePascal'е пишит вот такую ошибку
Это неправильная программа. Она не должна работать. Если она работат в ТР, то это ошибка ТР и ничего больше.


Добавлено через 2 мин.
Цитата(Гость @ 20.06.2008 22:36) *

Все проблема решена.

Но появился новый вопрос. Возможно ли сделать так чтобы когда активируется графический режим и рисуется графика, а мне к примеру нужно чтобы я в это время нажал любую кнопку, то для этого должна быть активна(лежать поверх графического окна)консоль, что естественно портит весь вид, вопрос заключаеться в том как сделать так чтобы можно было нажимать клавиши а при этом консоли на экране не было?

Для обработки клавиатуры консоль не нужна.
Александр-7300
Цитата(andriano @ 20.06.2008 23:29) *

Это неправильная программа. Она не должна работать. Если она работат в ТР, то это ошибка ТР и ничего больше.
Добавлено через 2 мин.

Для обработки клавиатуры консоль не нужна.


Тогда почему я могу использовать клавиатуру только тогда когда на экране весит консоль Смотри принскрин
andriano
Цитата(Александр-7300 @ 21.06.2008 11:20) *

Тогда почему я могу использовать клавиатуру только тогда когда на экране весит консоль Смотри принскрин

Потому, что твоя программа специально так написана.
Написана, вероятнее всего, не тобой, а автором тех модулей, что ты используешь для визуализации.
Александр-7300
Цитата(andriano @ 21.06.2008 16:02) *

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


Чего не знаешь, того не говори, если хочешь могу выложить исходники(если хочешь могу за комментировать каждую строчку!!!).

Как тогда сделать так что бы консоль во время работы не появлялась?
andriano
Цитата(Александр-7300 @ 21.06.2008 17:53) *
Как тогда сделать так что бы консоль во время работы не появлялась?
Не подключать лишних модулей (которые не знаешь, как работают).

Вот простенький пример.

uses Crt, Dos, Graph;

var
x,y : integer;
c : char;
InGraphicsMode : boolean; { Flags initialization of graphics mode }
PathToDriver : string; { Stores the DOS path to *.BGI & *.CHR }
GraphDriver : integer; { The Graphics device driver }
GraphMode : integer; { The Graphics mode value }
ErrorCode : integer; { Reports any graphics errors }
begin
DirectVideo := False;
PathToDriver := '';
GraphDriver := Detect; { use autodetection }
InitGraph(GraphDriver, GraphMode, PathToDriver);
ErrorCode := GraphResult; { preserve error return }
x := 320;
y := 240;
repeat
c := #0;
setcolor(12);
circle(x,y,30);
if keypressed then
c := readkey;
delay(10);
setcolor(0);
circle(x,y,30);
case c of
#72 : if y > 35 then dec(y,5);
#75 : if x > 35 then dec(x,5);
#77 : if x < 605 then inc(x,5);
#80 : if y < 445 then inc(y,5);
end;
until c = #27;
while keypressed do readkey;
CloseGraph;
end.

Александр-7300
Цитата(andriano @ 21.06.2008 19:27) *

Не подключать лишних модулей (которые не знаешь, как работают).


Я написал модули!!! И по твоему я в них ничего не понимаю?

Проблема в том что я пытаюсь портировать свою программу и свои модули из TP7 в FreePascal, что бы можно было использовать больше переменныхl!!!!!

Вопрос прямой: как избавиться от консоли?
andriano
см. мой пост выше. Консоль просто не нужно создавать.

У тебя консоль появляется в ТР или FP? Если FP, то под какую платформу компилируешь?
Александр-7300
Цитата(andriano @ 21.06.2008 20:40) *

см. мой пост выше. Консоль просто не нужно создавать.

У тебя консоль появляется в ТР или FP? Если FP, то под какую платформу компилируешь?


Консоль появляеться в FPS а компилирую под WIN32

И твой пример в FPS все равно работает только тогда когда поверх графического окна лежит консоль(см принскрин)
andriano
Цитата(Александр-7300 @ 21.06.2008 20:45) *

Консоль появляеться в FPS а компилирую под WIN32

И твой пример в FPS все равно работает только тогда когда поверх графического окна лежит консоль(см принскрин)

Значит, ты компилируешь не просто под Win32, а под Win32 Console, т.е. сам создаешь консоль (в установках компилятора), так чего же ты после этого хочешь?
Если тебе нужна консоль - пользуйся, если не нужна - не создавай.
Александр-7300
Цитата(andriano @ 21.06.2008 20:55) *

Значит, ты компилируешь не просто под Win32, а под Win32 Console, т.е. сам создаешь консоль (в установках компилятора), так чего же ты после этого хочешь?
Если тебе нужна консоль - пользуйся, если не нужна - не создавай.


А не подскажешь где в настройках она отключаеться
andriano
В командной строке не должно быть ключа -WC.
Александр-7300
Цитата(andriano @ 21.06.2008 22:59) *

В командной строке не должно быть ключа -WC.


Ты подрузомеваешь {-WC}?

И еще как сделать так чтобы в графическом режиме были русские слова а не эльфийские?
andriano
Цитата(Александр-7300 @ 22.06.2008 12:13) *

Ты подрузомеваешь {-WC}?
Гм...
Я говорю о командной строке запуска компилятора (в "родной" IDE не работаю, поэтому как ее настраивать не знаю).
А ты о чем? О директивах в тексте?
Цитата

И еще как сделать так чтобы в графическом режиме были русские слова а не эльфийские?
Я для этого пользовался собственными фонтами, которые, в свою очередь, выводились собственными же процедурами. На мой взгляд - так проще и универсальнее, т.к. не зависит ни от компилятора, ни от наличия на ПК русификатора (установки нужных региональных настроек). Подозреваю, что для конкретного компилятора будет проще подсунуть ему другой фонт, но сам этим никогда не занимался.
Александр-7300
Цитата(andriano @ 22.06.2008 15:00) *

Гм...
Я говорю о командной строке запуска компилятора (в "родной" IDE не работаю, поэтому как ее настраивать не знаю).


Тогда по подробней, где не должен находиться этот ключ
volvo
Цитата
И твой пример в FPS все равно работает только тогда когда поверх графического окна лежит консоль

Александр-7300, подключи WinCRT вместо CRT, и посмотри, что будет...
Александр-7300
Цитата(volvo @ 22.06.2008 20:29) *

Александр-7300, подключи WinCRT вместо CRT, и посмотри, что будет...


Спасибо! Спасибо! Все заработало good.gif !!!!!!(токо пропала функция clrscr, но это мелоч);
andriano
Цитата(Александр-7300 @ 22.06.2008 20:13) *

Тогда по подробней, где не должен находиться этот ключ

В командной строке компилятора.

Добавлено через 2 мин.
Цитата(Александр-7300 @ 22.06.2008 20:41) *

Спасибо! Спасибо! Все заработало good.gif !!!!!!(токо пропала функция clrscr, но это мелоч);

Выходит, дело все-таки в использовании модулей, которые не знаешь, как работают.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.