Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Функция, возвращающая массив  [new]
Kaiden
Member

Откуда:
Сообщений: 79
Здравствуйте! Очень нужна помощь по FoxPro, в котором я абсолютный новичёк.

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

DIMENSION xa(10)
xa = makelist("items", "producer", "Неизвестен")

Сама функция:
FUNCTION MakeList
LPARAMETERS tbName, clName, word
LOCAL inside, i
SELECT distinct(&clName) as clName FROM (tbName) INTO CURSOR incomplete ORDER BY clName
SELECT incomplete
inside = RECCOUNT()
DIMENSION ready(inside)
ready(1) = word
GO TOP 
FOR i = 2 TO inside
	ready(i) = incomplete.clName
	SKIP
ENDFOR
RETURN ready

Проблема в том, что функция возвращает не весь массив, а только его первое значение. Причём внутри функции массив заполняется верно - проверил дебаггером. Собственно, что делать? Использую VFP 7.0
27 мар 07, 18:02    [3946780]     Ответить | Цитировать Сообщить модератору
 Re: Функция, возвращающая массив  [new]
Sergey Sizov.
Guest
Массив можно передать только по ссылке.

Return @Ready
27 мар 07, 18:23    [3946906]     Ответить | Цитировать Сообщить модератору
 Re: Функция, возвращающая массив  [new]
alex11100
Guest
local array laArr(1)

if !myFunc(@laArr)
    messagebox('ошибка')
else
	for i=1 to 10
	   ? laArr(i,1)
	endfor
endif

return 

function myFunc(taArr)
 declare taArr(10,2)
 for i =1 to 10
     taArr(i,1)=i
 endfor
 return .t.
endfunc 
27 мар 07, 19:52    [3947381]     Ответить | Цитировать Сообщить модератору
 Re: Функция, возвращающая массив  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Массив из функции вернуть нельзя, можно только одну переменную. Но эта переменная может быть объектом, содержащим в себе свойство типа массив.

* Тестовая таблица
Create Cursor curTest (f1 C(10), f2 C(10))
Insert into curTest values ('один', 'три')
Insert into curTest values ('один', 'три')
Insert into curTest values ('два', 'четыре')
Insert into curTest values ('два', 'четыре')

* Вызов функции
Local loObject as Custom
loObject = MakeList('curTest','f1','слово')

* Смотрим результат

* Для версий младше VFP9 факт существования массива можно проверить так 
* IF Type("loObject.aArray[1]")<>"U"

* Для VFP9
If Type("m.loObject.aArray",1)="A"
	Local lnI
	For m.lnI=1 TO Alen(m.loObject.aArray,1)
		?m.loObject.aArray[m.lnI]
	EndFor
EndIf

* Можно скопировать массив из объекта в "обычный" массив
Local laArray(1,1)
=Acopy(m.loObject.aArray,laArray)

********************************
* Сама функция
********************************
Function MakeList
LPARAMETERS tcTabName, tcFieldName, tvValue

Local loCustom as Custom 
loCustom = CreateObject('Custom')
loCustom.AddProperty("aArray[1,1]")

Select distinct &tcFieldName ;
from (m.tcTabName) ;
into array loCustom.aArray ;
order by 1

* Теперь надо записать в первый элемент искомое слово
If _Tally <> 0
	* Сюда попадаем, если в результате выборки хоть что-то выбрано

	* Увеличиваю размерность массива на 1 строку
	Dimension loCustom.aArray(Alen(loCustom.aArray,1)+1,1)
	* Перемещаю добавленный пустой элемент на первую позицию
	=Ains(m.loCustom.aArray,1)
Else
	* Если ничего не выбрано, то размерность массива не изменилась
	* Так и остался один пустой элемент. Менять размерность не нужно.
EndIf

* Собственно запись значения в первый элемент массива
m.loCustom.aArray[1,1] = m.tvValue

Return m.loCustom

Или, как предложили ранее ответившие, передавать внутрь функции ранее созданный массив по ссылке. В этом случае изменения массива внутри функции будут "видны" во вне функции.
28 мар 07, 10:52    [3949028]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить