Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Переменные

Автор: -Александр- 20.06.2008 0:03

Возможно ли сделать так, чтобы в TP7 не было ограничений по количеству переменных?

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

Автор: volvo 20.06.2008 0:54

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

Мажет быть есть и другие пути, например, уменьшение объема памяти, необходимого для хранения информации о каждом "теле", но это уже надо смотреть программу...

Автор: andriano 20.06.2008 3:06

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

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

Автор: Гость 20.06.2008 17:23

Цитата(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 20.06.2008 19:04

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

Автор: hardcase забыл пароль 20.06.2008 19:56

Компилятор сменить..... 21 век на дворе никак, а вы все в 16 разрядном режиме....

Автор: -Александр- 20.06.2008 22:54

Цитата(klem4 @ 20.06.2008 15:04) *

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


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

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

Автор: klem4 20.06.2008 23:20

Цитата
у меня возникают проблемы при работе с файлами


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

Автор: -Александр- 21.06.2008 0:22

Цитата(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 21.06.2008 0:36

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

Автор: Гость 21.06.2008 0:45

Цитата(klem4 @ 20.06.2008 20:36) *

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

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

Автор: Гость 21.06.2008 1:36

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

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

Автор: andriano 21.06.2008 2:29

Цитата(-Александр- @ 20.06.2008 21:22) *

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


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

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

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

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

Автор: Александр-7300 21.06.2008 14:20

Цитата(andriano @ 20.06.2008 23:29) *

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

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


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


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: andriano 21.06.2008 19:02

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

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

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

Автор: Александр-7300 21.06.2008 20:53

Цитата(andriano @ 21.06.2008 16:02) *

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


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

Как тогда сделать так что бы консоль во время работы не появлялась?

Автор: andriano 21.06.2008 22:27

Цитата(Александр-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 21.06.2008 23:23

Цитата(andriano @ 21.06.2008 19:27) *

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


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

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

Вопрос прямой: как избавиться от консоли?

Автор: andriano 21.06.2008 23:40

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

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

Автор: Александр-7300 21.06.2008 23:45

Цитата(andriano @ 21.06.2008 20:40) *

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

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


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

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


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: andriano 21.06.2008 23:55

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

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

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

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

Автор: Александр-7300 21.06.2008 23:57

Цитата(andriano @ 21.06.2008 20:55) *

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


А не подскажешь где в настройках она отключаеться

Автор: andriano 22.06.2008 1:59

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

Автор: Александр-7300 22.06.2008 15:13

Цитата(andriano @ 21.06.2008 22:59) *

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


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

И еще как сделать так чтобы в графическом режиме были русские слова а не эльфийские?

Автор: andriano 22.06.2008 18:00

Цитата(Александр-7300 @ 22.06.2008 12:13) *

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

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

Автор: Александр-7300 22.06.2008 23:13

Цитата(andriano @ 22.06.2008 15:00) *

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


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

Автор: volvo 22.06.2008 23:29

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

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

Автор: Александр-7300 22.06.2008 23:41

Цитата(volvo @ 22.06.2008 20:29) *

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


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

Автор: andriano 23.06.2008 0:00

Цитата(Александр-7300 @ 22.06.2008 20:13) *

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

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

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

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

Выходит, дело все-таки в использовании модулей, которые не знаешь, как работают.