Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Массив

0 views
Skip to first unread message

Serg Stepanov

unread,
May 31, 2006, 5:57:28 AM5/31/06
to
Hi All,

Что-то я не могу въехать, можно ли убрать размерность массива, но не убирать
его из памяти. Короче ситуация, в основной программе объявляется переменная
MyArray, затем в процедуре начинается заполнение массива, но перед заполнением
надо убрать его размерость...
* Main programm
public MyArray
do Slave_prg
return

Slave_prg
do while !eof()
IF TYPE("MyArray(1)")="U"
DIMENSION MyArray(1)
MyArray(1)=ser
else
IF ASCAN(MyArray,ser)=0
DIMENSION MyArray(ALEN(MyArray)+1)
MyArray(ALEN(MyArray))=ser
ENDIF
endif
skip
enddo
return

PS: Пример сокращён до минимума, чтоб оставить второстепенные вопросы(типа,
тоже самое можно сделать группировкой SQL(переменная ser, собирается из многих
параметров и таблиц и оператор SQL, будет сложен), и т.д...) и оставить
главное "можно(а как) или нельзя"

Andrew Matveev

unread,
May 31, 2006, 8:45:28 AM5/31/06
to
Пpивет, Serg.

Wednesday May 31 2006 13:57, Serg Stepanov wrote to All:
SS> Что-то я не могу въехать, можно ли убpать pазмеpность массива, но не
SS> убиpать его из памяти. Коpоче ситуация, в основной пpогpамме объявляется
SS> пеpеменная MyArray, затем в пpоцедуpе начинается заполнение массива, но
SS> пеpед заполнением надо убpать его pазмеpость...
Можно пpевpатить в одноименную пеpеменную - но тогда поломаются функции pаботы
с массивом. Лучше не так - заведи счетчик ячеек и пользуй.

Пpимеpно так

DIMENSION MyArray(1)
MyArray = .F. && потом можешь пpовеpить Type("MyArray[1]") - если "L", значит,
не было занесенных в массив значений.

PTR = 0
do while !eof()
IF PTR = 0 OR ASCAN(MyArray,ser)=0 && если PTR = 0, то ascan() не делается
PTR = m.PTR + 1
DIMENSION MyArray[ m.PTR ]
MyArray[ m.PTR ] = ser
EndIf
skip
enddo

Счастливо. Andrew.

Andrew Matveev

unread,
May 31, 2006, 7:59:20 AM5/31/06
to

Oleg Tsurkan

unread,
May 31, 2006, 1:45:30 PM5/31/06
to
Привет All!

31 май 06 13:57 Serg Stepanov в своем письме к All писал:
SS> Что-то я не могу въехать, можно ли убрать размерность массива, но не
А не проще ли будет завести курсор, проиндексировать его (AFAIK в FPD такое
на ура проходит, но можно и просто временную табличку, не суть), да и делать IF
!SEEK()/INSERT SQL/ENDIF, а наличие по имени проверять (USED(...)/RECC(...)) ?
Оно как-то концептуальнее, чем с массивами возиться, и быстрее при больших
объемах, и писанины меньше.

С уважением, Oleg 31 май 06 года

Vladimir Maksimov

unread,
May 31, 2006, 2:20:42 PM5/31/06
to
Wed May 31 2006 13:57, Serg Stepanov wrote to All:

SS> From: "Serg Stepanov" <mi...@postkk.krasnoyarsk.ru>

SS> Hi All,

SS> Что-то я не могу въехать, можно ли убрать размерность массива, но не
SS> убирать его из памяти. Короче ситуация, в основной программе объявляется
SS> переменная MyArray, затем в процедуре начинается заполнение массива, но
SS> перед заполнением надо убрать его размерость...
SS> * Main programm
SS> public MyArray
SS> do Slave_prg
SS> return

SS> Slave_prg
SS> do while !eof()
SS> IF TYPE("MyArray(1)")="U"
SS> DIMENSION MyArray(1)
SS> MyArray(1)=ser
SS> else
SS> IF ASCAN(MyArray,ser)=0
SS> DIMENSION MyArray(ALEN(MyArray)+1)
SS> MyArray(ALEN(MyArray))=ser
SS> ENDIF
SS> endif
SS> skip
SS> enddo
SS> return

Массив не может иметь нулевую размерность. В подобных задачах обычно использую
массив с размерностью на единицу больше, чем необходимо. Т.е. последний
элемент массива всегда имеет значение .F.

В этом случае достаточно проверять не факт наличия/отсутствия массива (он есть
_всегда_) и даже не содержимое его первого элемента, а просто размерность
массива. Если он имеет только 1 элемент, значит еще не заполнялся.

Если версия FoxPro не ниже 8, то рассмотри вариант использования коллекций
(Collection - это класс). Они могут не содержать вообще ни одного члена.

Кроме того, возможно, имеет смысл рассмотреть вариант

SELECT DISTINCT ser FROM MyTab INTO ARRAY MyArray

Команда Select-SQL автоматически подгонит размерность ранее созданного массива
под нужное количество итоговых элементов. Хотя, если по результату запроса нет
ни одного элемента (в этом случае сразу после запроса _TALLY=0) размерность и
содержание массива не изменится.

Опять же, может быть проще будет работать не с массивом, а с курсором. FoxPro
- это все-таки СУБД. И "заточена" она под работу с таблицами. Работа с
массивами будет по любому медленнее.

Oleg Tsurkan

unread,
May 31, 2006, 1:45:30 PM5/31/06
to
Пpивет All!

31 май 06 13:57 Serg Stepanov в своем письме к All писал:

SS> Что-то я не могу въехать, можно ли убpать pазмеpность массива, но не
А не пpоще ли будет завести куpсоp, пpоиндексиpовать его (AFAIK в FPD такое
на уpа пpоходит, но можно и пpосто вpеменную табличку, не суть), да и делать IF
!SEEK()/INSERT SQL/ENDIF, а наличие по имени пpовеpять (USED(...)/RECC(...)) ?
Оно как-то концептуальнее, чем с массивами возиться, и быстpее пpи больших

Serg Stepanov

unread,
May 31, 2006, 9:00:26 PM5/31/06
to
Спасибо за советы...

0 new messages