forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Проблема с дробями, типом real и т.д.... (http://forum.boolean.name/showthread.php?t=11361)

VotapilD 07.12.2009 00:40

Проблема с дробями, типом 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;

Тупые Пиксели)

ViNT 07.12.2009 00:44

Ответ: Проблема с дробями, типом real и т.д....
 
Квадратный корень (sqrt) всегда был и остается вещественной функцией, присваивать его напрямую к integer нельзя, только к real, или к integer, но через round(x:real) .

VotapilD 07.12.2009 16:23

Ответ: Проблема с дробями, типом 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);
...

Bruteo 07.12.2009 17:07

Ответ: Проблема с дробями, типом real и т.д....
 
В хэлпе к каждой функции описаны типы входных параметров. Читаем и наслаждаемся.

VotapilD 07.12.2009 17:32

Ответ: Проблема с дробями, типом 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.Я из принципов без картинок...

ViNT 07.12.2009 18:42

Ответ: Проблема с дробями, типом real и т.д....
 
Цитата:

function inttostr(inttostr:integer):string;
begin
end;
function round(x:real):integer;
begin
end;
Это прямо так и написано в коде?
Так первая всегда будет давать 0 (точнее, неопределенное значение), а вторая ''.

Или функции всетаки как-то описаны?

VotapilD 07.12.2009 21:17

Ответ: Проблема с дробями, типом real и т.д....
 
Прям так в коде...
Похоже я чего-то не понимаю. Где-то я такое на форуме видел. А как надо?

ViNT 07.12.2009 22:22

Ответ: Проблема с дробями, типом real и т.д....
 
Ну так тело функции описать надо, чтобы она выполняла действия и возвращала значение.
Функции round в MP нет, но есть Trunc, правда она не округляет, а обрезает целую часть, но для графики можно использовать.
Для перевода int в String есть встроенная функция function IntegerToString(i:integer):String.
Так что никаких функций для этого самому писать не нужно.

abcdef 08.12.2009 12:56

Ответ: Проблема с дробями, типом real и т.д....
 
trunc(1.5) = 2, прям как round


Часовой пояс GMT +4, время: 15:10.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot