|
На страницу « 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 » |
|
|
|
|
Возраст: 37 C нами с 25.01.2005 Репутация: 133
|
|
Неоспоримым достоинством языка С++ является то, что он является языком одновременно и высокого и низкого уровней, что делает его незаменимым при разработке игр и других сложных и требовательных к производительности приложений.
P.S. Перед задаванием вопросов вроде "Что делает эта функция" настоятельно рекомендуется поизучать MSDN.
P.P.S. В ближайшее время выложу много литературы по этому вопросу.
|
|
|
|
|
|
|
|
Возраст: 35 C нами с 04.02.2005 Репутация: 121.3
|
|
splav, ладно, придумаешь — расскажешь
|
|
|
|
|
|
|
|
C нами с 06.11.2007 Репутация: 32.5
|
|
Дайте плз книг по Borland C++, для создателей игр (начинающих)
|
|
|
|
|
|
|
|
Возраст: 36 C нами с 13.03.2006 Репутация: 131.6
|
|
Selax, такого не бывает Есть отдельно книги по изучению среды разработки Borland C++, а есть - отдельные книги для разработки игр на С++.
|
_____________________________ "That is not dead which can eternal lie, and with strange aeons even death may die." H.P.Lovecraft
|
|
|
|
|
|
|
Возраст: 37 C нами с 25.01.2005 Репутация: 133
|
|
Selax, если хочешь писать игры, забывай борланд. Лучше тренируйся на Visual Studio - всё равно на неё рано или поздно переберёшься
З.Ы. Книг кучу я выкладывал в своё время на трекер. Поищи там, правда большинство на английском
|
_____________________________ Это ты, Джон Уэйн?
|
|
|
|
|
|
|
Возраст: 34 C нами с 21.03.2005 Репутация: 130
|
|
Цитата: |
SetFilePointer(hFile,0x00007560,NULL,0);
WriteFile(hFile,param,lstrlen(param),&szDw,NULL);
|
как сделать так чтобы передаваемое значение param записывалось в двойном base64?
|
|
|
|
|
|
|
|
Возраст: 37 C нами с 03.04.2006 Репутация: 73.7
|
|
Тут проблемка возникла. короче нужно измерить время выполнения одной или несклоьких функций, делаю я это вот таким вот способом
clock_t perform_time;
clock_t time;
time = clock();
some_funtions();
perform_time = clock() - time;
|
Но при этом получаеться что perform_time почти всегда равна 0. А вот если изменить код вот так:
clock_t perform_time;
clock_t time;
time = clock();
some_funtions();
while(time == clock());
perform_time = clock() - time;
|
то perform_time равняется 15 или 16... Это под windows, под linux(правда там уже не x86, а ia64) тоже самое только там не 16 а что-то похожее 192...
ну и собственно вопрос в том как сделать так чтоб он не перескакивал с 0 до 15, или какой нибуть другой подход к решению этой задачи, притомнужно чтоб это всё работало и под linux...
|
_____________________________ "Если да, конечно нет" Futurama
|
|
|
|
|
|
|
Возраст: 35 C нами с 04.02.2005 Репутация: 121.3
|
|
Ну ничего удивительного нет, просто функция работает быстро. А время дискретно, да еще и time slice существует, в результате чего получаем такой скачок. Нет смысла мерить время одного вызова такой функции. Стоит либо воспользоваться профайлером (он покажет, сколько всего в течение выполнения программы работала данная функция), либо вызов этой функции повторить N раз в цикле и взять среднее значение.
|
|
|
|
|
|
|
|
C нами с 17.10.2005 Репутация: 253.4
|
|
AAsad, разрешающая способность как раз на двухъядернике по-моему 15 мс, т.е. тебе надо использовать другие таймеры...
например timeGetSystemTime...(не пробовал не знаю(подсмотрел в MSDN ), смотри вообщем мультимедийный таймер)
|
_____________________________
|
|
|
|
|
|
|
C нами с 15.04.2005 Репутация: 133.2
|
|
AAsad, дискретность time slice (время переключения планировщиком контекстов задач) у разных ОС разная. К примеру у Windows XP — 16, linux — обычно 10, FreeBSD — обычно 7 и т.п. (обычно — это по умолчанию, потому што у этих ОС их можно и покрутить). Есть вариант использовать инструкцию RDTSC (она вроде непривилегированная) — выдаёт количество тактов прошедших с момента старта процессора (включение питания, сброс), но с мультипроцессорностью есть проблемы. Аналог API Windows QueryPerformanceCounter() (с мультипроцессорностью проблем нет).
В связи с требованием "штобы работало под linux" совет воспользоваться профайлером самый правильный. Однако, в любом случае, при измерении быстродействия каких либо функции, особенно связанных с перелопачиванием памяти нужно делать множество циклов одной и той же операции, дабы учесть эффекты кэширования, предсказания ветвлений и т.п. Иными словами, цикл измерения должен выглядеть вот так:
...
clock_t perform_time;
clock_t time;
time = clock();
for (int i = 0; i < nRepeats; i ++)
some_funtions();
perform_time = clock() - time;
... |
nRepeats выбирается экспериментально, чтобы время выполнения было скажем секунду-две, это даст уже приемлимую картину. И, следовательно, усреднённое время выполнения будет perform_time / nRepeats.
|
_____________________________ Время не существует, у него нет физического носителя в природе. Его выдумал человек, чтобы измерять скорость.
|
|
|
|
|
|
|
Возраст: 37 C нами с 03.04.2006 Репутация: 73.7
|
|
Спасибо за помощь. Правда моя задача не позволяет набрать статистику, с помощью замера нескольких вызовов, но зато я решил эту проблему другим способом, просто в библиотеке которую использовал для паралелизации(MPI), нашёл функцию замера врмени(MPI_Wtime()). Но всё равно спасибо.
|
_____________________________ "Если да, конечно нет" Futurama
|
|
|
|
|
|
|
Возраст: 48 C нами с 11.12.2006 Репутация: 54.1
|
|
Прошу помощи у тех, кто видел С++ Builder:
Писали мы программку с локализацией на русском и английском, причём стринги читались из INI- файла, и всё шло ладненько, но тут попросили сделать французский вариант. Переводчики прислали нам переведённые INI файлы, но тут Builder упёрся: редкостные французские буквы (вроде Е с чёрточкой или Е с домиком) показывать не желает! Builder был 5-ый, попробовали 6-ой - ещё хуже. Раскладку клавиатуры меняли, да и вообще всё, что нашлось в языковой панели - от силы добились вместо крякозябр общеупотребительной буквы "Е". Отсюда вопрос: как грамотно построить локализацию? Хорошо бы ссылки на титанов борландовской мысли
|
|
|
|
|
|
|
|
C нами с 15.04.2008 Репутация: 125.9
|
|
Дорогой друг!
Не являясь знатоком Фр. языка, столкнулся с такой же проблемой на Итальянском в 2005 г.
Если не побрезгуете, вот советы.
Не заморачивайтесь автоматизацией, проще сделать всё руками.
INI-файлы => 99% это не Юникод, его лягушатники не любят => определите кодировку, учитывая при этом, что ту, которую рекомендует Майкрософт используют только в Квебеке. У Французов три кодировки, которые к тому же отличаются порядком сортировки. Учтите, что есть ещё Швейцарская и Валонская.
Крайне не советую работать через local_handlers - будете зависеть от настроек Виндоуз тех машин на которых будет исполняться программа.
Проще узнать кодировку, используемую у Ваших Французов, и тупо написать транслитерацию только под нее. Обычный цикл по строке с заменой ex-ASCII-кодов.
Меньше нервов потратите.
|
|
|
|
|
|
|
|
Возраст: 48 C нами с 11.12.2006 Репутация: 54.1
|
|
TigerTiger, вот спасибо, оперативненько! Моя проблемка, конечно, когда-нибудь решится, но в голове возникает общий вопрос: ну ладно мы, как-то перебьёмся, но ОНИ как обходятся??? Хотя вопрос скорее по части философской, нежели программной...
P.S. В Квебеке? Вот это особенно ценно, завтра проверим!
|
|
|
|
|
|
|
|
C нами с 15.04.2008 Репутация: 125.9
|
|
Ещё раз прошу учесть, что мы решили эту проблему не для Французского, а для Итальянского, где по сути только 2 кодировки - Итальянская и Швейцарская. Хотя в самом Итальянском алфавите своя тоько 21 буква.
Но у на с тоже вылезали русские буквы "Т,Щ,Ш,О,А".
С последними двумя аккуратней, на вид они не различимы.
Главное помните, что у Borland local-обработка - это как-бы надстройка над ANSI-обработкой Microsoft, со всеми вытекающими последствиями.
|
|
|
|
|
|
|
|
C нами с 15.04.2005 Репутация: 133.2
|
|
1.
Простой способ (которым я пользуюсь чаще всего) использовать строковые ресурсы (вроде как рекомендован MS для локализации).
Пример .rc файла:
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_NEUTRAL
STRINGTABLE
BEGIN
IDS_STRING101 "window"
END
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
STRINGTABLE
BEGIN
IDS_STRING101 "fenêtre"
END
|
Тогда LoadString(..., IDS_STRING101, ...) загружает строку соответствующую текущей локали: французскую для французской, английскую для английских и остальных. Написав несложную обёртку для FindResourceEx()/LockResource() можно указывать конкретную локаль — для переключаемого интерфейса. (К слову заметить — загружает не совсем верное определение, поскольку эти таблицы уже отображены в память при загрузке образа исполняемого файла, LoadString() и т.п. просто выполняют копирование по указателю, а LockResource() позволяет обойтись без лишнего копирования).
2.
Ещё вариант использовать MessageCompiler (mc.exe), но у него несколько иная область применения. Он формирует ресурсы для использования функцией FormatMessage(), которая обычно используется для получения текстового описания ошибки, но никто не запрещает использовать для получения обычных строк по числовому идентификатору.
Пример .mc файла:
MessageIdTypedef=DWORD
LanguageNames=(English=0x409:TNMMSG409)
LanguageNames=(Russian=0x419:TNMMSG419)
FacilityNames=(
Special000=0x000
)
MessageId=0x00000001
Severity=Error
Facility=Special000
SymbolicName=USBUD_ERR_CRC
Language=English
HC Error: Worng CRC
.
Language=Russian
Ошибка HC: Неверная контрольная сумма
. |
3.
Но если вопрос стоит в использовании внешнегого .ini файла, то простой выход, который я вижу — перевести его в юникод и использовать функцию GetPrivateProfileStringW() (и её спутников) для чтения юникодных строк.
Прелесть всех методов в том, что для кодировки можно использовать (и обычно используется и, более того рекомендуется) юникод, что устраняет множество проблем с национальными символами.
...
Но если Ваше приложение не Unicode, а ANSI, то мне остаётся только пожелать счастливого траха. Конечно, все эти проблемы решаемы и, при ближайшем рассмотрении, я бы даже чего-нибудь посоветовал, но не знаю конкретики, в частности особенностей C++ Builder.
|
_____________________________ Время не существует, у него нет физического носителя в природе. Его выдумал человек, чтобы измерять скорость.
|
|
|
|
|
|
|
На страницу « 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 »
|
|