// 2025-2026 Богданович Давид Когут Прихожденко
взяти визначення мавка;
простір мавка {
дія знайти_задіяне(
М: *Машина,
задіяні: Задіяні,
позиція: п32,
назва: *ПредметТексту,
вихід_значення: *Значення
) -> логічне {
змінна розмір_позиційних = задіяні.розмір - (задіяні.кількість_імен * 2);
змінна знайдено = ні;
якщо розмір_позиційних > позиція {
вихід_значення::вміст = задіяні.дані[позиція];
знайдено = так;
}
якщо задіяні.кількість_імен > 0 {
змінна п: п32 = 0;
поки п < задіяні.кількість_імен {
змінна елемент = задіяні.дані[розмір_позиційних + задіяні.кількість_імен + п].дані як *Предмет як *ПредметТексту;
якщо порівняти_тексти(М, елемент, назва) {
вихід_значення::вміст = задіяні.дані[розмір_позиційних + п];
вернути так;
}
п += 1;
}
}
вернути знайдено;
}
дія знайти_задіяне_як_число(
М: *Машина,
задіяні: Задіяні,
позиція: п32,
назва: *ПредметТексту,
вихід_значення: *р64
) -> логічне {
змінна значення: мавка::Значення;
змінна знайдено: логічне;
знайдено = знайти_задіяне(
М,
задіяні,
позиція,
назва,
значення::адреса,
);
якщо не знайдено {
вернути ні;
}
вихід_значення::вміст = отримати_число(
М,
значення,
Місцезнаходження { пусто як *ПредметДаних, 0 },
);
вернути так;
}
дія отримати_задіяне_як_число(
М: *Машина,
задіяні: Задіяні,
позиція: п32,
назва: *ПредметТексту,
вихід_значення: *р64
) {
змінна значення: мавка::Значення;
змінна знайдено: логічне;
знайдено = знайти_задіяне(
М,
задіяні,
позиція,
назва,
значення::адреса,
);
якщо не знайдено {
вихід_значення::вміст = 0.0;
вернути;
}
вихід_значення::вміст = отримати_число(
М,
значення,
Місцезнаходження { пусто як *ПредметДаних, 0 },
);
}
дія знайти_задіяне_як_текст(
М: *Машина,
задіяні: Задіяні,
позиція: п32,
назва: *ПредметТексту,
вихід_значення: **ПредметТексту
) -> логічне {
змінна значення: мавка::Значення;
змінна знайдено: логічне;
знайдено = знайти_задіяне(
М,
задіяні,
позиція,
назва,
значення::адреса,
);
якщо не знайдено {
вернути ні;
}
вихід_значення::вміст = отримати_текст(
М,
значення,
Місцезнаходження { пусто як *ПредметДаних, 0 },
);
вернути так;
}
дія отримати_задіяне_як_текст(
М: *Машина,
задіяні: Задіяні,
позиція: п32,
назва: *ПредметТексту,
вихід_значення: **ПредметТексту
) {
змінна значення: мавка::Значення;
змінна знайдено: логічне;
знайдено = знайти_задіяне(
М,
задіяні,
позиція,
назва,
значення::адреса,
);
якщо не знайдено {
вихід_значення::вміст = М.константи_назв._недійсне;
вернути;
}
вихід_значення::вміст = отримати_текст(
М,
значення,
Місцезнаходження { пусто як *ПредметДаних, 0 },
);
}
дія знайти_задіяне_як_ю8(
М: *Машина,
задіяні: Задіяні,
позиція: п32,
назва: *ПредметТексту,
вихід_значення: *ю8
) -> логічне {
змінна значення: мавка::Значення;
змінна успіх: логічне;
змінна пт: *мавка::ПредметТексту;
змінна позиція_помилки: природне;
успіх = знайти_задіяне(
М,
задіяні,
позиція,
назва,
значення::адреса,
);
якщо не успіх {
вернути ні;
}
пт = отримати_текст(
М,
значення,
Місцезнаходження { пусто як *ПредметДаних, 0 },
);
якщо М.стан_падіння {
вернути так;
}
успіх = мавка::перекодувати_кд_в_ю8(
М,
пт.значення,
вихід_значення,
позиція_помилки::адреса
);
якщо не успіх {
МІСЦЕПАДІННЯ(М, створити_текст(М, "Не вдалось перекодувати задіяне в ю8."), Місцезнаходження { пусто як *ПредметДаних, 0 });
вернути так;
}
вернути так;
}
дія отримати_задіяне_як_ю8(
М: *Машина,
задіяні: Задіяні,
позиція: п32,
назва: *ПредметТексту,
вихід_значення: *ю8
) {
змінна значення: мавка::Значення;
змінна успіх: логічне;
змінна пт: *мавка::ПредметТексту;
змінна позиція_помилки: природне;
успіх = знайти_задіяне(
М,
задіяні,
позиція,
назва,
значення::адреса,
);
якщо успіх {
пт = отримати_текст(
М,
значення,
Місцезнаходження { пусто як *ПредметДаних, 0 },
);
якщо М.стан_падіння {
вернути;
}
} інакше {
пт = М.константи_назв._недійсне;
}
успіх = мавка::перекодувати_кд_в_ю8(
М,
пт.значення,
вихід_значення,
позиція_помилки::адреса
);
якщо не успіх {
МІСЦЕПАДІННЯ(М, створити_текст(М, "Не вдалось перекодувати задіяне в ю8."), Місцезнаходження { пусто як *ПредметДаних, 0 });
}
}
дія перебрати_позиційні_задіяні(
М: *Машина,
задіяні: Задіяні,
дія_перебору: ДіяПереборуПозиційнихЗадіяних,
аргумент: адреса
) {
змінна розмір_позиційних = задіяні.розмір - (задіяні.кількість_імен * 2);
змінна п: п32 = 0;
поки п < розмір_позиційних {
дія_перебору(
М,
задіяні,
розмір_позиційних,
п,
задіяні.дані[п],
аргумент
);
п += 1;
}
}
дія перебрати_іменовані_задіяні(
М: *Машина,
задіяні: Задіяні,
дія_перебору: ДіяПереборуІменованихЗадіяних,
аргумент: адреса
) {
змінна розмір_позиційних = задіяні.розмір - (задіяні.кількість_імен * 2);
змінна п: п32 = 0;
поки п < розмір_позиційних {
дія_перебору(
М,
задіяні,
розмір_позиційних + задіяні.кількість_імен + п,
задіяні.дані[розмір_позиційних + задіяні.кількість_імен + п].дані як *Предмет як *ПредметТексту,
задіяні.дані[розмір_позиційних + п],
аргумент
);
п += 1;
}
}
дія звільнити_задіяні(
М: *Машина,
задіяні: Задіяні
) {
якщо задіяні.вид == ВидЗадіяних1 {
вернути; // задіяні з накопичувача діяльності не можна звільняти
}
якщо задіяні.дані != пусто {
звільнити(М, задіяні.дані);
}
}
}