Найдите ошибку!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Найдите ошибку!

Сообщение Dimanq » 03.05.2003 (Сб) 14:23

Есть код: (подробности в теме этого форума "Нужна помощь")

Код: Выделить всё
Sub LoadFile (ByRef arr() as String)

Dim FileHandler as Integer
Dim i,j as Integer
Dim a,b,c as Integer
Dim tmpS as String

ReDim arr(0,0) as String

FileHandler = FreeFile

Open "file.txt" for input  as FileHandler

do whiдe not(EOF(FileHandler))

input #FileHandler, tmpS

a = instr(tmpS,"(")
b = instr(tmps, ",")
c = instr(tmps, ")")

i = val(mid$(tmps,a,a-b) )
j = val(mid$(tmps,b,b-c) )

tmpS = trim$(Right$(tmpS, len(tmpS) - InStr(tmpS, "=")))
tmps = mid$(tmps,2,len(tmps)-2)

redim preserve arr(1 to i,j) as string

arr(i,j) = tmps

loop

Close FileHandler

End Sub


Если я в Form_load прописываю LoadFile:

Код: Выделить всё
Private Sub Form_Load()
LoadFile
End Sub


Он пишет ошибку "Argument not optional".

С чем это связано? Заранее благодарен за помощь! :?:

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 03.05.2003 (Сб) 14:25

Я не привожу тут свои эмоции, так как нехочу нарушать правил форума :)



Из объявления процедуры LoadFile ясно видно, что ейц надо передать массив строк, в который этот файл будет загружен.



Вызов процедуры д.б. таким:

Код: Выделить всё
Private Sub Form_Load()
Dim MyArr() As String
LoadFile MyArr
End Sub

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 03.05.2003 (Сб) 14:34

Извините за глупые вопросы, но я ещё новичок в VB.
Теперь работает, но на строке

Код: Выделить всё
j = Val(Mid$(tmpS, b, b - c))


выдает ошибку "Неправильный вызов процедуры или аргумент"

А на строке

Код: Выделить всё
ReDim Preserve arr(1 To i, j) As String


ошибку "Subscript out of range".

Что делать. Очень благодарен за ответ!!!

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 03.05.2003 (Сб) 15:00

Часть кода с Val должна быть такой:

Код: Выделить всё
i = val(mid$(tmps,a,b-a))
j = val(mid$(tmps,b,c-b))




А redim preserve тут работать и не будет. Почему - написано в хелпнике.



Так что код вообще надо снести нафик и заново переписать, что и можн опредложить его автору.

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 03.05.2003 (Сб) 15:22

Все равно на строках

Код: Выделить всё
i = val(mid$(tmps,a,b-a))
j = val(mid$(tmps,b,c-b))


выдает ошибку.
И как можно переписать этот код.
У меня в файле txt содержатся массивы a(1 to 150, 0 to 7)
a(1,3)="Разная инфа"
a(5,7)="Еще что-то" и т.д.

Если все содержимое файла перекинуть прямо в программу(исходный код),получается слишком громоздко и неудобно. Можно ли сделать так, чтобы содержимое файла вписалось в программу "на лету"? Или загрузилось в память так, как будто бы все эти данные были в процедуре Form_Load уже прописаны.
A объявлена в программе так:
Код: Выделить всё
a(1 to 150,0 to 7) as string

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 03.05.2003 (Сб) 15:29

Есть ли более простой вариант кода?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 03.05.2003 (Сб) 15:36

Можно попробовать так (предполагается что массив всегда фиксированной величины и что файл всегда содержит значение для каждой строки в массиве):



Код: Выделить всё
public arr(1 to 150,0 to 7) as string

Sub LoadFile ()

Dim FileHandler as Integer
Dim i,j as Integer
Dim a,b,c as Integer
Dim tmps as String

FileHandler = FreeFile

Open "file.txt" for input  as FileHandler

for i = 1 to 150
for j = 0 to 7

input #FileHandler, tmps

a = instr(tmps,"(")
b = instr(tmps, ",")
c = instr(tmps, ")")

i = val(mid$(tmps,a,a-b) )
j = val(mid$(tmps,b,b-c) )

tmps = trim$(Right$(tmpS, len(tmpS) - InStr(tmpS, "=")))
tmps = mid$(tmps,2,len(tmps)-2)

arr(i,j) = tmps

next j
next i

Close FileHandler

End Sub

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 03.05.2003 (Сб) 17:34

Снова выдает ошибку на строках

Код: Выделить всё
i = Val(Mid$(tmps, a, a - b))
j = Val(Mid$(tmps, b, b - c))


"Неправильный вызов процедуры или аргумент"

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 03.05.2003 (Сб) 17:35

Блин, ну переставь ты местами переменные!

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 03.05.2003 (Сб) 17:59

Так в том то и дело, что хоть меняй, хоть не меняй все равно ошибку выдает!!!

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 03.05.2003 (Сб) 18:03

Код: Выделить всё
i = Val(Mid$(tmps, a + 1, b - a - 1))
j = Val(Mid$(tmps, b + 1, c - b - 1))

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 03.05.2003 (Сб) 18:26

Не поверите, но одно и тоже получается, все равно ошибка!

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 03.05.2003 (Сб) 18:27

Поверю. Скажи что за ошибка и где. А еще лучше пошлимне свой текстовик я на него гляну.

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 03.05.2003 (Сб) 18:45

Привожу пример из текстовика(отрывок):
a(118, 1) = "15"
a(118, 2) = "1243"
a(118, 3) = "435"
a(118, 4) = "43"
a(118, 5) = "454"
a(118, 6) = "125000"
a(118, 7) = "0"
a(119, 0) = "654"
a(119, 1) = "56222"
a(119, 2) = "655265"
a(119, 3) = "734"
a(119, 4) = "3567536"
a(119, 5) = "546"
a(119, 6) = "125000"
a(119, 7) = "0"
a(120, 0) = "64358423"
a(120, 1) = "34274"
a(120, 2) = "74534"
a(120, 3) = "536187"
a(120, 4) = "3414"
a(120, 5) = "43161"
a(120, 6) = "125000"
a(120, 7) = "0"
a(121, 0) = "563765385"
a(121, 1) = "627275"
a(121, 2) = "27765265"
a(121, 3) = "52562"
a(121, 4) = "562"
a(121, 5) = "2562"
a(121, 6) = "250000"
a(121, 7) = "0"
a(122, 0) = "65576"
a(122, 1) = "6753"
a(122, 2) = "67356"
a(122, 3) = "763763"
a(122, 4) = "6653635"
a(122, 5) = "562652"
a(122, 6) = " 250000 "
a(122, 7) = "0"
a(123, 0) = "43616"
a(123, 1) = "543156"
a(123, 2) = "146"
a(123, 3) = "5136561"

А ошибка: Он выделяет желтым строку
Код: Выделить всё
i = Val(Mid$(tmps, a + 1, b - a - 1))

и пишет:
"Неправильный вызов процедуры или аргумент."

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 03.05.2003 (Сб) 18:49

У тебя в файле есть пустые строки. Вставь проверку в самое начало, что обрабатывать то лько если Len(tmps)>2 и все будет ОК.

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 03.05.2003 (Сб) 18:53

Т.е. написать
If Len(tmps)>2 Then
Вся программа
Else
????Что тут писать????

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 05.05.2003 (Пн) 11:06

Код: Выделить всё
do until eof(1)
line input #1, tmps
if len(tmps)>2 then
весь код по заполнению массива.
end if
loop


и все.

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 05.05.2003 (Пн) 15:36

Прошу прощения!
Этот код неверен, читайте следующее сообщение!!!
Последний раз редактировалось Dimanq 05.05.2003 (Пн) 16:04, всего редактировалось 1 раз.

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 05.05.2003 (Пн) 15:57

правильно ли я всё написал????
При таком коде:

Код: Выделить всё
Dim tmps
Dim FileHandler As Integer
Dim i, j As Integer
Dim a, b, c As Integer

Private Sub Form_Load()
LoadFile
End Sub



Sub LoadFile()
FileHandler = FreeFile
Open "vopr.txt" For Input As FileHandler

Do Until EOF(FileHandler)
Line Input #FileHandler, tmps
If Len(tmps) > 2 Then
For i = 1 To 150
For j = 0 To 7

a = InStr(tmps, "(")
b = InStr(tmps, ",")
c = InStr(tmps, ")")

i = Val(Mid$(tmps, a, b - a))
j = Val(Mid$(tmps, b, c - b))

tmps = Trim$(Right$(tmps, Len(tmps) - InStr(tmps, "=")))
tmps = Mid$(tmps, 2, Len(tmps) - 2)

arr(i, j) = tmps

Next j
Next i

Close FileHandler
End If
Loop

End Sub


на строке arr(i, j) = tmps пишет "Subscript out of range"
Последний раз редактировалось Dimanq 05.05.2003 (Пн) 16:05, всего редактировалось 1 раз.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 05.05.2003 (Пн) 16:02

А массив кто за тебя объявлять будет? Пушкин? :)

Вместе с остальными dim'ами напиши Dim arr(1 to 150, 0 to 7) as String

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 05.05.2003 (Пн) 16:08

Я тот код неверно написал, а массив у меня в модуле объявлен! (Public arr(1 to 150, 0 to 7)).
А ошибку выдаёт на строке arr(i, j)=tmps Ошибка: "Subscript out of range"
Последний раз редактировалось Dimanq 05.05.2003 (Пн) 16:14, всего редактировалось 1 раз.

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 05.05.2003 (Пн) 16:12

Dimanq писал(а):Я тот код неверно написал, а массив у меня в модуле объявлен! (Public arr(1 to 150, 0 to 7)).
А ошибку выдаёт на строке arr(i, j) Ошибка: "Subscript out of range"

а ты проверь чему у тебя равны i и j. скорее всего тут имеет место быть ссылка на несуществующий элемент массива. а значит что-то в файле напортачено, либо некоректно обрабатывается строка из файла
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 05.05.2003 (Пн) 16:16

Он выдает ошибку на строке arr(i, j) = tmps. Т.е. arr(i, j) и должны быть равны tmps!

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 05.05.2003 (Пн) 16:20

Боже, надо же было ТАК ступить! :shock:

Вот что праздники с людьми делаютт....

Код: Выделить всё
Dim tmps
Dim FileHandler As Integer
Dim i, j As Integer
Dim a, b, c As Integer

Private Sub Form_Load()
LoadFile
End Sub



Sub LoadFile()
FileHandler = FreeFile
Open "vopr.txt" For Input As FileHandler

do until eof(filehandler)
Line Input #FileHandler, tmps
If Len(tmps) > 2 Then

a = InStr(tmps, "(")
b = InStr(tmps, ",")
c = InStr(tmps, ")")

i = Val(Mid$(tmps, a, b - a))
j = Val(Mid$(tmps, b, c - b))

tmps = Trim$(Right$(tmps, Len(tmps) - InStr(tmps, "=")))
tmps = Mid$(tmps, 2, Len(tmps) - 2)

arr(i, j) = tmps

Close FileHandler
End If
Loop

End Sub

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 05.05.2003 (Пн) 16:25

Dimanq писал(а):Он выдает ошибку на строке arr(i, j) = tmps. Т.е. arr(i, j) и должны быть равны tmps!

"Subscript out of range" означает, что индеч выходит за границы размерности массива (т.е. если у тебя масси ARR(175,7) и ты выбираешь элемент ARR(176,6), то ты получиш это сообщение)

выполни эту процедуру по шагам и посмотри как у тебя изменяются i и j. просто, скорее всего, в этой строчке значение присваивается несуществующему элементу массива arr(). значит какая-то переменная не входит в диапазоны [1-150] и [0-7]
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 05.05.2003 (Пн) 16:29

RayShade писал(а):Боже, надо же было ТАК ступить! :shock:
Вот что праздники с людьми делаютт....

RayShade, ну ты блин даеш. я тут, понимаеш, распинаюсь, а он лишних циклов нафигарил :) :idea:
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 05.05.2003 (Пн) 17:00

Когда я вхожу в режим отладки, то в строке arr(i, j)=tmps и i и j равны 0, а tmps равна 537890. 537890 - это первая строка моего файла, но не полностью!

Первая строка моего файла:
a(1,0)=537890

Отчего это может быть?

Dimanq
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 02.05.2003 (Пт) 15:40
Откуда: Russia FOREVER!!!

Сообщение Dimanq » 05.05.2003 (Пн) 17:02

Когда я вхожу в режим отладки, то в строке arr(i, j)=tmps и i и j равны 0, а tmps равна 537890. 537890 - это первая строка моего файла, но не полностью!

Первая строка моего файла:
a(1,0)=537890

Отчего это может быть?

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 05.05.2003 (Пн) 17:08

Dimanq писал(а):Когда я вхожу в режим отладки, то в строке arr(i, j)=tmps и i и j равны 0, а tmps равна 537890. 537890 - это первая строка моего файла, но не полностью!

Первая строка моего файла:
a(1,0)=537890

Отчего это может быть?


все правильно. RayShayde немного накосячил вот тут
Код: Выделить всё
a = InStr(tmps, "(")
b = InStr(tmps, ",")
c = InStr(tmps, ")")

i = Val(Mid$(tmps, a, b - a))
j = Val(Mid$(tmps, b, c - b))


нужно так
Код: Выделить всё
i = Val(Mid$(tmps, a + 1, b - a))
j = Val(Mid$(tmps, b + 1, c - b))

кажется, это так на вскидку
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 05.05.2003 (Пн) 17:12

Да ничего я не накосячил ;)

Постингов ..цать назад в этой теме я приводил уже вариант этого кода, как раз пофиксенный.



Небольшой оффтопик - только хорошее весеннее настроение мешает мне закрыть эту тему к такой то бабушке, а всем ее участникам предложить учиться отлаживать свой код самим :lol:

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 83

    TopList