Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Функция, возвращающая массив / 4 сообщений из 4, страница 1 из 1
27.03.2007, 18:02
    #34419349
Kaiden
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция, возвращающая массив
Здравствуйте! Очень нужна помощь по FoxPro, в котором я абсолютный новичёк.

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

Код: plaintext
1.
DIMENSION xa( 10 )
xa = makelist("items", "producer", "Неизвестен")

Сама функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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
...
Рейтинг: 0 / 0
27.03.2007, 18:23
    #34419412
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция, возвращающая массив
Массив можно передать только по ссылке.

Код: plaintext
Return @Ready
...
Рейтинг: 0 / 0
27.03.2007, 19:52
    #34419661
alex11100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция, возвращающая массив
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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 
...
Рейтинг: 0 / 0
28.03.2007, 10:52
    #34420616
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция, возвращающая массив
Массив из функции вернуть нельзя, можно только одну переменную. Но эта переменная может быть объектом, содержащим в себе свойство типа массив.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
* Тестовая таблица
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

Или, как предложили ранее ответившие, передавать внутрь функции ранее созданный массив по ссылке. В этом случае изменения массива внутри функции будут "видны" во вне функции.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Функция, возвращающая массив / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]