-
вот код: 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 принимает рандомные значения, что вызывает ошибку времени выполнения. омогите пожалуйста
-
> indexout:=0; > while (indexout<outGran.Count-2) > do begin > ... > if blcross1 indexout:=pgran.Count; > else inc(indexout); > ... > end;
так надо?
-
Да так корректнее, но он превышает количество записей не на единицы, и при отладкии его значения абсолютно случайны, как буд-то переменная вышла за область определения. Там и корявостей много что пробовал и так и сяк. Две идеи или я что-то просмотрел или дельфа косячит с win10.
-
> или дельфа косячит с win10.
Определенно
-
agran.Add(ppntCross); indexout:=pgran.Count;
ставлю на то, что тут надо заменить agran на pgran, или наоборот
-
>"ставлю на то, что тут надо заменить agran на pgran, или наоборот" -нет тут всё норм, так и надо)))
>> или дельфа косячит с win10.
>Определенно а где посмотреть проблемы совместимоcти делфи 7 и win 10?
-
>bambam (27.03.17 18:31) [5] >>> или дельфа косячит с win10. >> Определенно > а где посмотреть проблемы совместимоcти делфи 7 и win 10?
Мне просто интересно, сколько ты раньше ошибок в Delphi нашел и сколько в своем коде? Сравнил? Выводы сделал?
-
Если есть косяк, покажи - я его не вижу.
-
Такой косяк что значения Indexout становятся к примеру отрицательными, сразу после выполнения условия pptnCross=nil?
-
not(pptnCross=nil)
-
> bambam (27.03.17 21:05) [7] > Если есть косяк, покажи - я его не вижу.
Как ты себе представляешь поиск ошибки в ошметках кода? Нет ни описаний типов, ни значений переменных, ни ожидаемого результата.
Сам-то пробовал отладить свой код, тестировал, искал ошибку? Расскажи, какие тесты прошли, какие нет, как искал ошибку. Какой именно (простейший) пример отрабатывает неверно. Какой результат ожидаешь получить.
-
процедура решает задачу объединения двух замкнутых контуров, заданных набором точек. Наборы точек хранятся в списках aGran, pGran, outGran - потомков tlist, у которого добавлины методы сохранения и чтения наборов точек. Где aGran - буферный набор, pGran - текущий набор, который добавляется к набору outGran. Алгоритм работы: Если выходной набор пуст, то текущий набор копируем в выходной. Иначе - проверяем есть ли пересечение между контурами - процедура типа вектор - возвращает или указатель на точку пересечения областей или при отсутствии пересечения векторов - нулевой указатель.
Процедура определения пересечения - отлажена и работает устойчиво. При отсутствии пересечения в в буферный набор добавлается точка входного набора, при наличии точка входного набора и точка пересечения. При наличии пересечения циклы перебора завершаются. Буфернфй набор становится выходным набором. Работу процедуры проверял, для первого пересечения, для непересекающихся наборов и для пересекающихся в одной точке. При обнаружении пересечения возникает ошибка времени выполнения в строке agran.Add(pgran.Items[indexout]); так как значения indexout по показаниям окна отладки становятся или отрицательными или очень большими многократно превышающими количество элементов списка - что позволяет сделать вывод о том что делфи выводит счетчик за область определения. Причем если объявить эту переменную не в процедуре а в модуле,то таких красот не происходит. Следовательно алгоритм хоть и коряв, но работает при описании счетчика цикла как переменной модуля, а при описании его внутри процедуры не работает.
-
И как мне убедиться, что он работает или не работает на минимальном наборе входных данных. Хотелось бы иметь пример, который по крайней мере компилируется.
-
Пусть outGran.Coun-2>pgran.Count.
Тогда если во внутреннем while будет найдено пересечение, то выполнится indexout:=pgran.Count, после чего внутренний while завершится, а внешний while продолжит выполнение т.к. indexout<outGran.Count-2.
При этом несмотря на то, что больше пересечений не будет, indexout будет возрастать и в буфер будут добавляться точки pgran.Items[indexout], лежащие за пределами списка.
-
Внутренний цикл по indexin завершится по условию while (indexin<pGran.Count-2) and (not blCross1) внешинй цикл поndexout:=pgran.Count. Приведенный пример компиляцию прошёл. Буду пробовать ставить делфу на другой комп под XP и посмотрю что получится.
-
> Приведенный пример компиляцию прошёл. он должен компилироваться не у тебя, а у нас
----------------- Габровец спрашивает часового мастера, согласен ли тот починить старинные часы. Мастер соглашается, и клиент подает сверток, в котором оказывается один маятник от часов. - А где же сами часы? - удивляется часовщик. - Часы дома, они в полном порядке, только вот маятник не качается...
-
К стати если строку agran.Add(pgran.Items[indexout]); заменить на new(apеntPoint); apntPoint^:=v1.a; agran.Add(apntPoint); то все работает, то есть проблема действительно в странной области видимости счётчика indexout.
>он должен компилироваться не у тебя, а у нас как вам скинуть файлы?
-
> как вам скинуть файлы? мне то зачем? тем более файлы... т.е. желаешь скинуть всю свою помойку, и чтобы за тебя разбирались?
это вон Sha писал > И как мне убедиться, что он работает или не работает на минимальном наборе входных данных. > Хотелось бы иметь пример, который по крайней мере компилируется.
а приводить куски не компилируемого кода, без примера, это все равно что маятник в мастерскую принести. в общем если уж привел, то этот кусок должен компилироваться. причем желательно сначала самому свести "портянку" в минимум кода, и данных на которых ошибка воспроизводится (часто в процессе "сведения" сами находят решение).
-
> bambam (29.03.17 12:11) [16] > ... то все работает, то есть проблема действительно в странной области видимости счётчика indexout.
Написал же выше, что indexout выходит за границу массива.
P.S. Ну, и да, область видимости действительно в странная у кого-то )
|