содержит результат работы, тем не
содержит результат работы, тем не менее при выключенной блокировке,
возвращается еще и результирующее значение. Возвращаемая строка и ее
копия некоторое время занимают рабочую память одновременно, и наиболее
неблагоприятным случаем является запрос двух смежных блоков с
размерами близкими к 64 Кбайтам.
Обойти подобную ситуацию можно вызовом CSETREF(.T.). При этом функции,
принимающие параметры по ссылке, не будут использовать память для
возвращаемого значения, т.е будут вести себя как процедуры, что в
случае длинных строк позволит сэкономить до 64 Кбайтов памяти.
Функции, управляемые CSETREF():
ADDASCII() BLANK() CHARADD()
CHARAND() CHARMIRR() CHARNOT()
CHAROR() CHARRELREP() CHARREPL()
CHARSORT() CHARSWAP() CHARXOR()
CRYPT() JUSTLEFT() JUSTRIGHT()
POSCHAR() POSREPL() RANGEREPL()
REPLALL() REPLLEFT() REPLRIGHT()
TOKENLOWER() TOKENUPPER() WORDREPL()
WORDSWAP()
Примечания
. При включении блокировки возврата значения с помощью CSETREF(.T.)
перечисленные выше функции возвращают значение NIL.
Примеры
. Выключение блокировки возврата значений:
CSETREF(.F.)
cStr1 := "HAGBDCFE"
cStr2 := CHARSORT(@cStr1)
? cStr1, cStr2 // "ABCDEFGH" (cStr1 и cStr2 одинаковы)
. Включение блокировки возврата значений:
CSETREF(.T.)
cStr1 := "HAGBDCFE"
cStr2 := CHARSORT(@cStr1)
? cStr1 // "ABCDEFGH". Отсортированная cStr1
? cStr2 // NIL
. Иллюстрация запроса большого количества памяти:
cStr1 := SPACE(32000) // Создается большая строка
CSETREF(.F.)