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

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


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

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

Выпуск № 507
от 28.08.2006, 00:35

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


Вопрос № 52834: Здравствуйте. Меня интересуют тонкости программирования на С/С++ под 64битные процессоры. Пощупать ручками пока не имею возможности но очень уж интересно, просветите на будующее. 1) Указатели теперь 8 байтовые? 2) int 8 байтовый? как тепе...
Вопрос № 52889: Как мне можно получить Vendor и Device ID устройств PCI шины (из программы или из драйвера - любое подойдёт, главное под Винду), я пробовал найти адрес BIOS32 и обратиться к нему с помощью дальнего вызова, но ничего не получилось, как впрочем и с пре...
Вопрос № 52936: Привет, всем! Как грамотно буферировать UNICODE-переменные? Т.е. например: в - GetModuleFileNameW (0, MyModuleFileName, MAX_PATH+1); - «MAX_PATH+1» вызывает у меня смутные сомнения верно ли? Второй пример в коде (WideString...
Вопрос № 52938: Здравствуйте не могу доделать задание как определить глубину дерева(двоичное дерево)вышлите код этого модуля.или скажите где взять информациюпоэтому вопросу структура structTree{int dann;TREE *pleft;TREE *pright;}...
Вопрос № 52950: Здравствуйте, ув. эксперты! Недавно начал осваивать C++. Вопрос такой, какой самый подходящий (быстрый, удобный) компилятор для языка этого. Хочется узнать Ваши мнения, т.к. в различных источниках они расхожи. //опыт программирования имеется//<br...

Вопрос № 52.834
Здравствуйте.
Меня интересуют тонкости программирования на С/С++ под 64битные процессоры. Пощупать ручками пока не имею возможности но очень уж интересно, просветите на будующее.
1) Указатели теперь 8 байтовые?
2) int 8 байтовый? как теперь брать 2, 4 и 8 байтовые целые?
3) Регистры 8 байтовые? Как они там называются eeax, eebx и т.д. ?
4) Как скажется на эффективности программ разбухание размера указателей?
Отправлен: 22.08.2006, 04:48
Вопрос задал: Ромка (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: nazarini
Здравствуйте, Ромка!
http://www.electronics.ru/101.html - прелести 64 бит, правда тут мало что отноститса непосретственно к програмированию, но тоже интересно, для обшего развития так сказать :)
Ответ отправил: nazarini (статус: 1-ый класс)
Ответ отправлен: 22.08.2006, 05:00

Отвечает: InviZ
Здравствуйте, Ромка!
1) Да, 8-байтовые.
2) Нет. int остался 4х байтовым. 8 байтовый - __int64, как и был раньше. Но вот реализации long int отличаются - в Windows-компиляторах 4 байта. В *nix - 8 байт.
3) rax, rbx, rdx и т.п. =)
4) Странноват вопрос. 64-битные указатели обусловлены 64-битным адресным пространством, вот, в принципе, и все их отличие. Так что, если кому-то раньше не хватало 32-битного адресного пространства (гмм, а такие есть? =)), то сейчас проблем не будет.
Насчет скорости - честно говоря, не знаю. Во многом еще предстоит разбираться, в общем-то, в той же организации виртуальной памяти и прочих низкоуровневых подробностях т.д. и т.п. Пока что не имею возможности у себя все это покопать, т.к. дома пока нет 64-битной системы, только у некоторых знакомых имел возможность немного ознакомиться...

Ответ отправил: InviZ (статус: 2-ой класс)
Ответ отправлен: 22.08.2006, 05:59
Оценка за ответ: 5
Комментарий оценки:
Спасибо.
Насчёт 4го вопроса имел в виду: так же быстро 64 битный проц тягает эти 8 байт как и 32 битный - 4. Ведь это больше в 2 раза надо извлекать из памяти, а мощь 8 байтового указателя в массе ещё пару лет будет использоватся только наполовину.


Вопрос № 52.889
Как мне можно получить Vendor и Device ID устройств PCI шины (из программы или из драйвера - любое подойдёт, главное под Винду), я пробовал найти адрес BIOS32 и обратиться к нему с помощью дальнего вызова, но ничего не получилось, как впрочем и с прерываниями, но потом понял, что прерывания вообще не покатят в защищённом режиме, а дальний вызов блокирует винда, помогите разобраться. Мой уровень знаний: Новичок!!!
Отправлен: 22.08.2006, 13:51
Вопрос задал: Sltk (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: InviZ
Здравствуйте, Sltk!
Гмм. В общем-то можно из драйвера через MmMapIoSpace - доступ к физической памяти...
Но можно и из ring-3 через секцию \Device\PhysicalMemory (открывается с помощью NtOpenSection, только привилегий требует...).
Ну а дальше, думаю, знаете... Сканируем диапазон 0E0000h - 0FFFFFh, ищем BIOS32-каталог и т.п. Примера, к сожалению нет, могу завтра как свободен буду, накатать...
Ответ отправил: InviZ (статус: 2-ой класс)
Ответ отправлен: 22.08.2006, 14:34

Отвечает: EPDSota
Здравствуйте, Sltk!

Информацию об устройстве можно почитать с PCI шины через ее порты (см. ниже)

Обращение к портам (операции inport32 и outport32) нужно делать через драйвер, допускающий чтение-запись портов, таких как TVicHW32 (www.entechatiwan.com/tools.htm).

Приложение:

---------
Открыть глаза навстречу солнцу

Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 25.08.2006, 11:05


Вопрос № 52.936
Привет, всем!

Как грамотно буферировать UNICODE-переменные?
Т.е. например: в - GetModuleFileNameW (0, MyModuleFileName, MAX_PATH+1); - «MAX_PATH+1» вызывает у меня смутные сомнения верно ли?
Второй пример в коде (WideStringVar.Length()*4 + 1) - он получен в результате проб, и тоже я не уверен в его корректности!

Заранее мерси В.Скопин

PS Как я благодарен Биллу за «MS Visual Studio 2005 С#», где wchar_t просто какой-то страшный сон из средневековья, да и всякие выделения памяти...

Приложение:

Отправлен: 22.08.2006, 21:11
Вопрос задал: VovikDoc (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: estiGi
Здравствуйте, VovikDoc!
MAX_PATH+1 сомнений вызывать в общем то не должно. И достаточно просто MAX_PATH. Эта константа определяет макс. возможную длину пути к файлу в системе, что вам еще нужно?
А вот это - (WideStringVar.Length()*4 + 1) - выглядит как то странно. Выделять нужно столько, сколько нужно, а не результатом проб. Юникодный символ весит 2 байта, а чтобы не забивать себе этим голову, сущетствует оператор sizeof
hgBuffer= GlobalAlloc(GMEM_DDESHARE, w.Length() * sizeof (wchar_t) + 1);
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 22.08.2006, 22:05
Оценка за ответ: 3
Комментарий оценки:
1.
>Юникодный символ весит 2 байта
Не всегда! МСДН пишет - зависит от компилятора; Борланд – «A wchar_t type is the same size, signedness, and alignment requirement as an int type.»

2. hgBuffer= GlobalAlloc(GMEM_DDESHARE, w.Length() * sizeof (wchar_t) + 1);
Это, я пытал - "Вне памяти"!

Отвечает: Melamed
Здравствуйте, VovikDoc!
Так как символ в юникоде символы могут занимать как 2 байта (кодировка UCS-2), так и 4 байта (кодировка UCS-4), то на нулевой символ нужно отводить 2 или 4 байта соответственно. Поэтому в Вашем случае сомнительную строку следует записать так:

hgBuffer= GlobalAlloc(GMEM_DDESHARE, (w.Length()+1)*sizeof(wchar_t))
Ответ отправил: Melamed (статус: 3-ий класс)
Ответ отправлен: 23.08.2006, 00:31
Оценка за ответ: 5
Комментарий оценки:
Да затупил! Но всё таки может поверить тов. Борланду:
(w.Length()+1) * sizeof (int)

Отвечает: InviZ
Здравствуйте, VovikDoc!
Ну, вообще-то в Windows всегда используется UCS-2 (UTF-16LE).
wchar_t поэтому должен занимать 2 байта... В LinuxUnix - 4.
В Visual C++ во всяком случае, он занимает 2 байта, и это ясно написано в MSDN.
А вообще если есть сомнения, можно использовать определенный в виндовых header'ах WCHAR.

А w.Length()*sizeof (wchar_t) + 1 - он и не будет работать.
Все эти "+1" необходимы для того, чтобы хранить нулевой символ конца строки. А юникодовый L'
Ответ отправил: InviZ (статус: 2-ой класс)
Ответ отправлен: 23.08.2006, 06:48


Вопрос № 52.938
Здравствуйте не могу доделать задание как определить глубину дерева(двоичное дерево)вышлите код этого модуля.или скажите где взять информациюпоэтому вопросу
структура
structTree{int
dann;TREE
*pleft;TREE
*pright;}
Отправлен: 22.08.2006, 21:25
Вопрос задал: Agp200431 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Www2
Здравствуйте, Agp200431!

Нужно воспользоваться рекурсией.

Для корня дерева вызываем так:

int depth = TreeDepth(proot);

proot - указатель на корень дерева,
depth - глубина дерева.

Приложение:

Ответ отправил: Www2 (статус: 5-ый класс)
Ответ отправлен: 23.08.2006, 06:44


Вопрос № 52.950
Здравствуйте, ув. эксперты! Недавно начал осваивать C++. Вопрос такой, какой самый подходящий (быстрый, удобный) компилятор для языка этого. Хочется узнать Ваши мнения, т.к. в различных источниках они расхожи.
//опыт программирования имеется//

Заранее благодарен.
С уважением, Брыкалин С.Н.

Приложение:

Отправлен: 22.08.2006, 22:42
Вопрос задал: SVORA (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 6)

Отвечает: nazarini
Здравствуйте, SVORA!
Как на меня, самый удобный, многофункциональный и т.д. и т.п. Visual Studio 2003/2005,
лично я исользую 2003, большой плюс к нему єто MSDN(Огромный справочник и по С и по С++, и по С#, MFC и много всего другого). Так что Рекомендую !!!
Ответ отправил: nazarini (статус: 1-ый класс)
Ответ отправлен: 22.08.2006, 22:52

Отвечает: Ross
Здравствуйте, SVORA!

Лично я предпочитаю использовать Intel C++ Compiler 6.0 в связке с Microsoft Visual Studio .NET, т.к. этот компилятор создает более быстрый и компактный код чем встроенный.
Ответ отправил: Ross (статус: 1-ый класс)
Ответ отправлен: 23.08.2006, 02:12

Отвечает: InviZ
Здравствуйте, SVORA!
Под win - лучше всего Visual Studio + еще поставить Visual Assist X, хорошая тулза.
Под nix - ну, там gcc естественно. А IDE - много вариантов. Eclipse можно, к примеру.
Ответ отправил: InviZ (статус: 2-ой класс)
Ответ отправлен: 23.08.2006, 06:59

Отвечает: Mihasic
Здравствуйте, SVORA!
Касательно CodeWarrior, то про этот компилятор слышал лишь в контексте Mac OS... там он действительно лучший (по крайней мере был, но вроде apple вытесняла этот компилятор своими пордуктами, точно не знаю). Т.к. я все время сижу под виндой, то для меня лучшим компилятором является Visual C++ (пользуюсь 2003-й студией). В основном мое предпочтение продуктам майкрософт благодаря их IDE. Да и оптимизация кода там тоже неплохая. Приходилось работать под Builder'ом, но лично мне он очень не понравился. Под линуксом писал только один раз и использовал встроенный в тот дистрибутив gcc (но выбор компилятора тогда был не главным, поэтому выбрал наиболее распространенное средство).
Ответ отправил: Mihasic (статус: 5-ый класс)
Ответ отправлен: 23.08.2006, 11:24


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

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

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

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

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


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


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.35 от 27.07.2006
Яндекс Rambler's Top100

В избранное