Массив Visual Foxpro [] или ( )

В приложении Visual Foxpro один из пользователей получает ошибку (остальные нет). И я верю в это, потому что массивы используются в форме arr(number) вместо arr[number] . Кто-нибудь знает, что вызывает это странное поведение у одного пользователя?

Спасибо!


person Mark    schedule 09.08.2010    source источник
comment
Насколько я знаю, нет никакой разницы между использованием [] и (). Их можно использовать взаимозаменяемо.   -  person EddieC    schedule 19.08.2010
comment
Что за сообщение об ошибке?   -  person Tom Cerul    schedule 10.03.2015


Ответы (3)


Foxpro не делает различий между ними. На самом деле это задокументировано как в DIMENSION и комментарии команд DECLARE.

На самом деле, документация так или иначе строго не следует. Команды DIMENSION и DECLARE определяют синтаксис с круглыми скобками ().

DIMENSION ArrayName1(nRows1 [, nColumns1]) [AS cType]
   [, ArrayName2(nRows2 [, nColumns2])] ...

Но пример, приведенный в разделе Массивы в документации используются скобки [].

DIMENSION ArrayName[5,2]
ArrayName[1,2] = 966789
person jveazey    schedule 27.10.2010
comment
Документация строго следует соглашению о том, что вещи между [] являются необязательными параметрами, на самом деле это не имеет никакого отношения к вопросу. - person Rudi Visser; 14.06.2012
comment
@rudi_visser Пожалуйста, прочитайте это еще раз. Если вы посмотрите на объявление — игнорируя необязательные параметры, оно использует круглые скобки. Затем, если вы посмотрите на пример, в нем используются квадратные скобки. - person jveazey; 21.06.2012

Любое использование ссылок на массив допустимо, если оно правильно сбалансировано как () или []. Проблема, вероятно, в восходящем потоке, где массив объявляется или подготавливается. Мне приходилось отлаживать исторически странные случаи, подобные этому, когда один пользователь выполнял процесс совершенно иначе, чем другие, и бизнес-процесс... Во всяком случае, из-за какого-то «обойденного» процесса массив не был создается и, таким образом, вызывает сбой.

Всегда ли происходит сбой в одном и том же месте в процессе?

Я бы настоятельно рекомендовал отлавливать ошибки в процессе для этого «одного» пользователя. Хуже того, я бы поместил что-то в область кода что-то вроде...

if atc( "PersonsLoginName", sys(0)) > 0
   TurnOnMyCustomDebugging()   && for this special scenario trapping
endif 

Кроме того, я не знаю, что у вас есть для процедур перехвата ошибок, но я бы получил дамп памяти во время ошибки и полный стек вызовов, который привел пользователя к этому моменту. Если вам нужна помощь в этом, дайте мне знать тоже.

person DRapp    schedule 10.08.2010

Я не понял, почему этот вопрос был «поднят» с 2010 года. Может быть, потому, что это своего рода «основы VFP» и нужны подробности?

Ответы уже хорошие. Можно использовать [] и (). Это в первую очередь предпочтение.

VFP на самом деле даже не важно, обозначает ли имя и массив. Это может быть функция, принимающая один или два целочисленных параметра (1..N). Однако, если в области видимости есть массив, он имеет приоритет. Пример:

Dimension Dummy[10]
? Dummy[5]    && prints .F. - array members are not initialized
Dummy[2] = 6  && sets array member
? Dummy[2]    && prints 6
Release Dummy && array variable released

? Dummy[5]    && prints 10 - procedure is called
* Dummy[2] = 6  && error - variable does not exists
? Dummy[2]    && prints 4 - procedure is called

Procedure Dummy(tnDim1)
   Return m.tnDim1 * 2
endproc

Не имеет значения, использовали ли вы [] или () для массива или функции (или процедуры - в VFP процедура и функция также не имеют разницы, и принимают параметры, и возвращают результат).

Согласно вопросу OP, у одного пользователя не будет другого результата только потому, что [] или () используется.

person Cetin Basoz    schedule 24.05.2018