![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| =Женек= |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Все- таки сколько бы люди не давали советов, всегда получается что-то свое и причем более рациональное.
И я считаю что такой информацией нужно обмениваться. Я спрашивалл здесь как обрабатывать строку по шаблону, как выдрать слово и распознав его обратиться к свойству одноименной компоненты - мне мне отвечали - " А никак. Нет в С такого". Тем не менее, привожу полученный код. Это часть программы, которая выводит степень опьянения в зависимости от концентрации алкоголя в крови. Причем выводит его по зараннее определенному шаблону, находящемуся в текстовом файле.
То есть, программа прочитав имя, фамилию, отчество и пр., берет из определенного *.txt шаблона текст типа
заменит ее на
Ваши комментарии ? |
||||||
|
|||||||
| Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Молодец, конечно, что сделал, но... Раз не понимаешь, о чем говоришь, то лучше не говори. Под "обработкой строки по шаблону" ты понимаешь выковыривание и замену "{подстроки}" чтоль? Круто. Очень сложно. Надеюсь, фразу "а никак" ты не к этому отнес. Тогда по другому вопросу. В "С" такого быть в принципе не может (если не извращаться В "С++" такого быть изначально тоже не может. Ты воспользовался конкретной библиотекой, ВЦЛ. Кроме того, в том топике тебе очень хорошо посоветовали воспользоваться массивами, или же std::map<std::string,TEdit*>. По твоему, как в ПХП это реализовано на уровне интерпретатора? Наверняка именно так. Вопрос: зачем вообще писать на C++, если принцип формы сохранился полностью? Делал бы на ПХП... Это сообщение отредактировал(а) Hroft - 21.2.2005, 11:02 |
|||
|
||||
| Guest |
|
||||
|
Unregistered |
Hroft
Знаешь, я полный ноль в С, поэтому если честно я так и не понял твоей идеи.
Вот этого, учитывая иронию в тексте я никак не понял. Совет воспользоваться std::map<std::string,TEdit*> никак не был прокомментирован, и сколько я не искал в инете инфу на эту тему - ничего путного не нашел. Может я и сильно ошибусь, я ведь не такой корифей как вы, но по-моему, ((TEdit*)FindComponent(parameter))->Text намного проще и рациональней чем перебор массивов и пр. И по крайней мере, учитывая что это не консольное приложение, а с использованием визуальных компонент - более рациональное. Впрочем, повторюсь, возможно я и ошибаюсь. Воспользовался библиотекой ВЦЛ? А зачем мне от нее отказыватся если собственно на компонентах и базируется программа?
А вот сам подумай, нафига мне изучать новый язык чтобы написать такую же программу с такими же формами? Тем более, что в PHP я чувствую себя как рыба в воде, а тут два дня не мог строку обработать? Наверное возникла такая необходимость, как ты думаешь? А в целом, спасибо за критику и добрые советы. Удачи! |
||||
|
|||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Первое, что увидел
Эта функция свалит программу в том случае, если компонет с именем равным parameter не является объектом класса TEdit или его потомком. Да и вообще, не следует использовать такое преобразование типов для классов, содержащих виртуальные функции. Копай в сторону dynamic_cast<>() -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
srd
Знаю, я узнал про dynamic_cast тогда же когда и про FindComponent. Дело в том что в моей программе такая ситуация исключена полностью.
Если не трудно, поподробнее в этом месте.. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
to =Женек=
Модератор: Название темы должно отражать ее суть! -------------------- ![]() |
|||
|
||||
| Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Про map говорилось в соседнем топике, это просто удобнее и бысрее, чем vector<pair<>>, который предложил, если не ошибаюсь, _hunter (лень смотреть точно).
Это обычный ассоциативный массив, они и в ПХП есть, и работает он очень быстро в таких случаях. Это не проще, чем приведение типа, но с помощью этого приема локализуются все проверки на корректность указателей (даже если они не нужны тебе, как ты говоришь), в маленькой программе не имеет это особого значения, но раз тебе НУЖНО осваивать новый язык, то лучше сразу приучаться. Кроме того, тебе же самому должно быть это приятно, ведь очень сильно напоминает ПХП с его переменными имен переменных, если я еще не все забыл.
Тут можно подумать, что ты "никак" отнес к "обрабатывать строку по шаблону". А раз ты хорошо знаком с ПХП, то обработка строк, тем более такая простая, для тебя не должна составлять проблемы, так чего о ней вообще говорить... Про ВЦЛ - ну да, на компонентах ты основываешься, но вот только компоненты - виндовые, и в винде никакой информации об имени конкретного элемента управления нет, поэтому ты не С++ использовал для поиска компонента, а ВЦЛ как надстройку над виндой, в ВЦЛ уже предусмотрены имена контролов. В МФС такой подход уже не сработает, вроде бы, хотя контролы будут те же самые. В голом С++ с windows.h вот так просто это у тебя не получится, а вот map или vector<pair<>>работать будут. Про необходимость - ну да, резон у тебя должен быть. Если что, извини, но название темы меня едва не взбесило. Я и сам не особо "корифей", но больше так темы не называй, ок? Про виртуальные функции имелось в виду, наверное, то, что в классе с оными всегда содержится указатель на таблицу виртуальных функций, и он может попортиться, хотя это может произойти, на мой взгляд, только если классы из разных иерархий, а в рамках одной этот указатель будет одинаковым для всех классов. Но, опять же, точно не знаю. |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Я имел в виду следующее:
Как вы думаете, что появится в консоли после выполнения программы? -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Я честно сказать здесь никакого бардака не вижу.
Более того, этот код - классический пример при вступление в описание интерфейсов и работе с ATL COM. Бардак здесь будет только в том случае, если нет логики в разработке кода. Тут уж извините. |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Ничего похожего на интерфейсы здесь нет! Между Child1 и Child2 нет наследования.
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Пример очень специфичный, зависимый от реализации, и в целом идея преобразования одного класса в другой посредством общего предка - очень опасная штука. Тут и динамик каст не поможет. Более того, явное преобразование &child1 к Base* бессмысленно, это и так нормальное преобразование потомка к предку, а последующее преобразование к типу из другой ветки - скорее ошибка, чем использование фичи языка. В чем я неправ?
|
|||
|
||||
| Fantasist |
|
||||||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
А чего тут бесится, все правильно - сколько не спрашивай, а свои проблемы надо решать самому.
Тут барадак в логики преобразований, а не в отсутсвии использования dynamic_cast. С использованием dynamic_cast программа бы вылетела по null pointer exception. dynamic_cast имеет смысл применять тогда, когда есть вероятность предусмотренная логикой программы при которой преобразование может быть неверным и в этом случае просле dynamic_cast должна быть проверка указателя на null. Если же логика программы построенна так, что преобразование всегда заведомо неверное, то и dynamic_cast не поможет. Или наоборот, если всегда точно известно, что преобразование верно, то и dynamic_cast не нужен - достадочно static_cast (он, кстати, быстрее). Как например здесь:
Этот кусок лучше переписать тогда так:
Правда свойство Text может быть protected, для этого его надо опубликовать известным приемемом Fake класса. =Женек=, есть такая функция Format - на вид она делает то, что ты хочешь. Это сообщение отредактировал(а) Fantasist - 25.2.2005, 20:25 -------------------- Волны гасят ветер... |
||||||||||
|
|||||||||||
| srd |
|
||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Верно, а без dynamic_cast отработала бы без ошибок, потому что child2 на самом деле указывает на объект Child1, и вызывается функция-член foo(), хотя написано child2->bar(). Но это ведь явно не то, что хотели.
В этом случае для надежности можно использовать шаблон, который для DEBUG-версии разворачивается в dynamic_cast<> плюс assert, а в RELEASE-версии - в static_cast. -------------------- Не смей читать мою подпись!!! |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |