|
Основной форум Сюда все проблемы связанные с программированием. |
07.12.2009, 00:40
|
#1
|
Оператор ЭВМ
Регистрация: 07.12.2009
Адрес: Мытищи
Сообщений: 44
Написано 6 полезных сообщений (для 6 пользователей)
|
Проблема с дробями, типом real и т.д....
Вот собственно код:
dre:=(sqrt(sqr(Xc[j]-Xc[i])+sqr(Yc[j]-Yc[i])));
Dre:Integer;
Пишет ошибкку что с двух сторон ":=" должен быть один тип... Что делать? Перевод всего в реал приносит в подарок кучу ошибок...
Функции округления не работают(Может подключить что-то надо? Ни Floor, ни Ceil)
На всякий случай(вдруг тупая ошибка)-
//Проработка и нарисовка шариков
Procedure drawCircus(sh:integer);
Var i:integer;
Var dre:integer;
begin
For i:=1 to sh do begin
for j:=1 to 4 do begin
dre:=(sqrt(sqr(Xc[j]-Xc[i])+sqr(Yc[j]-Yc[i])));
if d<10 then begin
dy[i]:=(yc[i])-(yc[J]-yc[i])/10*(10-dre);
dx[i]:=(xc[i])-(xc[J]-xc[i])/10*(10-dre);
dy[j]:=(yc[j])-(yc[i]-yc[j])/10*(10-dre);
dx[j]:=(xc[j])-(xc[j]-xc[j])/10*(10-dre);
end;
end;
if ((xc[i] < 10) OR (xc[i] > GetWidth - 20)) then dx[i]:=-dx[i];
if ((yc[i] < 8) OR (yc[i] > GetHeight - 15)) then dy[i]:=-dy[i];
if (xc[i] < 10) then xc[i] := 10 ;
if (yc[i] < 8) then yc[i] := 8 ;
if xc[i] > GetWidth - 20 then xc[i] := GetWidth - 20 ;
if yc[i] > GetHeight - 15 then yc[i] := GetHeight - 15;
if (xc[i]-(d div 2) <= x) and (y<=yc[i]) and (yc[i]<=y+30 )then
dx[i]:=-dx[i];
xc[i]:=xc[i]+dx[i];
yc[i]:=yc[i]+dy[i];
DrawEllipse(xc[i], yc[i], d, d);
end;
end;
Тупые Пиксели)
|
(Offline)
|
|
07.12.2009, 00:44
|
#2
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Проблема с дробями, типом real и т.д....
Квадратный корень (sqrt) всегда был и остается вещественной функцией, присваивать его напрямую к integer нельзя, только к real, или к integer, но через round(x:real) .
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.12.2009, 16:23
|
#3
|
Оператор ЭВМ
Регистрация: 07.12.2009
Адрес: Мытищи
Сообщений: 44
Написано 6 полезных сообщений (для 6 пользователей)
|
Ответ: Проблема с дробями, типом real и т.д....
Ок, перевёл всё в реал.
Ошибка в параметре 1(ошибка 2 раза):
dre:=sqrt(sqr(Xc[j]-Xc[i])+sqr(Yc[j]-Yc[i]));
DrawEllipse(xc[i], yc[i], d, d);
Если во втором я понимаю, то в первом-нет(
Насколько я понял, ему не нравится -sqr(Xc[j]-Xc[i])+sqr(Yc[j]-Yc[i]) (чем же это может не нравиццо?=) )
Ps.
Вторую решил добавлением
function round(x:real):integer;
begin
end;
...
DrawEllipse(round(xc[i]), round(yc[i]), d, d);
...
|
(Offline)
|
|
07.12.2009, 17:07
|
#4
|
ПроЭктировщик
Регистрация: 31.01.2007
Сообщений: 128
Написано 20 полезных сообщений (для 43 пользователей)
|
Ответ: Проблема с дробями, типом real и т.д....
В хэлпе к каждой функции описаны типы входных параметров. Читаем и наслаждаемся.
|
(Offline)
|
|
07.12.2009, 17:32
|
#5
|
Оператор ЭВМ
Регистрация: 07.12.2009
Адрес: Мытищи
Сообщений: 44
Написано 6 полезных сообщений (для 6 пользователей)
|
Ответ: Проблема с дробями, типом real и т.д....
Разобрался... Теперь надеюсь последняя ошибка...
Может быть у меня что-то не так, но шарики по экрану не летают. Появляется только поле и шарик в углу 0,0
program linux;
type Shariki=array[1..16]of real;
//основные
var i,j,a,b,c,x,y,d,key,i1,j1:integer;
//для шарикоф
var xc, yc, dx, dy: Shariki;
//Level
var lev,fl,sh:integer;
txt,keyt:string;
//Int To Sring
function inttostr(inttostr:integer):string;
begin
end;
function round(x:real):integer;
begin
end;
//Рисует поле
Procedure drawPole;
begin
SetColor(255, 255, 255);
FillRect(0, 0, GetWidth, GetHeight);
SetColor(0, 0, 0);
FillRect(0, 0, round(xc[1]), 4);
for j:=0 to b do begin
drawText('-',j*10,0);
drawText('-',j*10,GetHeight-10);
end;
for j:=0 to a do begin
drawText('|',5,j*10);
drawText('|',GetWidth-5,j*10);
end;
//Заполнение экрана чем-нибудь
for i:=1 to a-10 do begin
for j:=1 to b-1 do begin
drawText(txt,j*10,i*10);
txt:=txt+'.'
end;
end;
end;
//Проработка и нарисовка шариков
Procedure drawCircus(sh:integer);
Var i1,j1:integer;
Var dre:real;
begin
For i1:=1 to sh do begin
for j1:=1 to sh do begin
dre:=sqrt(sqr(round(xc[j1])-round(xc[i1]))+sqr(round(yc[j1])-round(yc[i1])));
if (dre<10.0)and(dre>0) then begin
dy[i1]:=(dy[i1])-(yc[J1]-yc[i1])/10*(10-dre);
dx[i1]:=(dx[i1])-(xc[J1]-xc[i1])/10*(10-dre);
dy[j1]:=(dy[j1])-(yc[i1]-yc[j1])/10*(10-dre);
dx[j1]:=(dx[j1])-(xc[j1]-xc[j1])/10*(10-dre);
end;
end;
if ((xc[i1] <= 10) OR (xc[i1] >= GetWidth - 20)) then dx[i1]:=-dx[i1];
if ((yc[i1] <= 8) OR (yc[i1] >= GetHeight - 20)) then dy[i1]:=-dy[i1];
if (xc[i1] < 10) then xc[i1] := 10 ;
if (yc[i1] < 8) then yc[i1] := 8 ;
if xc[i1] > GetWidth - 20 then xc[i1] := GetWidth - 20 ;
if yc[i1] > GetHeight - 15 then yc[i1] := GetHeight - 15;
xc[i1]:=xc[i1]+dx[i1]+0.05;
yc[i1]:=yc[i1]+dy[i1]+0.05;
DrawEllipse(round(xc[i1]), round(yc[i1]), d, d);
end;
end;
begin
a:=GetHeight div 10;
b:=GetWidth div 10;
d:=10;
x:=20;
y:=30;
xc[1]:=60;
yc[1]:=60;
dx[1]:=5;
dy[1]:=5;
xc[2]:=70;
yc[2]:=66;
dx[2]:=5;
dy[2]:=5;
xc[3]:=60;
yc[3]:=46;
dx[3]:=5;
dy[3]:=5;
xc[4]:=60;
yc[4]:=43;
dx[4]:=5;
dy[4]:=5;
dx[5]:=5;
dy[5]:=5;
dx[6]:=5;
dy[6]:=5;
sh:=6;
while KeyToAction(GetKeyClicked) <> GA_FIRE do begin
//Прорисовка поля
drawPole;
//Шарики
drawCircus(sh);
repaint;
end;
end.
Спасиб за ответы, начинаю ещё лучше разбираться...
PS.Я из принципов без картинок...
|
(Offline)
|
|
07.12.2009, 18:42
|
#6
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Проблема с дробями, типом real и т.д....
function inttostr(inttostr:integer):string;
begin
end;
function round(x:real):integer;
begin
end;
|
Это прямо так и написано в коде?
Так первая всегда будет давать 0 (точнее, неопределенное значение), а вторая ''.
Или функции всетаки как-то описаны?
|
(Offline)
|
|
07.12.2009, 21:17
|
#7
|
Оператор ЭВМ
Регистрация: 07.12.2009
Адрес: Мытищи
Сообщений: 44
Написано 6 полезных сообщений (для 6 пользователей)
|
Ответ: Проблема с дробями, типом real и т.д....
Прям так в коде...
Похоже я чего-то не понимаю. Где-то я такое на форуме видел. А как надо?
|
(Offline)
|
|
07.12.2009, 22:22
|
#8
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Проблема с дробями, типом real и т.д....
Ну так тело функции описать надо, чтобы она выполняла действия и возвращала значение.
Функции round в MP нет, но есть Trunc, правда она не округляет, а обрезает целую часть, но для графики можно использовать.
Для перевода int в String есть встроенная функция function IntegerToString(i:integer):String.
Так что никаких функций для этого самому писать не нужно.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.12.2009, 12:56
|
#9
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: Проблема с дробями, типом real и т.д....
trunc(1.5) = 2, прям как round
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:26.
|