RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2435159 views

Хитрый Пряник #1300 25.12.2014 23:22 (11 years ago)

Возможно ли присвоить массив части другого массива. То есть двумерный массив в строку трёхмерного?
Если нельзя, то как эффективнее сделать такую копию в условиях, когда неизвестно, какие ячейки заняты и как называются/пронумерованы? 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'
Хитрый Пряник #1300 26.12.2014 00:29 (11 years ago)

И просто любопытный пример:

$a[0]=''
$a[1]=''

*nl 'size='+arrsize('a')

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

Хитрый Пряник,

двумерный массив в строку трёхмерного

все массивы одномерные. Многомерность можно только имитировать, например с помощью строковых индексов.
Примеры массивов, многомерные массивы

Как узнать индекс 5й ячейки в примере, чтобы его скопировать?

Индекс 5й ячейки будет 5.
Если же тебе нужно вычислить числовой индекс, соответствующий известному строковому индексу, делается так:
1. Сохраняем текущее значение ячейки с указанным строковым индексом во вспомогательную переменную.
2. Записываем в эту ячейку какое-нибудь уникальное значение, которое точно не встречается в массиве.
3. Ищем числовой индекс с помощью функции ARRPOS по уникальному значению.
4. Возвращаем на место оригинальное значение.
При желании, в этот алгоритм можно добавить проверку на то, была ли изначально заполнена ячейка массива.

Возможно ли присвоить массив части другого массива

COPYARR

Удалить эти пустые ячейки в конце нельзя

Можно.

KILLVAR '$a'
Хитрый Пряник #1300 26.12.2014 01:50 (11 years ago)

Nex:

Индекс 5й ячейки будет 5.

Мне нужно узнать строковый индекс, соответствующий числовому

Этот код

KILLVAR '$a'

Убъёт весь массив, а не только пустые ячейки в конце него.

За CopyArr спасибо, что-то я в старую справку глядел, там не было.
Но оно же заменяет значения первого массива а не дополняет их.

Однако, раз массив одномерный, значит можно просто циклом пройтись? Но как тогда выудить элементы array1 для случая, когда нет нормы, как в указанном примере? Брать по максимальной размерности? Да и после цикла же в массиве приёмнике текстовые индексы не сохранятся, раз я их не узнал.

Хитрый Пряник #1300 26.12.2014 03:05 (11 years ago)

Почему сей код выводит в окно «8»?

a=7
b=dyneval("a+1")

функция же только возвращать должна, то есть присвоение должно быть, не?

Мне нужно узнать строковый индекс, соответствующий числовому

Приведи практический пример. Не абстрактный, а реальную задачу.

Этот код … Убъёт весь массив, а не только пустые ячейки в конце него.

С помощью этого же оператора ты можешь очистить выборочно ячейки по любым индексам. Загляни в справку.

За CopyArr спасибо, что-то я в старую справку глядел, там не было.
Но оно же заменяет значения первого массива а не дополняет их.

Однако, раз массив одномерный, значит можно просто циклом пройтись? Но как тогда выудить элементы array1 для случая, когда нет нормы, как в указанном примере? Брать по максимальной размерности? Да и после цикла же в массиве приёмнике текстовые индексы не сохранятся, раз я их не узнал.

Сформулируй внятно вопрос. Я уже сказал, что многомерных массивов по сути не существует в QSP.

Хитрый Пряник,

функция же только возвращать должна, то есть присвоение должно быть, не?

Нет. Всё сложнее. Сначала выполняется переданный код. Так, как будто он бы выполнился в коде локации. Т.о. выполняется вычисление выражения и вывод результата на экран.
В переменную “b” ничего не запишется, так как возвращать вычисленное выражение нужно через переменную “RESULT”.
Правильный код выглядит так:

a = 7
b = DYNEVAL("RESULT = a + 1")

В документации это подробно описано.
Чтобы понять принцип, можно представить DYNAMIC и DYNEVAL “динамическими” аналогами операторов GOSUB и FUNC соответственно.

Хитрый Пряник #1300 26.12.2014 03:42 (11 years ago)

Понял, спасибо. Я пользовался функцией и там возвращал всё, выводя в result
Тут как-то невкурил из документации, что result нужно задействовать.

Но это рвёт мои шаблоны, ибо просто строчка в коде локации 2+3 не должна выводить ничего (или ошибку), ибо никто не командовал делать вывод же! Посчитал и молодец, сиди молчи :) Ровно так же, как не выводит текст, вписанный в код напрямую.

Хитрый Пряник,

2+3
'абырвалг'

выведет на экран

5
абырвалг

Хоть в “обычном” коде локации, хоть в динамическом. Выражение, стоящее “само по себе”, по умолчанию выводится в основное описание.

Хитрый Пряник #1300 26.12.2014 04:39 (11 years ago)

Мда, с одномерными массивами печаль (настолько неожиданно, что я сразу и не понял), даже для плоской карты уже костыль нужен с имитацией двухмерного. Ну да ладно.

Про убийство элемента массива нашёл, странный синтаксис вместо кристально понятного 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 минут?) Можно, конечно, тупо скопировать пример и не париться, но хочется понять прежде, чем делать. Спасибо :)

Log in or Register to post comments.