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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2015, 16:55   #1
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию Не хватает "end" .Delphi7

Работает, но не всё (В этой теме флудить можно. Кто помогает за денежные знаки, сразу пишите в л/с сколько должен за каждый чих... Пусть накапливается до целого 0,5 литра):
Код:
procedure TForm1.Timer1Timer(Sender: TObject);//Timer1.Enabled:=false;// отключить таймер//Timer1.Enabled:= true; //включить
var  //Положение курсора до первого срабатывания  Timer  не учитывается
  i:integer;  //номер столбца в StringGrid1
  ErrorArcTan: Extended;//знаменатель в дроби не должен оказаться равен "нулю"
  X_rotation, Y_rotation:integer; //текущие координаты
  Trunc_ArcTan2: Extended;//угол направления поворота со знаком
  numerator_ArcTan2: Extended;//the numerator and denominator (числитель и знаменатель   ArcTan2)
 // column : integer;  //номер столбца в StringGrid1
begin
   moment_time:= moment_time+1;  //счетчик времени
   X_rotation:=Mouse.CursorPos.X-kX ;////текущие координаты приведенные к полюсю полярной системы координат поворота
   Y_rotation:=Mouse.CursorPos.Y-kY ;
  begin
  if column < Ncolumn-1
  then column:=column+1
  else column:=1;// переполнения StringGrid1 не будет
  StringGrid1.Cells[column,1]:=IntToStr(moment_time); //[столбуец , строка]
  end;
  
  if member_array < turn_over then  //поворот закончен по количеству выборочных расчетов
   begin //переполнения массива не допустим
    if (X_rotation <> coordinate_rotation[member_array-1].X) or (Y_rotation <> coordinate_rotation[member_array-1].Y) then  //поворот закончен по количеству выборочных расчетов
     begin //переполнения массива не допустим
      begin
        StringGrid1.Cells[column,2]:=IntToStr(X_rotation);   StringGrid1.Cells[0,2]:='  Положение курсора X в момент OnTimer';
        StringGrid1.Cells[column,3]:=IntToStr(Y_rotation);   StringGrid1.Cells[0,3]:='  Положение курсора Y в момент OnTimer';
        coordinate_rotation[member_array].X:= X_rotation;//заполняем массив
        coordinate_rotation[member_array].Y:= Y_rotation;
        //   member_array:= member_array+1;  //счетчик массива
        numerator_ArcTan2:= ((coordinate_rotation[member_array-1]).X*(coordinate_rotation[member_array].Y)) - ((coordinate_rotation[member_array-1].Y)*(coordinate_rotation[member_array].X));
        ErrorArcTan:=coordinate_rotation[member_array-1].X*(coordinate_rotation[member_array].X)+coordinate_rotation[member_array-1].Y*(coordinate_rotation[member_array].Y); // знаменатель в дроби никогда не равен нулю , не допущу!
        member_array:= member_array+1;  //счетчик массива
        StringGrid1.Cells[6,6]:=FloatToStr(member_array);//заполняется элемент массива с номером
       begin
        if  ErrorArcTan=0 then  ErrorArcTan:=0.1 else
        asm nop end;
         StringGrid1.Cells[1,4]:=FloatToStr(ErrorArcTan);//показываем знаменатель дроби не равный нулю
       end;
       begin
        Trunc_ArcTan2:=(Trunc(ArcTan2(numerator_ArcTan2, ErrorArcTan)))* (180 / Pi);   //переводим в градусы; //полярный угол курсора относительно полюса
        StringGrid1.Cells[4,4]:=FloatToStr(Trunc_ArcTan2); // угол и направление поворота [столбуец , строка]
       end;
      end;
      if Trunc_ArcTan2<= 0 then  //поворот против часовой стрелки
         StringGrid1.Cells[4,4]:=FloatToStr(-1)
      else
         StringGrid1.Cells[4,4]:=FloatToStr(1);//поворот по часовой стрелки
       end;
    end
    else
  begin
        StringGrid1.Cells[0,5]:='  поворот закончен по количеству выборочных расчетов turn_over';
   asm nop end;
  end;

  if moment_time < turn_over_time then  //поворот закончен по количеству выборочных расчетов
  begin //продолжается время отсчета манипуляций
  asm nop end;
  end else //asm nop end;
        StringGrid1.Cells[0,6]:='  окончилось контрольное время поворота turn_over_time';
end;
Исходники положил сюда: http://rghost.ru/8grg9K98s
Изображения
Тип файла: jpg в нужные местах не хватает begin end;.jpg (115.2 Кб, 152 просмотров)
Репутация: полный "0"

Последний раз редактировалось zvygin1964; 07.07.2015 в 08:38.
zvygin1964 вне форума Ответить с цитированием
Старый 06.07.2015, 16:59   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Там по-моему лишние end-ы. Нормально отформатировать, лишние операторные блоки убрать и все видно станет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.07.2015, 17:01   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
begin //переполнения массива не допустим
begin
может это ? (лишние begin)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.07.2015, 17:24   #4
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
может это лишние begin
Нет, не этот. Без него всё стало коричневым.
Цитата:
Сообщение от Аватар Посмотреть сообщение
Нормально отформатировать, лишние операторные блоки убрать
, - это я не умею...
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 06.07.2015, 17:42   #5
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

гм... А что оно вообще делает? о__О

asm nop end; - это для чего? Ассемблерная вставка какая-то, но смысл/назначение я не понял.

У меня если вызывается код выше чем "не работает это место" - то и само "место" тоже вызывается.
Может где-то обнулять нужно?: StringGrid1.Cells[4,4]:='';
ResourceSpace вне форума Ответить с цитированием
Старый 06.07.2015, 17:56   #6
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Автор, вот так работает

Код:
procedure TForm1.Timer1Timer(Sender: TObject);//Timer1.Enabled:=false;// отключить таймер//Timer1.Enabled:= true; //включить
var  //Положение курсора до первого срабатывания  Timer  не учитывается
  i:integer;  //номер столбца в StringGrid1
  ErrorArcTan: Extended;//знаменатель в дроби не должен оказаться равен "нулю"
  X_rotation, Y_rotation:integer; //текущие координаты
  Trunc_ArcTan2: Extended;//угол направления поворота со знаком
  numerator_ArcTan2: Extended;//the numerator and denominator (числитель и знаменатель   ArcTan2)
 // column : integer;  //номер столбца в StringGrid1
begin
  moment_time:= moment_time+1;  //счетчик времени
  X_rotation:=Mouse.CursorPos.X-kX ;////текущие координаты приведенные к полюсю полярной системы координат поворота
  Y_rotation:=Mouse.CursorPos.Y-kY ;

  if column < Ncolumn-1
  then column:=column+1
  else column:=1;// переполнения StringGrid1 не будет
  StringGrid1.Cells[column,1]:=IntToStr(moment_time); //[столбуец , строка]

  
  if member_array < turn_over then  //поворот закончен по количеству выборочных расчетов
  begin //переполнения массива не допустим
    if (X_rotation <> coordinate_rotation[member_array-1].X) or (Y_rotation <> coordinate_rotation[member_array-1].Y) then 
   //поворот закончен по количеству выборочных расчетов
    begin //переполнения массива не допустим
      StringGrid1.Cells[column,2]:=IntToStr(X_rotation);   StringGrid1.Cells[0,2]:='  Положение курсора X в момент OnTimer';
      StringGrid1.Cells[column,3]:=IntToStr(Y_rotation);   StringGrid1.Cells[0,3]:='  Положение курсора Y в момент OnTimer';
      coordinate_rotation[member_array].X:= X_rotation;//заполняем массив
      coordinate_rotation[member_array].Y:= Y_rotation;
      //   member_array:= member_array+1;  //счетчик массива
      numerator_ArcTan2:= ((coordinate_rotation[member_array-1]).X*(coordinate_rotation[member_array].Y)) -
     ((coordinate_rotation[member_array-1].Y)*(coordinate_rotation[member_array].X));
      ErrorArcTan:=coordinate_rotation[member_array-1].X*(coordinate_rotation[member_array].X)+
  coordinate_rotation[member_array-1].Y*(coordinate_rotation[member_array].Y); // знаменатель в дроби никогда не равен нулю , не допущу!
      member_array:= member_array+1;  //счетчик массива
      StringGrid1.Cells[6,6]:=FloatToStr(member_array);//заполняется элемент массива с номером

      if  ErrorArcTan=0 then  ErrorArcTan:=0.1 else
      asm nop end;
      StringGrid1.Cells[1,4]:=FloatToStr(ErrorArcTan);//показываем знаменатель дроби не равный нулю


      Trunc_ArcTan2:=(Trunc(ArcTan2(numerator_ArcTan2, ErrorArcTan)))* (180 / Pi);   //переводим в градусы; 
//полярный угол курсора относительно полюса
      StringGrid1.Cells[4,4]:=FloatToStr(Trunc_ArcTan2); // угол и направление поворота [столбуец , строка]
      if Trunc_ArcTan2<= 0 then  //поворот против часовой стрелки
         StringGrid1.Cells[4,4]:=FloatToStr(-1)
      else
         StringGrid1.Cells[4,4]:=FloatToStr(1);//поворот по часовой стрелки
    end;  

  end else
  begin
    StringGrid1.Cells[0,5]:='  поворот закончен по количеству выборочных расчетов turn_over';
    asm nop end;
  end;



  if moment_time < turn_over_time then  //поворот закончен по количеству выборочных расчетов
  begin //продолжается время отсчета манипуляций
    asm nop end;
  end else //asm nop end;
    StringGrid1.Cells[0,6]:='  окончилось контрольное время поворота turn_over_time';
end;
ели вчехлил как запускать таймер. Подержал мышку нажатой пару секунд, что-то в гриде заполняется
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 06.07.2015, 18:07   #7
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Проверил. Выделенный на рисунке фрагмент, как и раньше не работает. Знаменатель дроби вычисляется, а Trunc_ArcTan2 уже нет.
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 06.07.2015, 18:21   #8
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Цитата:
Сообщение от ResourceSpace Посмотреть сообщение
А что оно вообще делает?
asm nop end; - это для чего?
,- это продолжение темы: http://programmersforum.ru/showthrea...=267214&page=6
(симулятор работы оборудования).
Нажал на левую кнопку мыши и поворачиваешь по рисунку секунд 10 и более. Потом отпустить. Узнаем куда был поворот. Будем делать другие действия...

"asm nop end",- нет операции. Поставил, чтобы занять строку, вдруг там она нужна?

По Timer1Timer заполняю массив координат, где был курсор.
Требования:
-Не допустить переполнения StringGrid1;
-Не допустить переполнения массива координат;
-Заполнять только при изменении положения курсора;
-Вычислять угол поворота вокруг заданного центра при каждом изменении массива между двумя последними значениями,
определить направление поворота (-1 -это против часовой стрелки);
-По заполнению массива остановить его заполнение;
-По истечении контрольного времени - сообщить об этом.
Изображения
Тип файла: jpg поворот окончен.JPG (90.4 Кб, 127 просмотров)
Репутация: полный "0"

Последний раз редактировалось zvygin1964; 06.07.2015 в 18:39.
zvygin1964 вне форума Ответить с цитированием
Старый 06.07.2015, 19:06   #9
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Всё равно не соображу какие действия мышкой к чему должны приводить... %)

Код:
       begin
        if  ErrorArcTan=0 then  ErrorArcTan:=0.1 else
        asm nop end;
         StringGrid1.Cells[1,4]:=FloatToStr(ErrorArcTan);//показываем знаменатель дроби не равный нулю
       end;
       begin
        Trunc_ArcTan2:=(Trunc(ArcTan2(numerator_ArcTan2, ErrorArcTan)))* (180 / Pi);   //переводим в градусы; //полярный угол курсора относительно полюса
        StringGrid1.Cells[4,4]:=FloatToStr(Trunc_ArcTan2); // угол и направление поворота [столбуец , строка]
       end;
      end;
      if Trunc_ArcTan2<= 0 then  //поворот против часовой стрелки
         StringGrid1.Cells[4,4]:=FloatToStr(-1)
      else
         StringGrid1.Cells[4,4]:=FloatToStr(1);//поворот по часовой стрелки
       end;
Прежде всего у вас StringGrid1.Cells[4,4] заполняется сначала значением Trunc_ArcTan2, а после затирается на -1 или 1.
Дальше мне кажется в Trunc неправильно скобки расставлены, может так?:
Код:
Trunc_ArcTan2:=Trunc(ArcTan2(numerator_ArcTan2, ErrorArcTan)*(180/Pi));   //переводим в градусы;
А сам участок кода выполняется, можно проверить выводя: Label2.Caption:='test-'+IntToStr(GetTickCount);

Последний раз редактировалось ResourceSpace; 06.07.2015 в 19:08.
ResourceSpace вне форума Ответить с цитированием
Старый 06.07.2015, 19:50   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от zvygin1964 Посмотреть сообщение
Проверил. Выделенный на рисунке фрагмент, как и раньше не работает. Знаменатель дроби вычисляется, а Trunc_ArcTan2 уже нет.
Автор, давай проАНАЛизируем указаную тобой строку

Код:
Trunc_ArcTan2:=(Trunc(ArcTan2(numerator_ArcTan2, ErrorArcTan)))* (180 / Pi);   //переводим в градусы;
пусть numerator_ArcTan2 = 1 и ErrorArcTan = 1, то есть арктангенс dy/dx при обоих значениях в 1 = pi/4 (45 градусов если на русском языке)
теперь мы делаем Trunc (отброс дробной части) = 0
теперь 0 * 180 / pi = 0
то есть всё корректно работает. В твоём случае автор, значение всегда будет 0.
Теперь переписываем строку так, чтобы она делала то что в комментарии

Код:
Trunc_ArcTan2:=  trunc( ArcTan2(numerator_ArcTan2, ErrorArcTan)*180 / Pi  );   //переводим в градусы;
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Unexpected end of input" и "Unexpected token <" 555MasteR555 JavaScript, Ajax 1 22.02.2015 16:37
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
Перевести задачу из формата "Паскаль" в "Delphi7" Idma Помощь студентам 1 22.12.2011 20:56
При запуске ругается:"не хватает памяти..." kim_klim Свободное общение 3 19.01.2011 15:39
Visual Basic, использование операторов "for..next" и "if.. end if" Dieza Помощь студентам 0 27.10.2010 20:46