Author Topic: Ошибка при интерпретации строки setvar  (Read 1486 times)

0 Members and 1 Guest are viewing this topic.

Kashey

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
В этой подпрограмме происходит ошибка.
Code: [Select]
SUB(pointsCalc, $x1, $y1, $x2, $y2, $rx, $ry, $time)
   $tmpx = ($x2-$x1)*($time/100)+$x1
   $tmpy = ($y2-$y1)*($time/100)+$y1   
   setvar($rx, 4)
   setvar($ry, 5)   
END_SUB
А вот её вызов:
Code: [Select]
pointsCalc($pointsX[$i], $pointsY[$i], $pointsX[$i + 1], $pointsY[$i + 1], "$arrX[$i]", "$arrY[$i]", $time)Помогите разобраться, почему происходит ошибка и как её исправить?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Ошибка при интерпретации строки setvar
« Reply #1 on: November 05, 2020, 05:37:09 PM »
При использовании setvar, переменная с таким именем должна уже существовать, что сводит на нет её использование.

setvar прекрасно заменяется массивом.


Kashey

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Re: Ошибка при интерпретации строки setvar
« Reply #2 on: November 05, 2020, 05:59:30 PM »
И как же её заменить массивом?
Допустим, перед вызовом pointsCalc я сделал инициализацию всех элементов массива. Всё равно случается ошибка.

Code: [Select]
   for ($ii = 0, $ii < arrsize($pointsX) - 2)
      $arrX[$ii] = 0
      $arrY[$ii] = 0
   end_cyc

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Ошибка при интерпретации строки setvar
« Reply #3 on: November 05, 2020, 11:11:44 PM »
Тут ведь дело вот в чем, покажу для начала на примерах.

Code: (clickermann) [Select]
$arrX[0] = 0

SUB(pointsCalc, $rx)
   setvar($rx, 4)
END_SUB

pointsCalc("$arrX[$i]")

print($arrX[$i])

halt

ОШИБКА



Code: (clickermann) [Select]
$arrX[0] = 0

SUB(pointsCalc, $rx)
   setvar($rx, 4)
END_SUB

pointsCalc("$arrX[0]")

print($arrX[$i])

halt

НЕ ОШИБКА, работает верно.

В чем разница - разные параметры в setvar. В первом случае это "$arrX[$i]", тоесть тут нужно определить еще и переменную $i, а кликерман как оказалось, так не умеет. Во втором случае это уже "$arrX[0]" - готовый элемент массива, индекс прописан цифрой а не переменной.



Выход из положения - перед вызовом подпрограммы нужно сформировать строку имени элемента массива, но чтоб в качестве индекса там была цифра, а не переменная.

Code: (clickermann) [Select]
$arrX[0] = 0

SUB(pointsCalc, $rx)
   setvar($rx, 4)
END_SUB

//костыль
$str_arrX = strconcat("$arrX[", $i, "]")  //   $str_arrX = "$arrX[0]"

pointsCalc($str_arrX)

print($arrX[$i])

halt



А вообще, не понятно, зачем тут сетвар? Как говорил Vint, скорее всего тут можно и без него.

Простейшее, из того что дано:
Code: (clickermann) [Select]
SUB(pointsCalc, $x1, $y1, $x2, $y2, $time)
   $tmpx = ($x2-$x1)*($time/100)+$x1
   $tmpy = ($y2-$y1)*($time/100)+$y1   
   $arrX[$i] = 4
   $arrY[$i] = 5   
END_SUB

pointsCalc($pointsX[$i], $pointsY[$i], $pointsX[$i + 1], $pointsY[$i + 1], $time)

Будет работать также как и с setvar.


Kashey

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Re: Ошибка при интерпретации строки setvar
« Reply #4 on: November 05, 2020, 11:42:10 PM »
Спасибо за наводку, dramster, но всё равно не работает.
Там, чтобы работало, надо ещё перед этим инициализировать все элементы массива.
То есть, одного
Code: (Kashey) [Select]
$arrX[0] = 0 недостаточно.
Надо обязательно
Code: (Kashey) [Select]
For ($i = 0, i < (arrsize($arr) - 1))
      arrX[i] = 0
END_CYC

Но там тоже проблема, ему конструкция
Code: (Kashey) [Select]
i < (arrsize($arr) - 1) не нравится.

Использую сейчас другой костыль - обмен через глобальные переменные.

P.S. А есть возможность, чтобы тэг 'code=Kashey' ручками не набирать? И где моя подсветка синтаксиса?


« Last Edit: November 05, 2020, 11:49:13 PM by Kashey »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Ошибка при интерпретации строки setvar
« Reply #5 on: November 05, 2020, 11:52:44 PM »
Я для примера сократил по максимуму твой код.

Почему ты инициализируешь не весь массив, а на 1 элемент меньше?

Скорее всего правильно:
Code: (clickermann) [Select]
For ($i = 0, i < (arrsize($arr)))
      arrX[i] = 0
END_CYC

А если размер массива не имеет значения, то просто записать в память максимально возможный размер массива.

Вот твой изначальный пример с кастылем:
Code: (clickermann) [Select]
//для примера записал какието значения  $pointsX  и $pointsY 
STRSEPARATE (0;1;2;3;4;5;6;7;8;9, ";", $pointsX)
STRSEPARATE (0;1;2;3;4;5;6;7;8;9, ";", $pointsY)


//инициализация
for ($a = 0, $a < arrsize($pointsX))
   $arrX[$a] = 0
   $arrY[$a] = 0
end_cyc

//расчет
SUB(pointsCalc, $x1, $y1, $x2, $y2, $rx, $ry, $time)
   $tmpx = ($x2-$x1)*($time/100)+$x1
   $tmpy = ($y2-$y1)*($time/100)+$y1
   setvar($rx, 4)
   setvar($ry, 5)
END_SUB

//формирование строк
$str_arrX = strconcat("$arrX[", $i, "]")
$str_arrY = strconcat("$arrY[", $i, "]")

//вызов
pointsCalc($pointsX[$i], $pointsY[$i], $pointsX[$i + 1], $pointsY[$i + 1], $str_arrX, $str_arrY, $time)


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Ошибка при интерпретации строки setvar
« Reply #6 on: November 05, 2020, 11:59:32 PM »
P.S. А есть возможность, чтобы тэг 'code=Kashey' ручками не набирать? И где моя подсветка синтаксиса?


Kashey

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Re: Ошибка при интерпретации строки setvar
« Reply #7 on: November 06, 2020, 12:45:41 AM »
dramster

Ответ для чего мне необходимо было реализовать инициализацию массива на один элемент меньше можно найти в этой теме:

http://crapware.aidf.org/forum/index.php?topic=5442.0

Спасибо за подсказку по подсветке кода.