1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "MAXScript", создана пользователем AllexScript, 29 янв 2009.

Модераторы: Savin Denis
  1. AllexScript

    AllexScript Пользователь сайта

    С нами с:
    28.01.2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    2
    Вот упрощённый кусок кода:
    На функции не обращайте внимание я их наугад сократил.

    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] элементом ?

    Заранее благодарен :))
     
  2. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Если у тебя этот кусок кода стоит внутри цикла, то файл просто перзаписвается каждый раз. Нужно открывать и закравать файл вне тела цикла.


    Да все верно, возможно это переменная у тебя локальная для проверки после цикла поставь print x[5] и смотри результат в листеноре

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

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

    AllexScript Пользователь сайта

    С нами с:
    28.01.2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    2
    Спасибо. :))
    Нужно попробовать...
     
  4. AllexScript

    AllexScript Пользователь сайта

    С нами с:
    28.01.2009
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    2
    Начал сравнивать элементы массива, но обнаружил проблемы в строчке с “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]) /*здесь ошибка*/
    )
    )
    )
     
  5. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Ошибка раньше, проверь значения массивов в них не дол;но быть значений undefined
    либо делай проверку на такие значения. Либо вышел за пределы массива
     
  6. Protactinium

    Protactinium Пользователь сайта

    С нами с:
    03.03.2006
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    2
    Перед циклом нужно явно задать размеры массивов или добавлять каждый новый элемент в массив с помощью функции append
     
  7. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Это ты к чему сказал ?!
     
  8. Protactinium

    Protactinium Пользователь сайта

    С нами с:
    03.03.2006
    Сообщения:
    27
    Симпатии:
    0
    Баллы:
    2
    Сори. сказал не в тему (и не правильно) )
     
Модераторы: Savin Denis

Поделиться этой страницей