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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2012, 12:13   #1
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию Из TPoint в TRect

Приветствую всех! Есть следующий код:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
massivxy: array of TPoint;
massivobj: array of TRect;
i,k,n:integer
begin
k:=StrToInt(Edit1.Text);
n:=StrToInt(Edit2.Text);
SetLength(massivxy,k); //выделяем память для массива
for i:=0 to k do //Заполняем массив случайными значениями
begin
massivxy[i].X:=Random(9);
massivxy[i].Y:=Random(9);
end;
//Затем нужно переписать значения из TPoint в TRect пересчитывая их по формулам
SetLength(massivobj,k);
for i := 0 to k do
begin
massivobj[i].Left:=massivxy[i].X-n;
massivobj[i].Top:=massivxy[i].Y+n;
massivobj[i].Right:=massivxy[i].X+n;
massivobj[i].Bottom:=massivxy[i].Y-n
end;
..................................................
end;
Проблема в том, что на втором цикле, где идет попытка переписать значения из TPoint в TRect вылазит Access Violation at address 00529ACB.Write of Address 00000000. Вопрос: почему?
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 14.06.2012 в 12:18.
rainbow вне форума Ответить с цитированием
Старый 14.06.2012, 12:26   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
SetLength(massivxy,k); //выделяем память для массива
нумерация идет с 0 и заканчивается k-1.
Цитата:
for i := 0 to k do
перебираем 0(1),1(2), ..,k(??) в скобках считаем количество! перебранных.
чему будет равно ?? . правильно оно будет k+1.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 14.06.2012 в 12:30.
evg_m вне форума Ответить с цитированием
Старый 14.06.2012, 13:00   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

evg_m, +1

Код:
  SetLength(massivobj,k);
  for i := 0 to k-1 do
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.06.2012, 14:58   #4
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Спасибо за помощь, сделал так, но почему то, если n>0, то вылазит ошибка: list index out of bounds (-1) (-2 и т.п. на сколько n>0).
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Старый 14.06.2012, 15:28   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
сделал так
Исправил что-то, давай исправленный код. И вопросы задавай по новому коду.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.06.2012, 15:44   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

evg_m, +100500!
точно!

не поленился. проверил код:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  massivxy: array of TPoint;
  massivobj: array of TRect;
  i, k, n: integer;
begin
  k := 10;
  n := 4;
  SetLength(massivxy, k); //выделяем память для массива
  for i := 0 to k-1 do //Заполняем массив случайными значениями
  begin
    massivxy[i].X := Random(9);
    massivxy[i].Y := Random(9);
  end;
  //Затем нужно переписать значения из TPoint в TRect пересчитывая их по формулам
  SetLength(massivobj, k);
  for i := 0 to k-1 do
  begin
    massivobj[i].Left := massivxy[i].X - n;
    massivobj[i].Top := massivxy[i].Y + n;
    massivobj[i].Right := massivxy[i].X + n;
    massivobj[i].Bottom := massivxy[i].Y - n
  end;
  ShowMessage('Всё получилось!');

  SetLength(massivxy, 0); //очистим массив massivxy
  SetLength(massivobj, 0); //очистим массив massivobj
end;
как и следовало ожидать, всё работает!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.06.2012, 07:05   #7
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Странно, но ошибка вылетает, даже try except не помогает.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
a,b,i,j,l,n,k:integer;
massivobj: array of TRect;
massivxy: array of TPoint;
col,colexept,result1: array [0..9] of integer;
begin
k:=UpDown2.Position;
n:=UpDown3.Position; //считываем расстояние N
SetLength(massivxy, k); //выделяем память для массива
  for i := 0 to k-1 do //Заполняем массив случайными значениями
  begin
    massivxy[i].X := Random(9);
    massivxy[i].Y := Random(9);
  end;
SetLength(massivobj,k); //выделяем память для массива
for i := 0 to k do
begin
massivobj[i].Left:=massivxy[i].X-n;
massivobj[i].Top:=massivxy[i].Y+n;
massivobj[i].Right:=massivxy[i].X+n;
massivobj[i].Bottom:=massivxy[i].Y-n;
end;
end;
Причем, если второй цикл убрать из кода, ошибка вылазить перестает.
PS. Разобрался в чем проблема, буду думать как её решить.
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 15.06.2012 в 07:22.
rainbow вне форума Ответить с цитированием
Старый 15.06.2012, 09:13   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
SetLength(massivobj,k); //выделяем память для массива
for i := 0 to k do
Это называется исправил!
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 15.06.2012, 09:19   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

А почему Вы игнорируете то, что Вам пишут?
У Вас ТА ЖЕ САМАЯ ошибка с индексом, о которой Вам толкуют на протяжении всей темы!!!

Цитата:
Код:
SetLength(massivxy, k); //выделяем память для массива
  for i := 0 to k-1 do //Заполняем массив случайными значениями
  begin
    massivxy[i].X := Random(9);
    massivxy[i].Y := Random(9);
  end;
SetLength(massivobj,k); //выделяем память для массива
for i := 0 to k - должно быть K-1 do
begin
massivobj[i].Left:=massivxy[i].X-n;

добавлено

Цитата:
Сообщение от evg_m
Это называется исправил!
Ага. Такое впечатление, что мы непонятно объясняем.. или автор топика не читает то, что ему пишут и пытается решить свои проблемы сам. А форум его только отвлекает...

Последний раз редактировалось Serge_Bliznykov; 15.06.2012 в 09:22.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.06.2012, 12:26   #10
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
А почему Вы игнорируете то, что Вам пишут?
У Вас ТА ЖЕ САМАЯ ошибка с индексом, о которой Вам толкуют на протяжении всей темы!!!




добавлено

Ага. Такое впечатление, что мы непонятно объясняем.. или автор топика не читает то, что ему пишут и пытается решить свои проблемы сам. А форум его только отвлекает...
Ага, я просто ступил, как оказалось, что исправил k на k-1 не везде. С ошибкой list index out of bounds разобрался, она была перед этим циклом, k обнулялся или делался отрицательным и поэтому цикл не срабатывал.
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TRect налету xrob Общие вопросы Delphi 1 06.09.2011 20:37
Массив типа tpoint(delphi) Человек Панда Помощь студентам 2 09.02.2011 17:47
Передача TPoint - TServerSocket, TClientSocket Nater Общие вопросы Delphi 8 08.09.2010 17:59
Что делать E2010 incompatible types: 'HDC' and 'TRect'? Olaf Общие вопросы Delphi 8 09.03.2010 16:20
Динамический массив TPoint NSV Общие вопросы Delphi 5 26.02.2010 18:14