Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос из книги Страуструпа 
:(
    Опции темы
Abyx
Дата 11.12.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 5
Всего: 10



EvilsInterrupt, очевидно инкрементируется int который в карте
какбэ эта карта состоит из int 
и фактически код представляет собой
Код

int histogram[];

void record(const string & s)
{
  histogram[ string_to_index(s) ]++;
}

PM MAIL   Вверх
EvilsInterrupt
Дата 11.12.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Abyx, 
Спасибо ) А доп. вопрос ? ;)
PM MAIL WWW ICQ Jabber   Вверх
Abyx
Дата 11.12.2009, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 5
Всего: 10



Цитата(EvilsInterrupt @  11.12.2009,  21:44 Найти цитируемый пост)
при создании в мапе создается исключительно один инт и одна стринг, или в довесок еще доп. инт, так сказать служебный куда помещается хэш или еще чтото в этом роде 

в map хешей нет, там бинарный поиск по упорядоченным ключам
т.е. если ключи - string, пары сортируются в алфавитном порядке
PM MAIL   Вверх
EvilsInterrupt
Дата 11.12.2009, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Abyx, Огромное спасибо.
PM MAIL WWW ICQ Jabber   Вверх
Abyx
Дата 11.12.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 5
Всего: 10



для хешей надо другой контейнер, boost::unordered_map, он же std::tr1::unordered_map
http://www.boost.org/doc/libs/1_41_0/doc/html/unordered.html
PM MAIL   Вверх
wedens
Дата 11.12.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.10.2009

Репутация: нет
Всего: нет



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

    case Lexer::NAME:
            {
                            double& v = table[Lexer::pSym->string_value];
                            if(get_token() == Lexer::ASSIGN) v = expr(true);
                            return v;
            }

здесь я так понимаю в v возвращается значение, если в map существует запись string_value, а если не существует, то создается. но как тогда в эту запись приписывается double значение? 

Это сообщение отредактировал(а) wedens - 11.12.2009, 23:21
PM MAIL   Вверх
xvr
Дата 11.12.2009, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(EvilsInterrupt @ 11.12.2009,  21:44)
Возник вопрос, прошу пояснить ;) 
Есть код из книги Страуструпа:

Код

map<string, int> histogram;

void record(const string & s)
{
  histogram[s]++;
}


Мне непонятно что именно инкрементируется ?

Рассмотрим, что тут написано (вот это histogram[s]++;):
Код

int &value = histogram. operator[] (s);
value++;
Здесь operator[] - это обычная функция класса map, возвращающая ссылку на int. Она работает так: если в map есть строка, заданная параметром, то возвращается ссылка на поле данных (int). Если же такой строки нет, то она добавляется в map, для поля данных используется конструктор без параметров, т.е. int() - что обозначает инициализацию 0 (для POD типов данных). Ссылка на вновь добавленное поле возвращается.
Затем инкрементируется значение по возвращенной ссылке.

Цитата

попутный доп. вопрос:
при создании в мапе создается исключительно один инт и одна стринг, или в довесок еще доп. инт, так сказать служебный куда помещается хэш или еще чтото в этом роде ?
Снаружи видно только строку и int, все остальное - внутреннее дело map'а (там еще как минимум 3 поля для организации B/R дерева)

PM MAIL   Вверх
Леопольд
Дата 13.12.2009, 21:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(wedens @  11.12.2009,  22:30 Найти цитируемый пост)
как калькулятор из книги находит имя переменной и возвращает её значение?

Помню тоже долго разбирался в нём. Я считаю что это пример отвратителен с точки зрения поддержки и расширения. Возможно я ошибаюсь, не спец в проектировании, но на мой взгляд, код безоговорочно должен быть простым для понимания, частенько в этом помогают комментарии, но самое главное, надо реализовать алгоритм, понятный для человека - дерево синтаксического разбора разбивает выражение по приоритетам, потом всё выражение вычисляется и т.д. 
А у Страуструпа, насколько помню, три функции рекурсивно вызывают друг друга в зависимости от нескольких ифоф, и создают приличную "мешанину" в стеке вызовов, которую тяжело проследить. При этом всё жестко завязано с парсером, брр... У него изначально функциональность разделена на части неправильно. Жаль что он не написал перед началом примера
Внимание! Плохой стиль. Ни в коем случае не пытайтесь повторить! smile


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
EvilsInterrupt
Дата 13.12.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Леопольд, 
Буквально месяца 2-3 назад читал код калькулятора Страуструпа и понял его буквально  за 30 мин. Сейчас смотрю и думаю чего там сложного-то ? Что собственно произошло за это время? По своим антивирусным задачам, дома(если шеф увидит smile, начал писать мини-оптимизатор машинного кода, для этого начал читать про компиллеры от Ахо и его мысли про создание промеж. языка и оптимизации в нем. Видимо это и дало столь быстрое понимание калькулятора Страуструпа.

Думаю Бьярн, как и многие люди поступил как обычный человек: "Мне же понятно, вот же есть грамматика, вот есть код. Возьму элементарнейший калькулятор, каких еще поискать", но он забывает, что по его книге могут учиться совсем ньюбы! А возможно и не забывает, а сделал допущение что читают уже серьезные люди когда-то программившие на си и теперь изучающие плюсы.

Мое личное мнение по поводу книги, Страуструп предположил, что язык вышел излишне сложным и поэтому пишет даже в начале : "Если вы чтото не поняли, не переживайте и идите дальше. В дальнейших главах будем говорить более детально". Также думаю, что он писал книгу прежде всего для программистов на языке Си. Это учитывая тот факт, когда она появилась впервые и какую цель он преследовал создавая язык, какие сложности вставали до его языка. А дальше просто ее саппортил ;) Вот и вышло, старые грабли, получили новую жизнь !


Вывод:
Читать, читать, но читать много проходно! Как компиллер проходит по сорцу! Сначала токены, потом лексемы, потом грамматика и т.д. и т.п. ;)
 
PM MAIL WWW ICQ Jabber   Вверх
EvilsInterrupt
Дата 14.12.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Читаю про enum-ы ;)

вот, что пишет:
"Диапазон значений перечисления определяется след. образом. Пусть n-максимальное возможное значение элемента перечисления . Пусть m-такое минимальное целое, что 2^m-1 больше или равно n. Тогда верхняя граница диапазона равна 2^m-1. Если наименьший элемент имеет неотрицательное значение, нижняя граница диапазона равняется нулю. Если наименьшее значение отрицательно,  нижней границей диапазона является наименьшая ближайлая отрицательная степень двойки плюс 1. Таким образом, диапазон определяется минимальным количеством бит требуемым для представления значений всех элементов перечисления"

из этого следует, что автор сделал допущение в сторону мало-мальски математематически подкованного читателя!
PM MAIL WWW ICQ Jabber   Вверх
Леопольд
Дата 14.12.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(EvilsInterrupt @  13.12.2009,  23:33 Найти цитируемый пост)
Буквально месяца 2-3 назад читал код калькулятора Страуструпа и понял его буквально  за 30 мин. 

Думаю, мне бы сечас тоже особого труда не составило, потому что я сейчас работаю на языке, где goto использутеся буквально через каждые 10 строк кода. Точнее поддерживаю этот бред. smile

А так как книга Страуструпа была у меня второй, после Подбельского и мышление ещё не выработалось, я разбирался в "калькуляторе" около дня.

Это сообщение отредактировал(а) Леопольд - 14.12.2009, 13:36


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
EvilsInterrupt
Дата 14.12.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Леопольд, готу рулит! ;))) я сам ща в таком коде плаваю из-за рабочей задачи поставленной партией ;) мало того что это гоуту, так еще коду 10 лет и писало его столько же же чел, каждый возвращался в разные промежутки временного отрезка год, два . А люди как правило за годы "умнеют" и написание кода тоже меняется. Это не есть хорошу(первоначальный вариант этого сообщения было грубее, сорри)

Это сообщение отредактировал(а) EvilsInterrupt - 14.12.2009, 14:41
PM MAIL WWW ICQ Jabber   Вверх
Леопольд
Дата 14.12.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(EvilsInterrupt @  14.12.2009,  14:27 Найти цитируемый пост)
так еще коду 10 лет

Хех, "моему" коду не менее 20 лет. И писало его человек надцать, если не больше. Вся система состоит из 1000 - 1500 файлов по 15000-70000 строк кода (вместе с комментами). Никто её не знает целиком, только небольшую её часть. Это добро, примерно на 70% задокументированно, но качество документации хромает на все конечности smile


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
EvilsInterrupt
Дата 14.12.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Леопольд,  Будут мысли хорошего и эффективного рефакторинга кода с goto пиши! ;) Только плиз в виде отдельной темы, все равно понадобиться. Хотя бы нам двоим хранить мысли по войне с готу )
PM MAIL WWW ICQ Jabber   Вверх
bsa
Дата 14.12.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(EvilsInterrupt @  14.12.2009,  20:56 Найти цитируемый пост)
Будут мысли хорошего и эффективного рефакторинга кода с goto пиши!
Поищи в религиозных войнах. Я использую следующие способы:
1. разделение на функции (return лучше, чем goto)
2. выделение части кода в цикл do { }while (false);
3. исключения, но это в редких случаях (когда речь идет об обработке редких ошибок).

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0714 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.