Конференция "Начинающим" » Tlist индекс шкалит [D7]
 
  • barmaglot © (27.03.17 12:15) [0]
    вот код:
    procedure TForm1.BitBtn2Click(Sender: TObject);
    var
       blCross1, blCross2:boolean;
       v1,v2:Tvector;
       apntPoint,ppntCross:ptpoint;
       xx,yy:double;
       index,indexout,indexin:integer;

    begin
       agran.Clear;
      {ищем точки пересечения граней)}

     if outgran.Count<2
       then begin
         outGran.Clear;
         for index:=0 to pGran.Count-1
           do outGran.Add(pgran.Items[index]);
       end
       else begin
        indexout:=0;
        while (indexout<outGran.Count-2)
           do begin
             v1.a:=TmyPoint(outGran.items[indexout]^);
             v1.b:=TmyPoint(outGran.items[indexout+1]^);
             indexin:=0;
             blCross1:=false;
        while (indexin<pGran.Count-2) and (not blCross1)
              do begin
               v2.a:=TmyPoint(pGran.items[indexin]^);
               v2.b:=TmyPoint(pGran.items[indexin+1]^);

                ppntCross:=v1.GetV_Cross(v2);
               if not(ppntCross=nil)
                  then begin
                    blCross1:=true;
                   { application.MessageBox(PCHAR('Пересечение х-'+floattostr(ppntCross.x)+'y-'+floattostr(ppntCross.y)),'Отладка',MB_OK); }
                  end;
               inc(indexin);
              end;
              agran.Add(pgran.Items[indexout]);
           if blcross1
              then  begin
                agran.Add(ppntCross);
                indexout:=pgran.Count;
              end
              else  begin

               inc(indexout);
              end;
         end;
         outGran.Clear;
              for indexin:=0 to agran.Count-1
           do begin
             outGran.Add(agran.Items[indexin]);
           end;
       end;
    end;
    в строке agran.Add(pgran.Items[indexout]); при выполнении условия blkCross1=true параметр indexout принимает рандомные значения, что вызывает ошибку времени выполнения. омогите пожалуйста
  • manaka © (27.03.17 12:42) [1]

    >     indexout:=0;
    >     while (indexout<outGran.Count-2)
    >        do begin
    >        ...
    >        if blcross1 indexout:=pgran.Count;
    >           else inc(indexout);
    >           ...
    >      end;


    так надо?
  • bambam (27.03.17 14:56) [2]
    Да так корректнее, но он превышает количество записей не на единицы, и при отладкии его значения абсолютно случайны, как буд-то переменная вышла за область определения. Там и корявостей много что пробовал и так и сяк. Две идеи или я что-то просмотрел или дельфа косячит с win10.
  • Игорь Шевченко © (27.03.17 17:14) [3]

    > или дельфа косячит с win10.


    Определенно
  • Sha © (27.03.17 18:08) [4]

               agran.Add(ppntCross);
                indexout:=pgran.Count;


    ставлю на то, что тут надо заменить agran на pgran, или наоборот
  • bambam (27.03.17 18:31) [5]
    >"ставлю на то, что тут надо заменить agran на pgran, или наоборот"
    -нет тут всё норм, так и надо)))

    >> или дельфа косячит с win10.

    >Определенно
    а где посмотреть проблемы совместимоcти делфи 7 и win 10?
  • Sha © (27.03.17 20:45) [6]
    >bambam   (27.03.17 18:31) [5]
    >>> или дельфа косячит с win10.
    >> Определенно
    > а где посмотреть проблемы совместимоcти делфи 7 и win 10?

    Мне просто интересно, сколько ты раньше ошибок в Delphi нашел и сколько в своем коде?
    Сравнил?
    Выводы сделал?
  • bambam (27.03.17 21:05) [7]
    Если есть косяк, покажи - я его не вижу.
  • bambam (27.03.17 21:09) [8]
    Такой косяк что значения Indexout становятся к примеру  отрицательными, сразу после выполнения условия pptnCross=nil?
  • bambam (27.03.17 21:16) [9]
    not(pptnCross=nil)
  • Sha © (27.03.17 21:18) [10]
    > bambam   (27.03.17 21:05) [7]
    > Если есть косяк, покажи - я его не вижу.

    Как ты себе представляешь поиск ошибки в ошметках кода?
    Нет ни описаний типов, ни значений переменных, ни ожидаемого результата.

    Сам-то пробовал отладить свой код, тестировал, искал ошибку?
    Расскажи, какие тесты прошли, какие нет, как искал ошибку.
    Какой именно (простейший) пример отрабатывает неверно.
    Какой результат ожидаешь получить.
  • bambam (27.03.17 22:11) [11]
    процедура решает задачу объединения двух замкнутых контуров, заданных набором точек.  Наборы точек хранятся в списках aGran, pGran, outGran - потомков tlist, у которого добавлины методы сохранения и чтения наборов точек. Где aGran - буферный набор, pGran - текущий набор, который добавляется к набору outGran.
    Алгоритм работы:
    Если выходной набор пуст, то текущий набор копируем в выходной.
    Иначе - проверяем есть ли пересечение между контурами - процедура типа вектор - возвращает или указатель на точку пересечения областей или при отсутствии пересечения векторов - нулевой указатель.

    Процедура определения пересечения - отлажена  и работает устойчиво.
    При отсутствии пересечения в в буферный набор добавлается точка входного набора, при наличии точка входного набора и точка пересечения. При наличии пересечения циклы перебора завершаются.
    Буфернфй набор становится выходным набором. Работу процедуры проверял, для первого пересечения, для непересекающихся наборов и для пересекающихся в одной точке.
    При обнаружении пересечения возникает ошибка времени выполнения  в строке agran.Add(pgran.Items[indexout]); так как значения indexout по показаниям окна отладки становятся или отрицательными или очень большими многократно превышающими количество элементов  списка - что позволяет сделать вывод о том что делфи выводит счетчик  за область определения. Причем если объявить эту переменную не в процедуре а в модуле,то таких красот не происходит. Следовательно алгоритм хоть и коряв, но работает при описании счетчика цикла как переменной модуля, а при описании его внутри процедуры не работает.
  • Sha © (27.03.17 22:16) [12]
    И как мне убедиться, что он работает или не работает на минимальном наборе входных данных.
    Хотелось бы иметь пример, который по крайней мере компилируется.
  • Sha © (27.03.17 23:33) [13]
    Пусть outGran.Coun-2>pgran.Count.

    Тогда если во внутреннем while будет найдено пересечение,
    то выполнится indexout:=pgran.Count,
    после чего внутренний while завершится,
    а внешний while продолжит выполнение т.к. indexout<outGran.Count-2.

    При этом несмотря на то, что больше пересечений не будет,
    indexout будет возрастать
    и в буфер будут добавляться точки pgran.Items[indexout],
    лежащие за пределами списка.
  • bambam (29.03.17 09:33) [14]
    Внутренний цикл по indexin завершится по условию
    while (indexin<pGran.Count-2) and (not blCross1)
    внешинй цикл поndexout:=pgran.Count. Приведенный пример компиляцию прошёл.
    Буду пробовать ставить делфу на другой комп под XP и посмотрю что получится.
  • sniknik © (29.03.17 10:13) [15]
    > Приведенный пример компиляцию прошёл.
    он должен компилироваться не у тебя, а у нас

    -----------------
    Габровец спрашивает часового мастера, согласен ли тот починить старинные часы. Мастер соглашается, и клиент подает сверток, в котором оказывается один маятник от часов. - А где же сами часы? - удивляется часовщик. - Часы дома, они в полном порядке, только вот маятник не качается...
  • bambam (29.03.17 12:11) [16]
    К стати
    если
    строку agran.Add(pgran.Items[indexout]);
    заменить на
              new(apеntPoint);
              apntPoint^:=v1.a;
              agran.Add(apntPoint);
    то все работает, то есть проблема действительно в странной области видимости счётчика indexout.

    >он должен компилироваться не у тебя, а у нас
    как вам скинуть файлы?
  • sniknik © (29.03.17 13:00) [17]
    > как вам скинуть файлы?
    мне то зачем? тем более файлы... т.е. желаешь скинуть всю свою помойку, и чтобы за тебя разбирались?  

    это вон Sha писал
    > И как мне убедиться, что он работает или не работает на минимальном наборе входных данных.
    > Хотелось бы иметь пример, который по крайней мере компилируется.

    а приводить куски не компилируемого кода, без примера, это все равно что маятник в мастерскую принести.
    в общем если уж привел, то этот кусок должен компилироваться. причем желательно сначала самому свести "портянку" в минимум кода, и данных на которых ошибка воспроизводится (часто в процессе "сведения" сами находят решение).
  • Sha © (29.03.17 15:16) [18]
    > bambam   (29.03.17 12:11) [16]
    > ... то все работает, то есть проблема действительно в странной области видимости счётчика indexout.

    Написал же выше, что indexout выходит за границу массива.

    P.S. Ну, и да, область видимости действительно в странная у кого-то )
 
Конференция "Начинающим" » Tlist индекс шкалит [D7]
Есть новые Нет новых   [118574   +17][b:0][p:0.001]