ранее я добился работы с переменной по ссылке, вот:
Procedure.s TrimRight(*a, n) Protected *p.string = @*a *p\s = Left(*p\s, Len(*p\s) - n) EndProcedure Define x.s = "Привет" TrimRight(@x, 2) Debug x
То есть в примере я передаю указатель на переменную, внутри функции создаю структуру из указателя, а структура состоит из указателя на указатель переменной, далее использую указатель на строку внутри функции.
На основе этого примера делаю другие функции и они перестают работать. Долго гадал и даже переделывал на вариант ниже:
Procedure.s TrimRight(*p.string, n) *p\s = Left(*p\s, Len(*p\s) - n) EndProcedure x.string\s="Тест" TrimRight(@x, 2) Debug x\s
Здесь создаётся структура "x" и передаётся указатель на структуру, а в функции создаётся структура из указателя на структуру. То есть фактически мы передаём указатель на уже созданную структуру, а функция принимающая просто использует уже готовые данные, просто имя структуры внутри функции своё, а указатель один и тот же.
Проблема в следующем: Если строку увеличить в длине, то внутренний механизм работы со структурой строки вызовет перевыделение памяти и после этого получит новый указатель на строку, но вернёт его внутрь структуры, то есть обращаясь к структуре мы берём новый указатель на строку, и когда функция завершена в структуре уже другой указатель на строку. То есть указатель на переменную и указатель на строку внутри структуры - это не один и тот же, поэтому Debug выведет старый указатель, данные которого за счёт перевыделения уже потеряны. Для примера в функции к *p\s = "больше чем" приравнять строку длиннее чем была и результат - потеря данных. Отсюда вывод, такой приём можно использовать если длинна строку будет короче чем исходная, в противном случае надо использовать структуру строки изначально.