Объясните в чём ошибка

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

Объясните в чём ошибка

Сообщение Хакер » 03.12.2005 (Сб) 19:31

Хоть убейте не могу понять в чём ошибка.
Есть ф-ция WriteProfiles в агруметнах которой - массив. Когда вызываем функцию - VB ругается
Array or user-defined type expected
.

Код функции:
Код: Выделить всё

Public Sub WriteProfiles(ProfileList() As SP_PROFILE)
Dim Coder   As New clsSuperCode
Dim WString As String
    For i = LBound(ProfileList) To UBound(ProfileList)
        WString = WString + _
_
        "ID_SYSPROFILE_DATA_BEGIN" + vbNewLine + _
        "Profile.sProfilePID=" + ProfileList(i).sProfilePID + vbNewLine + _
        "Profile.sProfileFIO=" + ProfileList(i).sProfileFIO + vbNewLine + _
        "Profile.sProfileType=" & ProfileList(i).sProfileType & vbNewLine + _
        "Profile.sProfilePassword=" + ProfileList(i).sProfilePassword + vbNewLine + _
        "JSEC.SUBD::AddProfile(Profile); ExceptCode=0x0e1" + vbNewLine
    Next i
    Coder.InBuffer = WString
    Coder.Password = SP_PROFILE_CODER
    Coder.Encrypt
   
    FFH = FreeFile
   
    Open "DATA\PROFILES.DAT" For Output As #FFH
        Print #FFH, Coder.OutBuffer
    Close #FFH
   
End Sub


Потом в другом модуле функция вызывается так:
Код: Выделить всё

Profiles = System.EnumProfiles
For i = LBound(Profiles) To UBound(Profiles)
   ...
Next i

WriteProfiles Profiles


Примечание:
Profiles - объявлен как массив типа SP_PROFILE :!:
System - один из классов моей программы, EnumProfiles - его метод.

Так объясните, глупому :D , в чём ошибка? :?:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.12.2005 (Вс) 0:21

Ошибка, скорее всего в ДНК... :lol:
А ты уверен что System.EnumProfiles возвращает то, что нужно?
А я все практикую лечение травами...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.12.2005 (Вс) 0:25

Просто нет возможности потестить этот кусочек кода, так как нет текста класса System. Можешь попробовать добавить ByVal в заголовок функции WriteProfiles... Да мало ли что там у тебя может быть. Как говорится: телепаты в отпуске!
А я все практикую лечение травами...

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

Сообщение Хакер » 05.12.2005 (Пн) 13:18

EnumProfiles - возвращает то что надо! Это точно! Единственное сомнение у меня только в том, что в классе тип SP_PROFILE объявлен как Private и в модуле тоже как в Private. Поэтому EnumProfiles возвращает массив типа clsSystem.SP_PROFILE (класс из DLL) а функции WriteProfiles нужен аргумент типа modDeclarations.SP_PROFILE. Хотя объявление типа что там, что там абс. одинаковое. - т.е. это глюк VB6 при проверке на TypeMissmatch.

>> про ByVal - массивы в VB, насколько мне известно не передаются ByVal, VB ругается "Array must be ByRef"

Вот код класса, если это что-то даст:

Код: Выделить всё

Public Function EnumProfiles()
Dim FFH          As Integer
Dim Index        As Integer
Dim sData        As String
Dim sProfiesData As String
Dim sProfileDT() As String
Dim Profiles()   As SP_PROFILE
Dim Coder        As New clsSuperCode


FFH = FreeFile
    Open "DATA\PROFILES.DAT" For Binary Lock Read As #FFH
    sData = Input$(LOF(FFH) - 2, FFH)
    Close #FFH
    Coder.InBuffer = sData
    Coder.Password = SP_PROFILE_CODER
    Coder.Decrypt
    sProfilesData = Coder.OutBuffer
    sProfileDT = Split(sProfilesData, vbNewLine)
    sProfilesData = ""
    ReDim Profiles(0)
    For i = LBound(sProfileDT) To UBound(sProfileDT)
        If sProfileDT(i) = "JSEC.SUBD::AddProfile~AlphaCode~DO(Profile); ExceptCode=0x0e1" Then Index = Index + 1: ReDim Preserve Profiles(Index)
        If sProfileDT(i) Like "Profile.sProfilePID=*" Then _
           Profiles(Index).sProfilePID = Mid$(sProfileDT(i), 21)
        If sProfileDT(i) Like "Profile.sProfileFIO=*" Then _
           Profiles(Index).sProfileFIO = Mid$(sProfileDT(i), 21)
        If sProfileDT(i) Like "Profile.sProfileType=*" Then _
           Profiles(Index).sProfileType = CByte(Mid$(sProfileDT(i), 22))
        If sProfileDT(i) Like "Profile.sProfilePassword=*" Then _
           Profiles(Index).sProfilePassword = IIf(bgivemepassword, Mid$(sProfileDT(i), 26), "")
    Next i
    Set Coder = Nothing
    ReDim Preserve Profiles(UBound(Profiles) - 1)
EnumProfiles = Profiles
End Function




Ну таксььь :?:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Хакер » 05.12.2005 (Пн) 13:31

Гммм. при очередной попытке Run with full compile я в очередной раз увидел Array or user-defined type expected и после нажатия ОК, вся подвисло на 2-3 сек. а потом... Отправить отчёт или не отправить отчет... вот в чём вопрос.

Самое интересное что ошибки больше нет!!! WHY??? 2 дня колупался над поганым :evil: кусочком кода... 2 дня - нифига. А тут на и всё заработало. Мистика?!

Так что вопрос, наверное, снимается.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.12.2005 (Пн) 14:46

а кто будет за тебя в цикле редимить массив Profiles(Index) :?: :roll:

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

Сообщение Хакер » 06.12.2005 (Вт) 18:45

В каком именно цикле? В классе всё редимится - смотри внимателно - оно там всё в одной строчке залаплено. А в модуле, где ошибка вылазтила, тоже - просто я сократил. Написал ...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

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

    TopList