1 / 1 / 1
Регистрация: 28.04.2013
Сообщений: 35
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Проверьте пожалуйста реализацию кода [Мини-скрипт язык]22.10.2014, 05:21. Показов 517. Ответов 6
Метки нет (Все метки)
Встала задача создать структурный язык на подобие xml, для передачи и приёма данных в моём протоколе..
Собственно что должно получится: 1. Язык должен иметь теги <>. 2. Между двумя тегами должны хранится данные. 3. По выбору тега, должны возвращаться данные. В итоге получилось это:
Хейдер: Кликните здесь для просмотра всего текста
Private: Кликните здесь для просмотра всего текста
Первый минус который я нашел, это фиксированный размер буффера, но если его делать динамическим, возникает ряд проблем, но всё же сделаю позже его фиксированным. Хорошо ли с производительностью? Не где не ошибся? Вроде более 1000 тегов грузились мгновенно.. Заранее спасибо..
0
|
22.10.2014, 05:21 | |
Ответы с готовыми решениями:
6
Проверьте скрипт пожалуйста. Пожалуйста, проверьте, есть ли ошибки в приведённом куске кода. Вычисление значения по формуле (пожалуйста, проверьте правильность кода) Проверьте реализацию бинарного поиска |
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
22.10.2014, 07:42 | 2 |
Прежде всего: почему потребовалось разрабатывать свой формат и вместе с этим писать свой парсер? Уже существует множество форматов и готовых библиотек для разбора json, xml, yaml, ini и т. д. Возможны варианты в духе "я это осознаю, но все равно хочу все написать самостоятельно", "это учебное задание и такие требования" или что-нибудь еще. Если же существующие форматы не подходят или есть сомнения в производительности/качестве библиотек - это уже повод остановиться и задуматься.
Структура плоская, вложенных тегов быть не может? Используй std::string - сразу станет меньше головной боли. Теперь к коду. Прежде всего, пройтись с заменой s/teg/tag/. Не сокр. Уже тут неконсистентность в именовании: Неочевидное использование оператора <, который практически всегда используется для сравнения. Лучше написать метод с человекочитаемым названием. А если уж хочется оператором, то лучше в стиле стандартных потоков: <<. Заменить все константами. iostream Идентификаторы, начинающиеся с подчеркивания, зарезервированы. Преждевременная оптимизация - корень всех зол. s/Не где/Нигде/ Чтобы ответить на этот вопрос, достаточно покрыть код тестами. Что произойдет, если не подавать на вход конфиг, но попытаться получить значение? Если подать пустой конфиг? Если подать невалидный конфиг? Вроде бы ни в одном случае ничего не падает, но проявляется одна проблема: в случае невалидного конфига нет механизма сообщений об ошибке. И еще замечание. Функции возвращают 1, 0, -1 для сообщения о результате выполнения. лучше использовать именованые константы. Или бросать исключения.
1
|
1 / 1 / 1
Регистрация: 28.04.2013
Сообщений: 35
|
|
22.10.2014, 09:15 [ТС] | 3 |
Спасибо за ваш пост!
Небольшая часть от дипломной) По началу, по плану хотел создать с вложенными тегами, но потом планируя алгоритм по обращению к тегу, понял что удобнее обращаться к плоским тегам. Напишу пару сетевых программ, там будет видно, что лучше, плоские структуры или нет. Вы правы. Поясните почему? Ничего не произойдет. Если нужна проверка, то метод ReturnData возвращает 0, если не был найдет тег или у тега нет пары(т.е он не закрыт).. Есть небольшой механизм - это обращение к ErrorTeg, после вашего поста увеличил число ошибок, который в него подгружается, в случае их возникновения.. Но ведь она приватная функция и пользователю нет дела, что она возвращает Еще раз спасибо!
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
22.10.2014, 09:29 | 4 |
Правило хорошего тона - использовать препроцессор только в случае необходимости, во всех остальных - обходиться языковыми средствами.
Все-таки нужно, мне кажется, строже валидировать входные данные. Иначе получаем "мусор на входе - мусор на выходе". Причем мусор на выходе отследить сложно. Пример. Вот такой конфиг совершенно спокойно принимается парсером. <login>0x10<pass>42<pass>. И при запросе pass возвращается именно 42. При запросе login - не получим ничего. Нелогично. Если данные были невалидны, то по хорошему мы не должны ничего делать. Я сразу как-то проглядел его. Это чисто сишный подход - хранить ошибку последней операции как состояние. Порождает ряд проблем. 1. Состояние имеет смысл только непосредственно после вызова функции. Следовательно, нужно контролировать его использование. 2. Не подходит для случаев, когда объект разделяется несколькими потоками. Конкретно здесь ни то, ни другое, возможно, и не проявит себя. К этому и другим вопросам, где причины моих замечаний были неочевидны. Небольшие программы многое могут стерпеть, поэтому на изменениях не настаиваю.
0
|
1 / 1 / 1
Регистрация: 28.04.2013
Сообщений: 35
|
|
22.10.2014, 09:45 [ТС] | 5 |
Работая с исходными кодами одной корейской мморпг, вижу использования препроцессора, похоже заразился такой привычкой..
Пруф: http://c2n.me/j8hpbK В других проектах как-то не обращал внимания.. http://c2n.me/j8hu20 Тип данной ошибки добавил, а так она исключалась в моём коде, просто её не было в ErrorTeg.. упс, за teg простите Верно и из примера выше, вроде удобнее )
0
|
0 / 0 / 0
Регистрация: 22.10.2014
Сообщений: 3
|
|
22.10.2014, 09:51 | 6 |
Автор, попробуйте boost::spirit. Ручной парсинг - дело неблагодарное.
0
|
1 / 1 / 1
Регистрация: 28.04.2013
Сообщений: 35
|
|
22.10.2014, 10:00 [ТС] | 7 |
Спасибо, но.. у меня курсовая по небольшой сетевой библиотеке, будет странным, если она будет с boost asio и прочими средствами из данной библиотеки
0
|
22.10.2014, 10:00 | |
22.10.2014, 10:00 | |
Помогаю со студенческими работами здесь
7
Silverlight - геометрический мини-язык в коде Как перевести на немецкий язык мини-диалог? Не могу понять реализацию кода Вынеси реализацию в файл кода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |