Показать сообщение отдельно
Старый 27.09.2017, 21:20   #34
Местный
 
Аватар для SeregaZ
 
Регистрация: 16.08.2009
Сообщений: 1,224
Сказал Спасибо: 4
Имеет 229 спасибок в 182 сообщенях
SeregaZ пока неопределено
По умолчанию

пробежался глазами... мало что понял с моими то тремя классами церковноприходской...

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

на сервере скажем 3 моба в файле:
Код:
id="3" mob="skelet"
id="5" mob="zombi"
id="6" mob="vampir"
первый вариант, массив меньше, но время доступа больше из-за необходимости цикла для кручения айди по массиву в поисках нужного:
Код:
Enumeration
  #File
EndEnumeration

Structure mob
  id.i
  name$
  spoilflag.a
  atackflag.a
EndStructure

Dim Moby.mob(0)


If ReadFile(#File, "D:\moblist.txt")
  ; мотать файл до конца
  While Eof(#File) = 0
    ; обнуление переменных
    id = 0
    name$ = ""
    
    ; читать строчку текста до символа перевода каретки
    tmp$ = ReadString(#File)
    
    ; разбор строчки текста
    id = Val(StringField(tmp$, 2, Chr(34)))
    ; Val() - превращение текста в цифру
    ; StringField - разбитие текста tmp$, по символу - Chr(34), то есть это кавычки
    ; и возврат 2 блока при разбитии
    ; сама текстовая строка выглядит так:
    ; id="3" mob="skelet"
    ; при разбитии по кавычкам:
    ; id=    1 блок
    ; 3      2 блок
    ;  mob=  3 блок
    ; skelet 4 блок
    
    name$ = StringField(tmp$, 4, Chr(34))
    
    If name$
      ; если в переменной name$ что-то есть,
      ; то значит разбор прошел успешно
      ; надо увеличить массив на 1 единичку
      size = ArraySize(Moby()) + 1
      ReDim Moby(size)
      
      ; и внести туда данные
      Moby(size)\id    = id
      Moby(size)\name$ = name$
      
    EndIf
    
  Wend
  
  ; закрыть открытый файл
  CloseFile(#File)
EndIf

; теперь когда массив готов и приходят с сервера id мобов,
mobid = 3

; то получаем о них инфу:
For i = 0 To ArraySize(Moby())
  If mobid = Moby(i)\id
    Debug Moby(i)\name$
    Break
  EndIf
Next

вариант второй - цикл получается не нужен, чтение будет быстрее... но сам размер массива будет в разы больше с кучей пустых ячеек - в данном случае пустые будут 1, 2 и 4, а сам размер массива будет равен самому максимальному id.
Код:
Enumeration
  #File
EndEnumeration

Structure mob
  ;id.i id в структуре становится не нужен. удаляем
  name$
  spoilflag.a
  atackflag.a
EndStructure

Dim Moby.mob(0)


If ReadFile(#File, "D:\moblist.txt")
  ; мотать файл до конца
  While Eof(#File) = 0
    ; обнуление переменных
    id = 0
    name$ = ""
    
    ; читать строчку текста до символа перевода каретки
    tmp$ = ReadString(#File)
    
    ; разбор строчки текста
    id = Val(StringField(tmp$, 2, Chr(34)))
    ; Val() - превращение текста в цифру
    ; StringField - разбитие текста tmp$, по символу - Chr(34), то есть это кавычки
    ; и возврат 2 блока при разбитии
    ; сама текстовая строка выглядит так:
    ; id="3" mob="skelet"
    ; при разбитии по кавычкам:
    ; id=    1 блок
    ; 3      2 блок
    ;  mob=  3 блок
    ; skelet 4 блок
    
    name$ = StringField(tmp$, 4, Chr(34))
    
    If name$
      ; если в переменной name$ что-то есть,
      ; то значит разбор прошел успешно
      ; надо увеличить массив до числа id
      size = ArraySize(Moby())
      If size < id
        ReDim Moby(id)
      EndIf
      
      ; и внести туда данные
      Moby(id)\name$ = name$
      
    EndIf
    
  Wend
  
  ; закрыть открытый файл
  CloseFile(#File)
EndIf

; теперь когда массив готов и приходят с сервера id мобов,
mobid = 3

; то получаем о них инфу без цикла, используя id как номер в массиве:
Debug Moby(mobid)\name$
а вот с хранением инфы об галках атаки и спойла будут проблемы ежели всюююю инфу писать в файл, аналогично как лист мобов, то есть:
Код:
id="3" ataka="1" spoil="0"
id="5" ataka="1" spoil="1"
id="6" ataka="0" spoil="0"
то при изменении одного галимого параметра - придется переписывать веееееееесь файл. а что если во время записи произойдет ошибка? столько лет внесения в базу флагов атаки и спойла - все на смарку

можно конечно будет создавать отдельный файл с id в названии 3.txt:
Код:
ataka="1" spoil="0"
тогда изменение будет записываться в один маленький файл. удобно писать, удобно при потере информации - потеряется только 1 файл, основная база останется целой. но стописят тыщь файлов по 1 килобайту - жесткий диск скажет тебе большое "спасибо". он такую мелочь не любит.

поэтому всякие сикуели и нужны, но это поддерживает твой язык, не поддерживает... нужны доп библиотеки, не нужны... нужны всякие дополнительные программы и сервисы или не нужны... и кто его знает как там с защитой базы на случай ошибки записи предусмотрено.
__________________
хочу картинку в подпись!
SeregaZ вне форума   Ответить с цитированием