Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 862
от 29.09.2007, 19:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 478, Экспертов: 60
В номере:Вопросов: 3, Ответов: 5


Вопрос № 103177: Здраствуйте, уважаемые эксперты. Пожалуйста, объясните принцип перевода числа в число прописью, например 4 - четыре и т.д. .... Предложенный алгоритм http://www.netcode.ru/cpp/?artID=53 выдает ошибку компиляции...
Вопрос № 103197: Здраствуйте, Уважаемы Эксперты. Помогите пожулуйста с написанием функции, которая считает контрольную сумму exe файла. Причём эта функция находиться в самом exe файле. И как записать эталонное значение контрольной суммы в самой программ...
Вопрос № 103252: Здравствуйте. Почему то не корректно работает библиотека string. Если пытаюсь вывести переменную: string str = “Hello world”; cout<<str; на экран ничего не выводится. Если же выводить отдельно элементы cout<<str[1]; то все выв...

Вопрос № 103.177
Здраствуйте, уважаемые эксперты.
Пожалуйста, объясните принцип перевода числа в число прописью, например 4 - четыре и т.д. ....
Предложенный алгоритм http://www.netcode.ru/cpp/?artID=53 выдает ошибку компиляции
Отправлен: 24.09.2007, 08:42
Вопрос задал: Serpenser PO (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Aristos
Здравствуйте, Serpenser PO!

Перевод числа из записи цифрами в запись прописью можно осуществить следую следующему алгоритму:
1. Выделить тройки цифр - числа до тысячи, тысячи, миллионы и т.д.
2. Каждую тройку разбить на сотни и десятки. Сотни, если есть, заменить на соотв. строку.
3. Отдельно разобрать случай 0-9 и 11-19. Для 20+ разбить на десятки и единицы.
4. Собрать из прописных предствалений отдельных троек полное число.

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

Приложение:

---------
нет ничего невозможного

Ответ отправил: Aristos (статус: 6-ой класс)
Ответ отправлен: 24.09.2007, 16:59


Вопрос № 103.197
Здраствуйте, Уважаемы Эксперты.

Помогите пожулуйста с написанием функции, которая считает контрольную сумму exe файла. Причём эта функция находиться в самом exe файле.
И как записать эталонное значение контрольной суммы в самой программе? Проблема в том, что когда подсчитана контрольная сумма и мы записываем её в листинг программы и снова компилируем, контрольная сумма уже будет другой.
Может я что-то понимаю неправильно.

Заранее спасибо.

Приложение:

Отправлен: 24.09.2007, 11:05
Вопрос задал: MARTALEX (статус: 4-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Aristos
Здравствуйте, MARTALEX!

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

Я не знаю, как без внешнего изменения программы (в hex-редакторе) решить проблемму с контрольной суммой. Поэтому подскажу следующий способ.

Основная идея состоит в том, чтобы при посчёте контрольной суммы для файла пропустить байты в которых содержится запись самой суммы. Добавим в файл заранее известную "метку", например текст "1234567800000000" (первые 8 байт будем использовать для поиска, в оставшуюся (нули), запишем в hex-редакторе контрольную сумму). С большой вероятностью подобная последовательность байт в файле больше не встретится. Будем считывать данные из файла порциями по 16 байт и сравнивать первые 8 с первыми байтами метки. Если не равно, то используем байты для расчета контрольной суммы.
После запуска открываем файл в hex-редакторе, находим метку и заменяем нули на значение контрольной суммы.

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

ps: Необходимо предусмотеть механизм получения от программы подсчитанной контрольной суммы. Например, если проверка не удалась её можно выводить на печать.
pps: так же необходимо задать выравнивание (кратноть адреса в файле) метки в файле. В компиляторе MS VC это делается с помощью инструкции __devlspec(align(n)).

Приложение:

---------
нет ничего невозможного

Ответ отправил: Aristos (статус: 6-ой класс)
Ответ отправлен: 24.09.2007, 14:27
Оценка за ответ: 5
Комментарий оценки:
Ваши слова: "Основная идея состоит в том, чтобы при подсчете контрольной суммы для файла пропустить байты в которых содержится запись самой суммы.", натолкнули меня на мысли. Спасибо большое, вы мне очень помогли.


Вопрос № 103.252
Здравствуйте. Почему то не корректно работает библиотека string. Если пытаюсь вывести переменную:
string str = “Hello world”;
cout<<str;
на экран ничего не выводится. Если же выводить отдельно элементы cout<<str[1]; то все выводится нормально. Так же не получается передавать в качестве аргумента функции инициализации файла.
ofstream infile(str);
выдает ошибку:
Could not find a match for 'ifstream::ifstream(std::basic_string<char,std::string_char_traits<char>,std::allocator<char>>)'
Кроме того при подключение библиотеки постоянно висят несколько предупреждений:
Warn : string.h(549,3):Functions containing for are not expanded inline.
Использую Borland C++ version 5.02;
Посоветуйте пожалуйста как можно решить проблему.

Приложение:

Отправлен: 24.09.2007, 19:26
Вопрос задал: Angelkaworu (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Aristos
Здравствуйте, Angelkaworu!

Возможно дело в "особенностях" реализации стандартной библиотеки, идущей в комплекте с BC++. Для конеретно этих случаев - используйте функцию string::c_str(), которая возвращает указатель на хранимую строку:

string str = "Hello world";
cout<<str.c_str();

и

ostream ofile(str.c_str());
---------
нет ничего невозможного
Ответ отправил: Aristos (статус: 6-ой класс)
Ответ отправлен: 24.09.2007, 22:15
Оценка за ответ: 5
Комментарий оценки:
Спасибо за совет. Теперь все работает.

Отвечает: Dr_Andrew
Здравствуйте, Angelkaworu!
Суть Вашей проблемы становится очевидной при взгляде на версию компилятора: Borland C++ version 5.02. Дедушка довольно древний, а Вы пытаетесь заставить его обработать класс библиотеки STL диалекта Standard C++. Если Вы не имеете возможности использовать что-то поновее, то Вам придётся забыть о STL и классе string и программировать в строки в старом стиле, как массивы символов (см. код 1).
В целом, могу лишь присоединиться к предложению сменить компилятор. Хотя я не работаю под Windows, но в своё время переносил свои программы под эту ОС и "прикручивал" библиотеку Qt к различным компиляторам от Borland. Бесплатный консольный Borland C++ Compiler 5.5 крайне не рекомендую, т.к. он хоть и работает с STL, но крайне плохо. Код, который без проблем компилировался-выполнялся в Linux на g++ и в Windows на MS Visual Studio, в BCC и в Borland C++ Builder 5.0 вылетал с ошибками. Но, вроде, по отзывам, в новой версии компилятора это исправлено. Так что попробуйте Borland Turbo C++ Explorer, тем более, что он официально бесплатен и доступен для скачивания (не путать с Turbo C++ 3.0 - древним предком Borland C++ 5.02!).
В нём Вы можете воспользоваться классами библиотеки STL и программировать в "новом" стиле (см. код 2).
Кстати: не стоит смешивать "французский с нижегородским" (разные диалекты C++):
1. Заголовочный файл conio.h содержит функции (в частности, getch()), являющиеся творчеством компании Inprise / Borland и не имеющие к стандартному C++ никакого отношения. Стоит помнить, что исходный текст, содержащий заголовочном файле conio.h будет компилироваться только компиляторами от "дяди Бормана", но никак не другими, т.е. утрачивается основное преимущество C++ - переносимость.
2. Конструкция main(void) характерна для Си, но не для C++. В последнем достаточно main().

Приложение:

Ответ отправил: Dr_Andrew (статус: 1-ый класс)
Ответ отправлен: 24.09.2007, 23:25
Оценка за ответ: 5
Комментарий оценки:
Спасибо за развернутый ответ. Проблему уже решил. Но все равно попробую скачать
Turbo C++ Explorer.

Отвечает: Dutka M.M.
Здравствуйте, Angelkaworu!
Кинься етого string
вспомни о char[] и всё будет хорошо:)
Ответ отправил: Dutka M.M. (статус: 1-ый класс)
Ответ отправлен: 25.09.2007, 00:49
Оценка за ответ: 4


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.60.05 от 27.09.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное