Author Topic: Дополнительные команды для работы с массивами  (Read 3432 times)

0 Members and 1 Guest are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Есть предложения по расширению команд для более удобной работы с массивами.
Понятно, что всё можно реализовать (и реализовано) с помощью группы других команд, но всё же некоторые вещи не удобны и почти все не очевидны для новичков.
Предлагаю ввести команды

1. Простое заполнение массива. Вместо заполнения по одному
Code: (clickermann) [Select]
arrpush($arr, 435)
arrpush($arr, 532)
arrpush($arr, 943)

Сейчас для массива более 3 элементов я использую код:
Code: (clickermann) [Select]
$data = "1,1,-5,7,-4,14,-4,14,-7,14,14,4,-5,5,12,6,-12,2,14,-4,-7,10,8,-2,9,5,-12,2,10,-7,-14,-6,14,4,10,4,2,5,4,6,6,-22,12,0,-14,2,-15,4,-10,6,8,8,-14,-6,10,6,-9,-2,4,-2"
WHILE(STRLEN($data) > 0)
   IF(STRPOS($data,",") > 0)
      $num = INT(STRCUT2($data, 1, STRPOS($data,",")-1))
      $data = STRCUT2($data, STRPOS($data,",")+1, 99999)
   ELSE
      $num = INT($data)
      $data = ""
   END_IF
   ARRPUSH($arr, $num)
END_CYC
LOGWRITE ("Размер массива: ",ARRSIZE($arr))

Предлагаю ввести что нибудь типа
Code: (clickermann) [Select]
arrset($arr, data1, data2,  data3, data4, ...)
или
arrset($arr, "data1, data2,  data3, data4, ...")
Первый вариант наглядней, второй даёт возможность подставлять всего одну строковую переменную (получаемую, допустим, из файла) содержащую все данные.
Если команда будет не обнулять входящий массив, то ещё удобней, можно этой же командой добавлять сразу несколько значений в конец уже существующего массива.
Code: (clickermann) [Select]
arradd($arr, 1, 2,  3)
// содержание $arr = 1, 2, 3
arradd($arr, 4,5,6)
// содержание $arr = 1, 2, 3, 4, 5, 6

2. Всё таки ввести возможность прямого присвоения массива, хоть это тоже реализуется одним циклом.
Code: (clickermann) [Select]
$arr2 = $arr1
3. Починить/реализовать возможность передачи массива как параметр в подпрограмму. И эта же проблема с выводом в лог. Сейчас от массива остаётся одиночная переменная $var[0]

4. ARRPOP($arr)  возвращает всегда строку. При извлечении по индексу всё правильно строка-строка, число-число. Не удобно.



И относящиеся не только к массивам.
*Попутно вылез косяк с передачей строковой переменной как параметра в SUB
строка вида "1,-2,3,-2" передаётся как просто "-2"
В общем, при передаче он строковую переменную опять пытается посчитать, видимо во время присваивания внутренней переменной саба. Это нужно лечить. Уже исправляли переприсваивание строковой переменной и вот при передаче в саб оно опять вылезло. При чём если минусы далеко в середине прокатывает иногда.


*Ввести команду принудительного присвоения переменной типа "строка" по аналогии с результатом INT()...
Code: (clickermann) [Select]
STR($var)
Сейчас приходится мудрить всякие
Code: (clickermann) [Select]
TOCLIP($var)
$var = FROMCLIP()


*Для напоминания, костыль с вычислением SIN COS иногда вылазит
Code: (clickermann) [Select]
LOGWRITE (COS(90))Выдаёт правильно, 0. Но к нему нельзя ничего прибавлять/умножать... Для примера
Code: (clickermann) [Select]
LOGWRITE (COS(90)+0)или
Code: (clickermann) [Select]
LOGWRITE (COS(90)*1)даёт -22.7105054312138


*Поправить подсветку синтаксиса на форуме для всех новых команд.
« Last Edit: August 07, 2014, 02:11:39 PM by Vint »