Render.ru

Операции с элементами массива

AllexScript

Пользователь сайта
Рейтинг
2
#1
Вот упрощённый кусок кода:
На функции не обращайте внимание я их наугад сократил.

x=#()
y=#()
x1=#()
y1=#()

for fi=1 to 800 do
(
x[fi]=cos(fi)
y[fi]=sin(fi)

x1[fi]=cos(fi-1)
y1[fi]=sin(fi-1)

if x[fi]==x1[fi] then
if y[fi]==y1[fi] then
Circle radius:4 pos:[x2[fi],y2[fi],0] isSelected:eek:n
)

По каким то причинам условие “if” выполняется только один раз соответственно указывая на появлением круга на первом пересечении кривых, но множество пересечений остаётся «не обнаружинными».
Когда я пишу вывод данных в файл, то нахожу в блокноте только одну запись элемента x[1] т.е. в запись идёт только первый элемент из всех x[fi] и на этом всё останавливается.

fs=createFile "c:\\nn.txt"
format "%" x[fi] to:fs
close fs

Почему условие “if” выполняется только один раз, а не 800 ?
Как я понимаю все элементы x[fi] по окончанию 800 циклов сохраняются в оперативной памяти, но иксу присваивается только текущее значение на определённом шаге.
Т.е. как в этом случае можно обратиться к отдельному элементу массива, когда я пишу x[5] например то выскакивает ошибка?

Основной вопрос: Как сравнить все скажем x[fi] 800 элементов с каждым из восьмиста x1[fi] элементом ?

Заранее благодарен :))
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#2
Когда я пишу вывод данных в файл, то нахожу в блокноте только одну запись элемента x[1] т.е. в запись идёт только первый элемент из всех x[fi] и на этом всё останавливается.
Если у тебя этот кусок кода стоит внутри цикла, то файл просто перзаписвается каждый раз. Нужно открывать и закравать файл вне тела цикла.


Как я понимаю все элементы x[fi] по окончанию 800 циклов сохраняются в оперативной памяти, но иксу присваивается только текущее значение на определённом шаге.
Т.е. как в этом случае можно обратиться к отдельному элементу массива, когда я пишу x[5] например то выскакивает ошибка?
Да все верно, возможно это переменная у тебя локальная для проверки после цикла поставь print x[5] и смотри результат в листеноре

Основной вопрос: Как сравнить все скажем x[fi] 800 элементов с каждым из восьмиста x1[fi] элементом ?
Это нужно уже делать уже после заполнения массивов, в отдельном вложенном цикле. Тоесть у тебя должен быть цикл в цикле, чтобы ты смог сравнить каждый x==x1[j] (где i,j = 1..800).

Также советую учесть погрешность при сравнении чисел с плавающей точкой на пример 3.000 не будет равна 3.0001, погрешность при этом будет равна eps = 0.001
Проверка с учетом прогрешности будет выглядеть:
if abc(x - x1[j]) < eps then
 

AllexScript

Пользователь сайта
Рейтинг
2
#4
Начал сравнивать элементы массива, но обнаружил проблемы в строчке с “kx”, после обработки выходит ошибка о несовместимости каких то типов и значение первого элемента массива “Incompatible types:0.499924 ,and undefined”….. в общем я не знаю как найти kx другим образом….

кусок кода:
If fi>=499 then
(
For p=1 to 500 do
(
for d=1 to 500 do
(
kx=abs(x2[p]-px2[d]) /*здесь ошибка*/
)
)
)
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#5
Ошибка раньше, проверь значения массивов в них не дол;но быть значений undefined
либо делай проверку на такие значения. Либо вышел за пределы массива
 

Protactinium

Пользователь сайта
Рейтинг
2
#6
Перед циклом нужно явно задать размеры массивов или добавлять каждый новый элемент в массив с помощью функции append
 
Сверху