Как сделать?
…
Возможно ли присвоить массив части другого массива. То есть двумерный массив в строку трёхмерного?
Если нельзя, то как эффективнее сделать такую копию в условиях, когда неизвестно, какие ячейки заняты и как называются/пронумерованы? arrsize — узнал длину, а дальше? Как узнать максимальную размерность массива? Как узнать индекс 5й ячейки в примере, чтобы его скопировать?
$a[0]='A'
$a[1][0]='B'
$a[1][1]='Bb'
$a[3]='C'
$a['no']='NO'
$as=arrsize('a')
*nl 'size='+$as
i=0
:loop
*nl $a[i]
if i<$as: i=i+1 & jump 'loop'
И просто любопытный пример:
$a[0]=''
$a[1]=''
*nl 'size='+arrsize('a')
Выдаст 2. Удалить эти пустые ячейки в конце нельзя. Разумеется, нужно программировать так, чтобы оные не создавать.
Хитрый Пряник,
двумерный массив в строку трёхмерного
все массивы одномерные. Многомерность можно только имитировать, например с помощью строковых индексов.
Примеры массивов, многомерные массивы
Как узнать индекс 5й ячейки в примере, чтобы его скопировать?
Индекс 5й ячейки будет 5.
Если же тебе нужно вычислить числовой индекс, соответствующий известному строковому индексу, делается так:
1. Сохраняем текущее значение ячейки с указанным строковым индексом во вспомогательную переменную.
2. Записываем в эту ячейку какое-нибудь уникальное значение, которое точно не встречается в массиве.
3. Ищем числовой индекс с помощью функции ARRPOS по уникальному значению.
4. Возвращаем на место оригинальное значение.
При желании, в этот алгоритм можно добавить проверку на то, была ли изначально заполнена ячейка массива.
Возможно ли присвоить массив части другого массива
Удалить эти пустые ячейки в конце нельзя
Можно.
KILLVAR '$a'
Nex:
Индекс 5й ячейки будет 5.
Мне нужно узнать строковый индекс, соответствующий числовому
Этот код
KILLVAR '$a'
Убъёт весь массив, а не только пустые ячейки в конце него.
За CopyArr спасибо, что-то я в старую справку глядел, там не было.
Но оно же заменяет значения первого массива а не дополняет их.
Однако, раз массив одномерный, значит можно просто циклом пройтись? Но как тогда выудить элементы array1 для случая, когда нет нормы, как в указанном примере? Брать по максимальной размерности? Да и после цикла же в массиве приёмнике текстовые индексы не сохранятся, раз я их не узнал.
Почему сей код выводит в окно «8»?
a=7
b=dyneval("a+1")
функция же только возвращать должна, то есть присвоение должно быть, не?
Мне нужно узнать строковый индекс, соответствующий числовому
Приведи практический пример. Не абстрактный, а реальную задачу.
Этот код … Убъёт весь массив, а не только пустые ячейки в конце него.
С помощью этого же оператора ты можешь очистить выборочно ячейки по любым индексам. Загляни в справку.
За CopyArr спасибо, что-то я в старую справку глядел, там не было.
Но оно же заменяет значения первого массива а не дополняет их.Однако, раз массив одномерный, значит можно просто циклом пройтись? Но как тогда выудить элементы array1 для случая, когда нет нормы, как в указанном примере? Брать по максимальной размерности? Да и после цикла же в массиве приёмнике текстовые индексы не сохранятся, раз я их не узнал.
Сформулируй внятно вопрос. Я уже сказал, что многомерных массивов по сути не существует в QSP.
Хитрый Пряник,
функция же только возвращать должна, то есть присвоение должно быть, не?
Нет. Всё сложнее. Сначала выполняется переданный код. Так, как будто он бы выполнился в коде локации. Т.о. выполняется вычисление выражения и вывод результата на экран.
В переменную “b” ничего не запишется, так как возвращать вычисленное выражение нужно через переменную “RESULT”.
Правильный код выглядит так:
a = 7
b = DYNEVAL("RESULT = a + 1")
В документации это подробно описано.
Чтобы понять принцип, можно представить DYNAMIC и DYNEVAL “динамическими” аналогами операторов GOSUB и FUNC соответственно.
Понял, спасибо. Я пользовался функцией и там возвращал всё, выводя в result
Тут как-то невкурил из документации, что result нужно задействовать.
Но это рвёт мои шаблоны, ибо просто строчка в коде локации 2+3 не должна выводить ничего (или ошибку), ибо никто не командовал делать вывод же! Посчитал и молодец, сиди молчи :) Ровно так же, как не выводит текст, вписанный в код напрямую.
Хитрый Пряник,
2+3
'абырвалг'
выведет на экран
5
абырвалг
Хоть в “обычном” коде локации, хоть в динамическом. Выражение, стоящее “само по себе”, по умолчанию выводится в основное описание.
Мда, с одномерными массивами печаль (настолько неожиданно, что я сразу и не понял), даже для плоской карты уже костыль нужен с имитацией двухмерного. Ну да ладно.
Про убийство элемента массива нашёл, странный синтаксис вместо кристально понятного killvar ’$a[1]’, ну да ладно, зато проще чистить в цикле через killvar ‘$a’,i
Про выражение учту. Тоже не ясно было, ибо существует оператор *p, да и смешивание мух с котлетами кода с прямым текстом по-моему.
Всем привет и с новым годом!
Можно ли настроить фиксированный размер рабочих окошек? А то каждый раз приходится вручную раздвигать.
Еще раз здрасьте! :cool:
Как можно привязывать события к времени? Например, ГГ говорят прийти завтра, или на следующей неделе, а сделать это без танцев с бубном как-то не выходит. Ведь должен же быть адекватный способ. Время у меня представлено так:
Spoiler
!Время
if hour >= 24:
hour -= 24
weekday += 1
number += 1
end
if minutes > 5:
hour += 1
minutes = 0
end
:loop_weekday
if weekday >= 8:
weekday -= 7
jump ‘loop_weekday’
end
:loop_number
if number >= 31:
number -= 30
month += 1
penaltyPoints-=10
if penaltyPoints<0: penaltyPoints=0
jump ‘loop_number’
end
:loop_year
if month >= 13:
month -= 12
year += 1
jump ‘loop_year’
end
!Дни недели
if weekday = 1: $weekday = ‘Понедельник’
if weekday = 2: $weekday = ‘Вторник’
if weekday = 3: $weekday = ‘Среда’
if weekday = 4: $weekday = ‘Четверг’
if weekday = 5: $weekday = ‘Пятница’
if weekday = 6: $weekday = ‘Суббота’
if weekday = 7: $weekday = ‘Воскресенье’
1. Убираешь все эти лупы.
2. Время делаешь как описано в примерах кода: Игровое время.
3. Условия “приходи завтра”, “приходи на следующей неделе”:
! Если меч ещё не ковали,
IF меч_куётся = 0:
меч_куётся = 1
деньги = деньги - 1500
! Засекаем время первого визита, в днях (в какой день пришёл).
пришёл_в_первый_раз = время/(24*60)
'Кузнец почесал бороду и говорит: - Будет тебе меч. Приходи завтра.'
END
! При следующем визите, проверяем, что меч куётся, и что наступил следующий день.
сегодняшний_день = время/(24*60)
IF (меч_куётся = 1) AND (сегодняшний_день - пришёл_в_первый_раз >= 1) AND (меч_получил = 0):
меч_получил = 1
! Наступил следующий день.
'Кузнец увидел тебя, усмехнулся и кивком показал на стол. Прекрасный клинок. То, что нужно!'
ADDOBJ 'меч'
END
! Условие "через неделю" (прошло семь дней):
IF ... (сегодняшний_день - пришёл_в_первый_раз >= 7) ... :
! Условие "следующая неделя" (началась новая неделя, прошло от одного до семи дней).
! Засекаем время в неделях.
пришёл_в_первый_раз = (время/(24*60))/7
...
текущая_неделя = (время/(24*60))/7
...
IF ... (текущая_неделя - пришёл_в_первый_раз >= 1) ... :
Как вариант. попробую, спасибо.
Только вот не ясно, почему
! 2440 минут = 1 день + 16 часов + 40 минут
Почему именно 2440, и почему 16 часов и 40 минут?) Можно, конечно, тупо скопировать пример и не париться, но хочется понять прежде, чем делать. Спасибо :)