Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2010, 21:48   #1
nexzis
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 48
По умолчанию массивы шариков

сказали сделать прогу массива шариков...прогу написал но столкнулся с проблемой
у меня в одном массиве 3 шарика в другом 2 и выдаёт ошибку при запуске:

"[Warning] Unit1.pas(78): FOR-Loop variable 'i' may be undefined after loop"
сломал всю голову что надо исправить но не получается может поможете чем нить...

вот программа

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
shape1: TShape;
shape2: TShape;
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
Shape3: TShape;
Shape4: TShape;
Shape5: TShape;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1; cw,ch: integer ;
rast,dist:real; p1,p2: Tpanel;
r1,r2:real;
x:array[1..3] of integer;
k:array[1..3] of integer;
S1:array[1..3] of Tshape;
S2:array [1..2] of Tshape;
const dx:array[1..3] of integer=(10,4,7);
implementation

function udar(i:integer) : boolean;
var x1,x2 :real;
begin
result :=false;
x1 := s1[i].left + r1;
x2 := s2[i].left + r2;
rast := s1[i].Width div 2 + s2[i].Width div 2; //расстояние между центрами
dist := abs(x1-x2);



if rast>=dist then result := true ;

end;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
S1[1]:=shape1 ; S1[2]:= shape4 ; S1[3]:= shape3;
S2[1]:=shape2; S2[2]:=shape5;
for i:=1 to 3 do

x[i]:= S1[i].left;
k[1]:=1;
k[2]:=1;
r1:=0.5*s1[1].width;
r2:=0.5*s2[1].width;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
for i:=1 to 3 do

s1[i].left:=s1[i].left+ k[i];
s2[i].Left:=s2[i].left - k[i];

if s1[i].left >= width - s1[i].width then k[i]:=-k[i];
if s2[i].left >= width - s2[i].width then k[i]:=-k[i];
if s1[i].left <= 0 then k[i]:=-k[i];
if s2[i].left <= 0 then k[i]:=-k[i];

if udar(i) then
begin
k[i]:=-k[i];

end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled:= not timer1.Enabled;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
s2[1].Visible:= not s2[1].Visible;
end;

end.
Вложения
Тип файла: zip Архив ZIP - WinRAR.zip (203.8 Кб, 9 просмотров)
nexzis вне форума Ответить с цитированием
Старый 01.11.2010, 22:46   #2
nexzis
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 48
По умолчанию

немного изменил код но ошибка просто переместилась вниз
Вложения
Тип файла: zip Архив ZIP - WinRAR.zip (204.0 Кб, 9 просмотров)
nexzis вне форума Ответить с цитированием
Старый 02.11.2010, 10:17   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

"[Warning] Unit1.pas(78): FOR-Loop variable 'i' may be undefined after loop"

Переменная(variable) I возможно (may be) неопределена(имеет неизвестное значание)(undefined) после цикла (after loop).
в операторах после окончания цикла используется переменная i для которой занчание не задано. Не хватает begin end для указания начала и конца цикла.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.11.2010, 11:28   #4
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Ты область действия цикла for укажи. У тебя он распространяется только на строку
Код:
s1[i].left:=s1[i].left+ k[i];
Вот так попробуй.
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
for i:=1 to 3 do
begin
s1[i].left:=s1[i].left+ k[i];
s2[i].Left:=s2[i].left - k[i];

if s1[i].left >= width - s1[i].width then k[i]:=-k[i];
if s2[i].left >= width - s2[i].width then k[i]:=-k[i];
if s1[i].left <= 0 then k[i]:=-k[i];
if s2[i].left <= 0 then k[i]:=-k[i];

if udar(i) then
begin
k[i]:=-k[i];

end;
end;
end;
Обрати внимание, что при обращении в цикле к S2[3], которое у тебя не определено вылетает ошибка обращения к памяти.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 02.11.2010, 17:34   #5
nexzis
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 48
По умолчанию

большое спасибо ..помогло
nexzis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Столкновение шариков в delphi vladlen1993 Помощь студентам 4 08.10.2010 15:11
Расчет столкновения шариков. belomorinka Общие вопросы Delphi 3 02.06.2009 18:54
Соударение шариков разных размеров и объемов Стаханов_Андрей Помощь студентам 3 09.03.2008 17:17