:: Visual Foxpro, Foxpro for DOS
Возврат массива из метода
lemenev
Автор

Сообщений: 229
Дата регистрации: 23.06.2022
С удивлением обнаружил возможность возвращать массив из метода через команду RETURN. При этом создаётся новый массив.
* Возврат массива из метода
as = CREATEOBJECT('MyArray')
as.MakeArr()
DEFINE CLASS MyArray AS Custom
DIMENSION arr(1)
arr = ''
PROCEDURE MakeArr
* Заводится совершенно новый массив BB
BB = This.NewArr(3,2)
NN = ALEN('BB')
FOR i = 1 TO NN
? BB(i)
ENDFOR
* Заводится другой массив CC
CC = This.NewArr(3,4)
* Сравним значения в двух массивах
? BB(2), CC(2)
ENDPROC
PROCEDURE NewArr( Kolvo AS Integer, Stepen AS Integer) AS Array
DIMENSION This.Arr(Kolvo)
FOR i = 1 TO Kolvo
This.Arr(i) = i**Stepen
ENDFOR
RETURN @This.Arr && Знак @ обязателен!
ENDPROC
ENDDEFINE
Ratings: 0 negative/2 positive
Re: Возврат массива из метода
krin

Сообщений: 190
Дата регистрации: 08.02.2005
Help -> RETURN command -> Example 2
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
Burn

Сообщений: 5669
Откуда: Днепр
Дата регистрации: 02.01.2002
Интересно. Но я, когда не получилось, просто возвращаю объект, созданный в процедуре
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Такая функция тоже создает массив с заданным именем:
LOCAL myarray
= MakeArray(@myarray, 3)
FUNCTION MakeArray (arrname, kolvo)
DIMENSION arrname[kolvo]
Ratings: 0 negative/1 positive
Re: Возврат массива из метода
lemenev
Автор

Сообщений: 229
Дата регистрации: 23.06.2022
Для krin
В моём Help в справке по RETURN нет примеров. А в Help-online здесь на сайте есть, но в него я полез только когда вы мне указали. У меня Help в заголовке пишет:
Цитата:
MS-VFP91, Русский Перевод (RH-Final+Add, ShmSoft-80124)
И в нём очень много опечаток. Кто может поделиться более поздней версией?

Для akvvohinc
Такого я тоже не знал. Спасибо.
Я использовал только передачу через параметр в подпрограмму ранее определённый в головной программе массив.



Исправлено 1 раз(а). Последнее : lemenev, 19.11.24 22:05
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
А вот то же самое, но чуть иначе (аналог версии с методом класса):
myArray = retarr[3]
FUNCTION retarr (kolvo)
DIMENSION arr[kolvo]
RETURN @arr



Исправлено 1 раз(а). Последнее : akvvohinc, 20.11.24 00:37
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
kornienko_ru

Сообщений: 415
Откуда: Владивосток
Дата регистрации: 06.09.2015
akvvohinc
А вот то же самое, но чуть иначе (аналог версии с методом класса):
myArray = retarr[3]
Я бы так предпочел:
dimension myArray[1]
=retarr (3)
FUNCTION retarr (kolvo)
DIMENSION myArray[kolvo]
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
Joys

Сообщений: 3571
Дата регистрации: 25.06.2000
lemenev
В моём Help в справке по RETURN нет примеров. А в Help-online здесь
[attachment 36999 ShmSoft-80124_241120063200.png]
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
kornienko_ru
Я бы так предпочел
На мой взгляд, смысла в такой функции нет.
Вместо этого я бы написал просто
dimension myArray[3]

Ведь суть этой темы как раз в том, что массив создается внутри функции (метода), а не напрямую.
Но остается обсудить ещё главное - в каких случаях это может потребоваться или просто быть удобным.



Исправлено 1 раз(а). Последнее : akvvohinc, 20.11.24 08:16
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
AndyNigmatec

Сообщений: 1675
Откуда: Волгоград
Дата регистрации: 28.06.2015
ну это как бы давно известный фокус ...

FUNCTION xxxx
LPARAMETERS tcArrayName
* Трюк для передачи массива данных обратно в диапазон ячеек Excel.
RETURN @&tcArrayName
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Трюк для передачи массива данных обратно в диапазон ячеек Excel.
Да.
А что-нибудь кроме этого?
Например, оставаясь в рамках "только Фокса"?
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
Владимир Максимов

Сообщений: 14146
Откуда: Москва
Дата регистрации: 02.09.2000
akvvohinc
Цитата:
Трюк для передачи массива данных обратно в диапазон ячеек Excel.
Да.
А что-нибудь кроме этого?
Например, оставаясь в рамках "только Фокса"?

Так все случаи, когда надо получить список чего-либо, но по каким-то причинам использование курсора невозможно. Для примера, стандартные функции FoxPro: AFIELDS(), ALINES(), ADATABASES() и т.п. Вот что-то аналогичное...
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Владимир Максимов
Так все случаи, когда надо получить список чего-либо, но по каким-то причинам использование курсора невозможно. Для примера, стандартные функции FoxPro: AFIELDS(), ALINES(), ADATABASES() и т.п. Вот что-то аналогичное...
Автор писал:
Цитата:
С удивлением обнаружил возможность возвращать массив из метода через команду RETURN.

А для указанных вами случаев не требуется возврат через RETURN @array.
Достаточно передать в функцию переменную по ссылке, как в примере, который я привел выше:
LOCAL myarray
= MakeArray(@myarray) && на выходе получаем массив, созданный в функции
FUNCTION MakeArray (arrname)
* создаем массив arrname любым способом
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
Владимир Максимов

Сообщений: 14146
Откуда: Москва
Дата регистрации: 02.09.2000
akvvohinc
А для указанных вами случаев не требуется возврат через RETURN @array.
Достаточно передать в функцию переменную по ссылке, как в примере, который я привел выше:

Передача по ссылке исходящего параметра - это от безысходности. Когда нет других вариантов. Функция сама должна сформировать и вернуть все, что нужно. Собственно, а зачем в этом случае переменная-то нужна? Делайте курсор, а функция его будет наполнять

Одно дело подготовить входные параметры, и совсем другое готовить исходящие параметры. Просто к этому настолько привыкли, что не замечают порочность такого подхода. Функция получается зависимая от внешнего контекста, чего быть не должно.
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
lemenev
Автор

Сообщений: 229
Дата регистрации: 23.06.2022
akvvohinc
myArray = retarr[3]
FUNCTION retarr (kolvo)
DIMENSION arr[kolvo]
RETURN @arr
К сожалению, ваш метод с подпрограммой не работает. Выдаёт ошибку: «'ARR' не является массивом» на команде myArray = retarr[3]
Данный трюк работает только с методами класса.
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
lemenev
К сожалению, ваш метод с подпрограммой не работает. Выдаёт ошибку: «'ARR' не является массивом» на команде myArray = retarr[3]
Данный трюк работает только с методами класса.
Значит, этот способ "забываем".
Я тоже при проверке получал это сообщение, но при последующих манипуляциях с кодом ошибка "ушла".
Видимо, массив ARR в какой-то момент остался в памяти как глобальный (я работал в командном окне).
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
akvvohinc

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
Владимир Максимов
Функция получается зависимая от внешнего контекста, чего быть не должно.
В чем конкретно (в каком внешнем контексте) вы видите разницу между:
MakeArray(@array)
и, скажем
ALINES(array, ...)
?

Только в том, что в первом случае переменная array должна быть определена перед вызовом, а во втором - может и не быть определена?
Если так, то можно указать и на минус второго варианта - областью действия массива в этом случае (Local, Private, Public) вы не можете управлять.
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
andrewk

Сообщений: 221
Откуда: Красноярск
Дата регистрации: 15.05.2005
upd: ой, пока писал этот пост уже три раза ответили))
----
akvvohinc
А вот то же самое, но чуть иначе (аналог версии с методом класса):
myArray = retarr[3]
FUNCTION retarr (kolvo)
DIMENSION arr[kolvo]
RETURN @arr
И это работает?

Владимир Максимов
Передача по ссылке исходящего параметра - это от безысходности.
Как-то печально звучит)

Владимир Максимов
Одно дело подготовить входные параметры, и совсем другое готовить исходящие параметры. Просто к этому настолько привыкли, что не замечают порочность такого подхода. Функция получается зависимая от внешнего контекста, чего быть не должно.
Простейшие примеры навскидку:
1. Из функции нужно вернуть не одно, а несколько значений. Как это сделать в Фоксе? Вариант:
Local v1,v2,v3
If fun(@v1, @v2, @v3)
? v1, v2, v3
Else
? "облом"
EndIf
Ну можно вместо этого массив, можно Empty-объект, можно курсор. В каких-то случаях это имеет смысл. В каких-то нет. Мы заранее готовим не исходящий из функции параметр, а «место», куда она поместит результат, и передаём ей это место – разумеется, по ссылке. Кстати, по такому принципу работает огромное количество WinAPI-функций.

2. Функция возвращает пусть и одно значение, но сама она находится в другом prg, который нельзя прописать по set proc to. Придётся делать так:
local v1
do fun in another.prg with v1
Смысл как в предыдущем примере, но причина другая.

В чём здесь зависимость функции от внешнего контекста? В чём порочность?



Исправлено 1 раз(а). Последнее : andrewk, 20.11.24 15:34
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
Владимир Максимов

Сообщений: 14146
Откуда: Москва
Дата регистрации: 02.09.2000
akvvohinc
Владимир Максимов
Функция получается зависимая от внешнего контекста, чего быть не должно.
В чем конкретно (в каком внешнем контексте) вы видите разницу между:

В самом подходе. В самой идее работы с функцией. Не важно, насколько сложно/просто это в реализации

Одно дело, если функция сама все подготовит и вернет значение. И совсем другое, если необходим предварительно подготовить "посадочную площадку" для приема значения.

Если функция сама все делает, то не возникает разных "недоразумений" вида "не то", "не там".

В случае, если надо готовить переменную до вызова функции - это держится "на честном слове". На дисциплине разработчика
Ratings: 0 negative/0 positive
Re: Возврат массива из метода
Владимир Максимов

Сообщений: 14146
Откуда: Москва
Дата регистрации: 02.09.2000
andrewk
Владимир Максимов
Одно дело подготовить входные параметры, и совсем другое готовить исходящие параметры. Просто к этому настолько привыкли, что не замечают порочность такого подхода. Функция получается зависимая от внешнего контекста, чего быть не должно.
Простейшие примеры навскидку:
1. Из функции нужно вернуть не одно, а несколько значений.
(...)

О чем я и говорю. "Привычка". Вы не видите проблемы, поскольку просто привыкли к такому стилю программирования.

Массив, возврат которого здесь обсуждается, как раз и содержит "много" значений. Причем не обязательно одного типа

andrewk
Кстати, по такому принципу работает огромное количество WinAPI-функций.

Сравнивать разные языки программирования - бессмысленное занятие. И крайне вредно переносить "привычки" приобретенные в одном языке в разработку на другом.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 26 (Гостей: 26)

© 2000-2025 Fox Club 
Яндекс.Метрика