Предлагаю на суд класс работы с ini

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Предлагаю на суд класс работы с ini

Сообщение SLIM » 14.06.2008 (Сб) 20:24

Предлагаю на суд профессионалов класс для работы с ini файлами. Не решился писать в Кирпичи. Попробуйте, потестируйте, выскажите свое мнение (Даже если оно диструктивное). Могу лишь сказать что это моя первая (На мой взгляд) серьезная работа (для меня). Есть плюсы, есть минусы. Думаю дополнить, там посмотрим.
Ну как никак это моя работа. Для меня это уже достижение.
Вложения
InI.rar
(3.69 Кб) Скачиваний: 128
Пишите жизнь на чистовик.....переписать не удастся.....

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 15.06.2008 (Вс) 1:00

Забыл Option Explicit, у тебя там есть необъявленные переменные.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение Viper » 15.06.2008 (Вс) 7:01

Первые впечатления:
1. Option Explicit рулит неимоверно!
2. Поскольку у автора Option Explicit не рулит, то выяснилось, что у него не объявлено ни одной переменной счетчика цикла. А также видимо по причине копи-паста в паре функций стоит неправильное имя функции.
3. После Next все же стоит указывать переменную цикла - помогает не запутаться.
4. Комментарии рулят! Автор, через неделю сам не поймешь, что написал.
5. Описания функций по той же причине надо бы непосредственно в файл исходник, а не в отдельный текстовик.

Пока все, на код еще не смотрел.
Весь мир матрица, а мы в нем потоки байтов!

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

Сообщение Хакер » 15.06.2008 (Вс) 8:04

Ну что-ж, поехали:

По поводу оформления кода:
  1. Общепринятым отступом для оформления вложенности является отступ а 4 пробела. По этой причине во всех нормальных IDE (в том числе и в VB IDE) при нажатии на Tab вставляется именно 4 пробела. У меня есть два предположения:
    Либо ты делал отступы вручную, два раза нажимая на пробел, либо ты в настройках изменил параметр "Tab Width".
    Так вот, используй 4 пробела
    (С другой стороны, можно предположить, что это было сделано из соображений экономии горизонтального пространства. Но это можно простить, если бы ты готовил код для публикации в книге, где горизонтальное пространство строго ограничено шириной страницы без полей)
  2. Ты, судя по всему, выдумал какую-то собственную схему именования переменных. Я допускаю, что можно придумывать собственные схемы (но лучше всё-таки придерживаться общепринятых), но принципы наименования должны быть рациональными.
    Называть переменную Str As String - это как-то дико. К тому же, Str это ещё и стандартная функция.
  3. Комментарии...
    Хочешь выдержку из исходника винды?
    Код: Выделить всё
                //
                // Fill in the prototype PTEs for this subsection.
                //

                TempPte.u.Long = MiGetSubsectionAddressForPte (MappedSubsection);
                TempPte.u.Soft.Prototype = 1;

                //
                // Set all the PTEs to the initial execute-read-write protection.
                // The section will control access to these and the segment
                // must provide a method to allow other users to map the file
                // for various protections.
                //

                TempPte.u.Soft.Protection = MappedSubsection->ControlArea->Segment->SegmentPteTemplate.u.Soft.Protection;

                MiFillMemoryPte (ProtoPtes, Size / sizeof (MMPTE), TempPte.u.Long);

                LOCK_PFN (OldIrql);

                //
                // Now that the mapping base is guaranteed to be nonzero (shortly),
                // the number of mapped views can be safely incremented.  This
                // prevents a trim from starting after we release the lock.
                //

                MappedSubsection->NumberOfMappedViews += 1;

                MI_SNAP_SUB (MappedSubsection, 0x8);

                //
                // Set the access bit so an already ongoing trim won't blindly
                // delete the prototype PTEs on completion of a mapped write.
                // This can happen if the current thread dirties some pages and
                // then deletes the view before the trim write finishes - this
                // bit informs the trimming thread that a rescan is needed so
                // that writes are not lost.
                //

                MappedSubsection->u2.SubsectionFlags2.SubsectionAccessed = 1;

    Как тебе уровень комментирования? (комментарии начинаются на // )
  4. Название класса - MyCls -- это кошмар. Надеюсь, это только в "заценочной версии" так.
  5. Функцию FileReal (файл реален) переименовать в FileExists (файл существует).
  6. Функции названы так, что по их названию нельзя понять, что они делают. Вот например: GetNameValueKeyNumber
    Взять имя значение ключ номер. Чего?
  7. Хотя, в целом, если сравнивать это с моим первым модулем для работы с INI-файлами:

    Код: Выделить всё
    Public Function GetParametrVal(FilePathName As String, ParName As String)

    On Error GoTo 20
    Open FilePathName For Input As #120
    10
    Line Input #120, stringrow
    If UCase(Mid$(stringrow, 1, Len(ParName))) = UCase(ParName) Then
    GetParametrVal = Mid$(stringrow, Len(ParName) + 2, Len(stringrow) - Len(ParName)): Close #120
    Else
    GoTo 10
    End If
    Exit Function
    20
    Close #120
    End Function

    Public Function SetParametrVal(FileName As String, ParName As String, ParVal As String) As Boolean
    On Error Resume Next
    Dim StringIndex, NowString
    DoEvents
    UnexpectedFileKill FileName + "_BUFFER.tmp"
    'On Error GoTo er
    Open FileName For Input As #117
    DoEvents
    Open FileName + "_BUFFER.tmp" For Append As #118
    StepLookenFor:
    DoEvents
    StringIndex = StringIndex + 1
    If Not EOF(117) Then Input #117, NowString Else GoTo Processing
    DoEvents
    If Left(UCase(NowString), Len(ParName)) = (UCase(ParName)) Then GoTo RealDoing Else Print #118, NowString: GoTo StepLookenFor
    SetParametrVal = True
    DoEvents
    RealDoing:

    Do While Not EOF(117)
    Input #117, zz
    DoEvents
    Print #118, zz
    Loop
    Processing:
    Close #117
    Close #118
    Kill FileName
    Open FileName For Append As #117
    DoEvents
    Open FileName + "_BUFFER.tmp" For Input As #118
    For i = 1 To StringIndex - 1
    Input #118, zz
    DoEvents
    Print #117, zz
    Next i
    Print #117, Trim(ParName) + "=" + Trim(ParVal)
    Do While Not EOF(118)
    DoEvents
    Input #118, zz
    DoEvents
    Print #117, zz
    Loop
    Close #117
    Close #118
    Kill FileName + "_BUFFER.tmp"
    Exit Function
    er:
    SetParametrVal = False
    End Function


    Public Sub UnexpectedFileKill(FileName As String)
    On Error Resume Next
    Kill FileName
    End Sub

    , твой невероятно рулит :) .


По поводу кода:
  1. Код: Выделить всё
    Private Function FileReal(Path As String) As Boolean
      If Dir(Path) = "" Then
        FileReal = False
      Else
        FileReal = True
      End If
    End Function

    Это -- ужасная функция. Невероятно ужасная и глупая.

    Проблема почти всех новичков заключается в том, что те убеждены, что между IF и THEN обязательно должно быть какое-то сравнение чего-нибудь с чем-нибудь.

    Так вот, между IF и THEN может быть любое выражение. Абсолютно. Хоть 9 + 77, хоть 3, хоть True = True, хоть что-то ещё.

    У тебя сравнение даёт либо True либо False. И логика получается такая:
    Если True - то False, в противном случае - True.

    Такую логику просто глупо делать на базе if (потому что там используются условные джампы), т.к. её можно сделать на базе оператора Not:
    Код: Выделить всё
    Private Function FileReal(Path As String) As Boolean
      FileReal = Not (Dir(Path) = "")
    End Function

    а учитывая что Not a = b эквивалетно a <> b, то:
    Код: Выделить всё
    Private Function FileReal(Path As String) As Boolean
      FileReal = Dir(Path) <> ""
    End Function

  2. И опять тот же самый стереотип, что между IF и THEN надо обязательно что-нибудь с чем-нибудь сравнить:
    Код: Выделить всё
    Public Sub MakeFileIni(Path As String, Optional ReMake As Boolean)
      If FileReal(Path) = False Then
        Open Path For Output As #1
        Close #1
      Else
        If ReMake = True Then
          Kill Path
          Open Path For Output As #1
          Close #1
        End If
      End If
      FileS = Path
      LoadIni (Path)
    End Sub

    Опять, сравнивание True с False чтобы получить False, и False с False чтобы получить True, вместо использования Not.

    Ещё более ужасным являеется сравнивание (где ReMake):
    True с True чтобы получить это же самое True и
    False с True чтобы получить этот же самый False.

    Итого:
    FileReal(Path) = False заменить на Not FileReal(Path)
    ReMake = True заменить на просто ReMake
  3. Использование фиксированных номеров файлов вместо их получения с помощью FreeFile() грозит риском нарваться на Bad file name or number. Особенно, если кто-нибудь совместит два таких модуля в одном проекте.
  4. ElseIf рулит.
    Код: Выделить всё
          If Mid$(Str, 1, 1) = "[" Then
            ...
         Else
            If Str <> "" Then
              ...
             End If
         End If

    заменяется на
    Код: Выделить всё
          If Mid$(Str, 1, 1) = "[" Then
            ...
         ElseIf Str <> "" Then
            ...
         End If

  5. Модуль совершенно не готов к тому, что перед [sectionname] будет стоять пробел или таб.
  6. Почему везде аргументы передаются ByRef? :roll:
  7. Ну и самое главное: не нравится принцип -- вместо того чтобы считывать файл в память, и там его обрабатывать, и, обработав, обратно записать (разом) в файл, ты работаешь построчно.

    Принцип парсинга тоже не нравится, но для новичка и для первого раза пойдёт.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Viper » 15.06.2008 (Вс) 10:18

Хакер уже многое написал, но таки дополню.
1. Постоянные переопределения массивов не по делу и совершенно не по делу жутко затормозят прогу.
2. Постоянные перечитывания файла, причем совершенно не по делу скорости также не добавляют. А с учетом того, что в функции чтения файла имеется ошибка (массивы перед чтением не обнуляются), то через некотрое время как ини-файл, так и его представление в классе разбухнут до невозможности.
Остальное читать в моих комментах к исходнику.
Вложения
C.zip
С моими комментами
(4.45 Кб) Скачиваний: 111
Весь мир матрица, а мы в нем потоки байтов!

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 15.06.2008 (Вс) 11:30

А что, ещё кто-то хранит настройки в INI? Я думал, что все давно на XML перешли... И к INI, вроде, API специальные были.
Изображение

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

Сообщение Хакер » 15.06.2008 (Вс) 11:32

keks-n
Ты не понял, автор писал скорее не для того чтобы пользоваться, а для того чтобы решить задачу.

А XML для этой цели, вообще, sucks.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 15.06.2008 (Вс) 11:52

Забыл Option Explicit, у тебя там есть необъявленные переменные.

Да, действительно забыл. Косяк....
Так вот, используй 4 пробела

Приму к сведению. Но я хотел всего лишь сделать код читабельным (Вот дебил, без комментариев читабельным, пародокс).
Называть переменную Str As String - это как-то дико

Я как-то на это и внимания не обращал. Просто писал чтобы потом понять что оно значит.
Комментарии...
Хочешь выдержку из исходника винды

Об этом я уже говорил. А где ты взял исходник винды?
Название класса - MyCls -- это кошмар. Надеюсь, это только в "заценочной версии" так.

Ты прав. Это только сейчас, я ведь не на выставку его выставляю, а на пробу
Функцию FileReal (файл реален) переименовать в FileExists (файл существует).

Ок, просто я не удосужился вспомнить как это называется, написал более понятным языком

Функции названы так, что по их названию нельзя понять, что они делают. Вот например: GetNameValueKeyNumber
Взять имя значение ключ номер. Чего?

Ну впринципе я тут старался чтобы было понятно, но оказалось что нет. Всеже это значит - Получить Имя Значение Ключа По его Номеру
твой невероятно рулит

Всмысле он лучше или это стеб?

FileReal(Path) = False заменить на Not FileReal(Path)
ReMake = True заменить на просто ReMake

Понял, очень полезная информация.

Использование фиксированных номеров файлов вместо их получения с помощью FreeFile() грозит риском нарваться на Bad file name or number. Особенно, если кто-нибудь совместит два таких модуля в одном проекте.

Это тоже понятно.

ElseIf рулит.

Мда, все проще....

Почему везде аргументы передаются ByRef

Честно потому что не понимаю разницы. Точнее не знаю. Где взять инфу по этой теме?

Ну и самое главное: не нравится принцип -- вместо того чтобы считывать файл в память, и там его обрабатывать, и, обработав, обратно записать (разом) в файл, ты работаешь построчно.

Вариантов тут могло быть много. Но я пошел простым (для меня) путем. Я был точно уверен, что одна строка (одно считывание) ровно одному ключю\секции. Считать файл в память? Каким образом. Все равно выгружать в массив.

Viper

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

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

Ну и так далее. Ошибок много, Все принял. Спасибо.
Главное что я хотел сделать - это создать свой, ни на кого не похожий класс. Постоянно в нете стречаются классы по работе с ini одного, двух человек. Или с использованием API. Ктати, а что будет работать быстрее: мой класс или с api? Так вот. Увидел класс в нашем кирпичном заводе. Увидел много мудреного(на мой взгляд), решил сделать умнее (как показалось). Не хотел использовать GOTO. Ну и еще много чего.
А вообще, если доработать претендует ли он лежать в кирпичах с моим гордым именем.
Пишите жизнь на чистовик.....переписать не удастся.....

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 15.06.2008 (Вс) 11:54

Ты не понял, автор писал скорее не для того чтобы пользоваться, а для того чтобы решить задачу.

Вобщем ты прав......, но и для пользования тоже....
Пишите жизнь на чистовик.....переписать не удастся.....

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

Сообщение Хакер » 15.06.2008 (Вс) 12:22

Приму к сведению. Но я хотел всего лишь сделать код читабельным (Вот дебил, без комментариев читабельным, пародокс).

1) Ты его и сделал читабельным. Но вместо 2 пробелов лучше юзать 4.
2) Не дебил. Без комментариев код читабелен, но непонятен.

Ну впринципе я тут старался чтобы было понятно, но оказалось что нет. Всеже это значит - Получить Имя Значение Ключа По его Номеру

KeyGetValueNameById, KeyId2NameValue, NameValueFromKeyId, etc...

Понял, очень полезная информация.

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

А вообще, правда, непонятно, зачем сравнивать True c True, чтобы получить True, если нельзя сразу использовать True.

Я в таких случаях привожу контрпример:
Код: Выделить всё
' Писать:
If ( (a = True) = True ) = ( (5 = 5) = True) Then
'вместо
If a Then


Честно потому что не понимаю разницы. Точнее не знаю. Где взять инфу по этой теме?

Оценить пример, для начала:

Код: Выделить всё
Public Sub Hello___WithByVal(ByVal x As Long)
x = 777777777
End Sub

Public Sub Hello___WithByRef(ByRef x As Long)
x = 888888888
End Sub


Public Sub TestIt()
    Dim abc As Long
   
    abc = 2
    MsgBox "abc до вызова: " + CStr(abc)
    Hello___WithByVal abc
    MsgBox "abc после вызова: " + CStr(abc)
   
    MsgBox "А теперь то же самое, но с ByRef", vbExclamation
   
    MsgBox "abc до вызова: " + CStr(abc)
    Hello___WithByRef abc
    MsgBox "abc после вызова: " + CStr(abc)
End Sub


Вариантов тут могло быть много. Но я пошел простым (для меня) путем. Я был точно уверен, что одна строка (одно считывание) ровно одному ключю\секции.

В ini ещё могут быть комментарии.
Между равно и значанием ключа может быть много пробелов (у тебя эти пробелы автоматически попадают в имя ключа (те, что слева от "равно") и значение ключа (те, что справа), что просто ужасно.)

Считать файл в память? Каким образом.

Используя режим For Binary и конструкицю Get ..., ..., ...
Считывать рекомендую в массив байт, парсить там же (по умному, только, никаких InStr), и только после распарсивания заполнять нужные структуры нужными данными.

Все равно выгружать в массив.

В какой?

Всмысле он лучше или это стеб?

Чем мой первый он лучше. Мой первый даже не понимал секций. И оформление там какое сам видишь.

Главное что я хотел сделать - это создать свой, ни на кого не похожий класс. Постоянно в нете стречаются классы по работе с ini одного, двух человек. Или с использованием API. Ктати, а что будет работать быстрее: мой класс или с api?

Вообще то эту задачу нужно решать исключительно с использованием API. (У тебя же нет позывов писать собственную реализацию MsgBox? Собственную реализацию InStr?)

Сейчас, вероятно, твой вариант будет работать быстрее, но как только ты исправишь все ошибки, то вариант с API будет быстрее, ибо он тщательно вылизывался. Перейдя на парсинг с помощью ДКА (на базе ассемблерной вставки) можно будет обогнать API-шный вариант.

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


В принципе - да, если доработаешь. Но я бы не стал (на твоём месте, а не в смысле что я тебе как администратор запрещу) его туда публиковать.

Дело в том, что тенденция помещать в свою программу код, который уже имеется в системе - это нехорошая тенденция. К тому же, если код хуже. Поэтому в кирпичах должен быть один вариант (с переходниками к соотв. API-функциям).

По идее, надо и лишние эвалюаторы убрать, и оставить только эвалюатор Тёмыча, потому что он безмерно рулит.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.06.2008 (Вс) 13:15

А XML для этой цели, вообще, sucks.
Ни разу не, XML широко применяется для хранения настроек
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 15.06.2008 (Вс) 13:27

ANDLL
+1
вот ini действительно sucks

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

Сообщение Хакер » 15.06.2008 (Вс) 13:32

ANDLL
Причём здесь широта применения? Наркота, вон, тоже широко применяется для саморазвлечения, но от этого не перестаёт sucks.

Ramzes
Дело в том, Ramzes, что ты даже не понимаешь, почему я говорю, что XML sucks в данном случае, и почему оно хуже (хотя бы на мой взгляд) чем ini.

И не сможешь мне доказать, что XML в данном случае лучше, потому что оно нифига не лучше. Но с радостью кричишь "плюсадин!" потому что XML -- это модно и круто.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 15.06.2008 (Вс) 13:39

Хакер
я не собираюсь тебе ничего доказывать, зачем? просто я высказал свое мнение.ж И юзаю xml не потому, что это "модно", а потому, что мне удобней, потому, что у меня есть для этого интсрументы

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

Сообщение Хакер » 15.06.2008 (Вс) 13:41

На правах офтопика:
Интересно, инструменты -- это MSXML? Который надо устаналивать, против API-функций для работы с ini, которые уже есть в системе изнчально, и, стало быть, у тебя инструмент для работы с Ini тоже есть?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 15.06.2008 (Вс) 13:49

Хакер
я послденее время работаю с .net, надеюсь тебе не нужно больше ничего рассказывать ;)

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.06.2008 (Вс) 14:30

Причём здесь широта применения
Ага, подумаешь такие продукты как IIS хранят свои настройки в виде xml, мы то все равно знаем что это фигня.
Вообще, xml действительно хорошо подходит для хранения настроек)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 15.06.2008 (Вс) 14:34

Хакер
MSXML стоит изначально на ГОЛОЙ Win98. Так куда его надо устанавливать?
И ещё, он намного более структурирован, чем INI, и отличается более высоким уровнем вложенности, не теряя основного преимущества - возможности правки банальным блокнотом. Более того, продвинутые языки с правильными рантаймами поддерживают сериализацию классов в XML. А INI... Он морально устарел на 15 лет.
Изображение

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

Сообщение Хакер » 15.06.2008 (Вс) 14:57

Ramzes
И типа .net не позволяет вызвать WritePrivateProfileString, да?

ANDLL
Это проявление принципа "ешь еду своей собаки", который используется в MS. Не иначе.

keks-n
У меня нет больше никаких слов, кроме как чего нибудь вроде "Твою мать".
Вобщем, я не говорил, что XML плох, и не стоит доказывать мне что он не плох. Я говорил, что в случае хранения настроек, он sucks у ini.
Последний раз редактировалось Хакер 15.06.2008 (Вс) 15:17, всего редактировалось 1 раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 15.06.2008 (Вс) 15:08

Хакер
Претензии к ANDLL необоснованы. Многие кросс-платформенные программы используют xml. С другой стороны, INI - чисто виндовая приблуда. И INI не даст мне хранить настройки более чем с 2-мя уровнями вложенности.
Изображение

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

Сообщение Хакер » 15.06.2008 (Вс) 15:15

Код: Выделить всё
INI - чисто виндовая приблуда

Да, особенно php.ini об этом говорит. Это ведь чисто виндовая технология?

И INI не даст мне хранить настройки более чем с 2-мя уровнями вложенности.


При хранении настроек вложенность вообще не нужна (попробуй доказать, что она нужна).

Если только ради собственного удобства (типа Level относится к Sound), но это легко решается даванием параметру имени "Sound.Level".
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 15.06.2008 (Вс) 15:37

А если мне там надо список хранить? Делать так, что-ли:
Count=5
Item1=1
Item2=2
Item3=3
Item4=4
Item5=5

Нечто подобное наблюдается в виндовом реестре, в частности, в списке модемов. КРИВО.
Изображение

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

Сообщение Хакер » 15.06.2008 (Вс) 15:39

Фиксированные списки хранить именно так. А нефиксированные не могут быть в опциях. Иначе это уже не опции.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 15.06.2008 (Вс) 15:52

Хакер писал(а):Ramzes
И типа .net не позволяет вызвать WritePrivateProfileString, да?

зачем? мне не нравится INI

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

Сообщение Хакер » 15.06.2008 (Вс) 16:07

Тогда я не понял, причём здесь "потому, что у меня есть для этого интсрументы".
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 15.06.2008 (Вс) 16:19

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

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

Сообщение Хакер » 15.06.2008 (Вс) 16:23

Нет, я всё-таки чего-то недопонимаю.

Ты говоришь что, ты используешь XML (а не INI) не потому что "модно", а потом что есть какие-то особые инструменты.

О каких инструментах речь?

Да, кстати, сколько же стоит твоё время? :D
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 15.06.2008 (Вс) 17:30

В ini ещё могут быть комментарии.
Между равно и значанием ключа может быть много пробелов (у тебя эти пробелы автоматически попадают в имя ключа (те, что слева от "равно") и значение ключа (те, что справа), что просто ужасно.)

В этом то и прикол. Все что не имеет в начале символ "[" и не имеет в строке знак "=" считается комментариями, несмотря на то что общепринято комментариями считать ";".

Оценить пример, для начала:

Не плонял! Что за прикол. :shock: При ByVal ссылается на то, что ему передали, при ByRef на значение? Не понял. Вообще не понял....

Между равно и значанием ключа может быть много пробелов (у тебя эти пробелы автоматически попадают в имя ключа (те, что слева от "равно") и значение ключа (те, что справа), что просто ужасно.)

Ну я думаю это не так сложно. Вроде UCase делает это..

Сейчас, вероятно, твой вариант будет работать быстрее, но как только ты исправишь все ошибки, то вариант с API будет быстрее, ибо он тщательно вылизывался. Перейдя на парсинг с помощью ДКА (на базе ассемблерной вставки) можно будет обогнать API-шный вариант.


Не, это пока тяжеловато. Просто я не раз слышал что объявление апишной функции хавает сразу 30% времени исполнения программы.
А теперь верх ламеризма. Готов?...... Что такое парсинг? :oops:

Дело в том, что тенденция помещать в свою программу код, который уже имеется в системе - это нехорошая тенденция. К тому же, если код хуже. Поэтому в кирпичах должен быть один вариант (с переходниками к соотв. API-функциям).

Даже если исправить все ошибки, будет ли он лучше существующего сейчас в кирпичах?
Переходники к апишкам это что ты имеешь в виду?

Теперь по поводу остального. помоему действительно для хранения настроек ничего лучше не придумаешь.
Программа при загрузке получает внешние данные, заставляющие работать приложение заданным образом. Эти же данные можно изменить в приложении. Можно вообще отменить какие-то секциии и оставить ключи и все. Вот видимо и все призвание ini. А xml. Какое его назначение (основное?). А по поводу модности....я видел уже наверное с три десятка приложений для допустим Vista, где используется ini. Пусть даже он устарел на 15 лет. Все гениальное просто.
Пишите жизнь на чистовик.....переписать не удастся.....

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

Сообщение Хакер » 15.06.2008 (Вс) 18:16

В этом то и прикол. Все что не имеет в начале символ "[" и не имеет в строке знак "=" считается комментариями, несмотря на то что общепринято комментариями считать ";".

Но надо делать как надо, а не так, как хочется.

Не плонял! Что за прикол. При ByVal ссылается на то, что ему передали, при ByRef на значение? Не понял. Вообще не понял....

При ByVal никто ни на что не ссылается. При Byval аргумент x содержит число, которое передали. При ByRef аргумент x содержит не то, что передали, а содержит ссылку на то, что передали (т.е. фактически замыкается на переменную abc).

Делая какие-то действия с аргументом x (например, присваивая ему значения) ты фактически делаешь это с той переменной, на которую ссылается аргумент x (в нашем случае он ссылается на переменную abc функции TestIt).

ИРЛ при ByRef аргументе передаётся не значение abc (как было бы при ByVal) а адрес abc. А внутри Hello__WithByref происходит работа с ячейкой памяти по этому адресу. Но это уже детали реализации, которые знать не обязательно.

Ну я думаю это не так сложно. Вроде UCase делает это..

UCase приводит строчку "тИпА кРуТо дА?" к виду "ТИПА КРУТО ДА?", т.е. приводит к верхнему регистру.

Вероятно ты имел в виду Trim, но решать проблему надо не с его помощью (хотя можно и с его).

Не, это пока тяжеловато. Просто я не раз слышал что объявление апишной функции хавает сразу 30% времени исполнения программы.

Объявление любой экспортируемой функции не хавает время. Вызов функции, объявленной через Declare схавает уйму (относительно) времени при самом первом (в хронологическом порядке) вызове. Использование такой функции в начале её БК скушает немного времени на проверку ячейки PIT, последующе же вызовы скушают столько же времени, сколько и нормальные вызовы.

Вызовы API-функций, объявленных нормально (не через Declare, а через TLB) много врени не съежают (т.е. съедают столько же времени, сколько вызов Sin, Cos, MsgBox, Beep, DoEvents и других VBAPI-функций (да, да, MsgBox ничем не отличается в этом плане от какой-либо другой API-функции)).

А теперь верх ламеризма. Готов?...... Что такое парсинг?

Ламеризм, это если бы ты не зная, что такое парсинг, сделал вид, что знаешь, и сказал что-нибудь вроде "Ну да, ты прав, сделаю так в следующий раз".

http://ru.wikipedia.org/wiki/Парсинг

Вобщем, в твоём случае, это разбиение всего файла на строки, выделение из этих строк комментариев, заголовков секций, и ключев; выделение из ключей их названий и значений.

Даже если исправить все ошибки, будет ли он лучше существующего сейчас в кирпичах?

Я плохо помню что там, а смотреть -- лень и некогда.

Переходники к апишкам это что ты имеешь в виду?

Имеются в виду функции обёртки, подобные этой:
Код: Выделить всё
Public Function s_IniGetString(ByVal sInIFileName As String, _
                               ByVal sSectionName As String, _
                               ByVal sKey As String, _
                      Optional ByVal sDefault As String) As String
    Dim lStringLen As Long
    Dim sBuffer    As String
    sBuffer = Space(512)
    lStringLen = GetPrivateProfileString(sSectionName, sKey, sDefault, sBuffer, 512, sInIFileName)
    If lStringLen > 0 Then sBuffer = Left(sBuffer, lStringLen)
    s_IniGetString = sBuffer
End Function


А xml. Какое его назначение (основное?).

Его основное предназначение -- хранить структурированные данные, причём бысть способным хранить их вне зависимости от их структуры. Т.е. быть универсальным способом хранить данные любого формата.

К минусам можно отнести:
Всё что хранится, должно быть древовидным графом. Замкутых веток быть не может (их просто нельзя сделать).

Это, как и INI - текстовый формат. Минус любого текстового формата - его нужно парсить, чтобы поиметь доступ к данным. Это можно сравнить с книгой. Очень большой толстой книгой, содержащей очень много глав.

Но у этой книге есть одна особенность: у неё нет оглавления (где было бы написано какая глава где начинается), и весь текст написан одним и тем же шрифтом, т.е. визуально никак нельзя выделить заголовок главы из текста всей страницы. Причём заголовок главы может быть где-угодно (например на предпоследней строчке страницы).

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

Чем сложнее формат, тем сложнее его парсить. У ini всё предельно просто: токенов немного:
T_BRACKET_O "["
T_BRACKET_C "]"
T_EQUAL "="
T_SPACE " "
T_NAME
Причём первые 4 токена имеют фиксированную длину, и брекать их не нужно (т.е. не нужно искать их конец, они кончаются там же, где и начались).

Токен T_NAME брекается четырьмя брекерами - токенами T_EQUAL, T_SPACE (если имя ключа), токеном T_BRACKET_C (если это имя секции), и символом CRLF (если это значение ключа)
КА составляется очень легко, фактически, в нём очень немного ветвлений.

У XML же ещё добавляются T_SLASH / и T_COLON :

Но главное, что у XML сложнее правила анализа токенизированной последовательности.

К тому же, на разметку тратится гораздо больше данных ( <></> против инишного [] и <></> или <=""/> против инишного =), т.е. КПИ (коэффициент полезной информации) гораздо меньше.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.06.2008 (Вс) 18:22

Не в обиду будет сказано, но в современном мире твой КПИ далеко не так важен, как может показаться.
И сделай чтонибудь с этим smtp, выруби его что-ли
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

След.

Вернуться в Народный треп

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

Сейчас этот форум просматривают: PetalBot и гости: 5

    TopList