Индекс выходит за пределы допустимого диапазона

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
zarabsrv
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 25.06.2012 (Пн) 11:55

Индекс выходит за пределы допустимого диапазона

Сообщение zarabsrv » 25.06.2012 (Пн) 12:12

При отработке ниженаписанного кода возникает ошибка "Индекс выходит за пределы допустимого диапазона" (в строке For p = 0 To pn)
Я новичок самой начальной стадии. Не могу понять как прописать условие при котором не будет выхода за границы массива?

Код: Выделить всё
UserName = "111"
UserPass = "222"
ServerName    =    "333"
BaseName    =    "444"

pn = 10

Dim Connector
Dim AgentConnection
Dim Cluster
Dim WorkingProcess
Dim WorkingProcessConnection
Dim ibDesc
Dim connections
Dim ConnectString
Dim StdOut

Set StdOut = WScript.StdOut
Set Connector = CreateObject("V82.COMConnector")
Set AgentConnection = Connector.ConnectAgent(ServerName)
Set Cluster = AgentConnection.GetClusters()(0)

AgentConnection.Authenticate Cluster, "", ""

Dim p
For p = 0 To pn
   Set WorkingProcess = AgentConnection.GetWorkingProcesses(Cluster)(p)
   ConnectString = WorkingProcess.HostName & ":" & WorkingProcess.MainPort
   Set WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString)
   WorkingProcessConnection.AddAuthentication UserName, UserPass
   Set ibDesc = WorkingProcessConnection.CreateInfoBaseInfo()
   ibDesc.Name = BaseName
   Connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc)

   Dim i
   Dim Connection
   For i = LBound(Connections) To UBound(Connections)
      set Connection = connections(i)
      If (Connection.AppID <> "COMConsole") then
              'StdOut.WriteLine(Connection.UserName)
         WorkingProcessConnection.Disconnect Connection
      End if
   Next   'i

Next    'p

[Viper] :: Используй тэг CODE!

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Индекс выходит за пределы допустимого диапазона

Сообщение VBTerminator » 25.06.2012 (Пн) 17:44

Потому что LBound и UBound - это номера элементов до первого и после последнего элементов соответственно. Перепиши шапку цикла как For i = LBound(Connections) + 1 To UBound(Connections) - 1.

Мой совет: Variant-переменные крайне непредсказуемы. Чётко определи тип переменных (этак Dim имя As тип). Также припиши в начале модуля Option Explicit - это избавит от кучи проблем из-за описок.

И да, оберни код тегом [code], пока Хакер не пришёл. ;)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Индекс выходит за пределы допустимого диапазона

Сообщение Viper » 25.06.2012 (Пн) 18:27

VBTerminator писал(а):Потому что LBound и UBound - это номера элементов до первого и после последнего элементов соответственно.
Это что еще за чушь? LBound и UBound это как раз именно индексы первого и посленего элемента массивов.
zarabsrv, откуда знаешь, что размер массива AgentConnection.GetWorkingProcesses(Cluster равен 11? От 0 до 10? Может их меньше?
Весь мир матрица, а мы в нем потоки байтов!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Индекс выходит за пределы допустимого диапазона

Сообщение Хакер » 25.06.2012 (Пн) 19:33

VBTerminator писал(а):Мой совет: Variant-переменные крайне непредсказуемы.

Вполне себе предсказуемы. Но не нужны они здесь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

zarabsrv
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 25.06.2012 (Пн) 11:55

Re: Индекс выходит за пределы допустимого диапазона

Сообщение zarabsrv » 26.06.2012 (Вт) 7:55

Viper писал(а):
VBTerminator писал(а):Потому что LBound и UBound - это номера элементов до первого и после последнего элементов соответственно.
Это что еще за чушь? LBound и UBound это как раз именно индексы первого и посленего элемента массивов.
zarabsrv, откуда знаешь, что размер массива AgentConnection.GetWorkingProcesses(Cluster равен 11? От 0 до 10? Может их меньше?

Вот именно что не знаю сколько их точно. Я взял значение 10 с запасом, чтобы наверняка хватило для моих нужд, но теперь не знаю как контролировать выход за пределы массива. Возможно код нужно переписать полностью...

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.06.2012 (Вт) 9:40

"Запас" надо брать в другую сторону. А вообще, надо использовать то что есть, а не лезть непонятно куда.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 48

    TopList