You are not logged in.
Pages: 1
Завтра сдаю экзамены по Си++ Билдер, все билеты простые. Но хочу сдать экстерном, чтобы второй год не ходить. Помогите, пожалуйста, вот вопросы, на которые я не могу ответить:
Спецификатор const в ссылочных параметрах и в параметрах-указателях.
Адресная и объектная части динамической переменной.
Проиллюстрируйте применение дискрипторов на примере блокировки Рабочего стола.
Программное порождение визуальных объектов.
Обработка одномерных и двумерных массивов, сохраняемых в текстовых файлах. Методы: LoadFromFile, SaveToFile, Add, c_str.
Передача параметров в функцию по значению, по ссылке, передача параметра-указателя.
Восемь способов передачи массивов в качестве параметра функции.
Проиллюстрируйте работу функций, предназначенных для обработки двоичных файлов: FileCreate, FileOpen, FileRead, FileSeek, FileClose.
Проиллюстрируйте применение дискрипторов на примере управления кнопкой Пуск и Полосой задач.
Завтра сдаю, срочно надо!
З.Ы. первый раз вижу слово дискрипторы
Offline
Мда. Это называется - "ты попал".
Половина вопросов подразумевает не правильный ответ, а такой ответ, чтобы преподаватель понял.
1. Спецификатор const в ссылочных параметрах и в параметрах-указателях.
В хелп. Если в хелпе не найдется - то в MSDN.
(const reference я даже не помню, где используется, кроме как в copy consttructor)
2. Адресная и объектная части динамической переменной.
Над этим я подвис минут на пять. Потом понял, что имеются в виду адрес, который возвращает new и сам блок памяти, выделенный в куче.
3. Проиллюстрируйте применение дискрипторов на примере блокировки Рабочего стола.
Насколько я понимаю, подразумевается получение HWND от desktop-а и делание с ним какой-нибудь гадости.
Например, вставить в него system modal dialog.
4. Программное порождение визуальных объектов.
Здесь нужно уточнение: каких объектов? Зрительные галлюцинации - тоже визуальные объекты.
5. Обработка одномерных и двумерных массивов, сохраняемых в текстовых файлах. Методы: LoadFromFile, SaveToFile, Add, c_str.
В хелп. Там должны быть примеры (искать от LoadFromFile)
6. Передача параметров в функцию по значению, по ссылке, передача параметра-указателя.
А тут-то что сложного?
7. Восемь способов передачи массивов в качестве параметра функции.
В учебник/в конспект. Я не знаю, какие способы ваш препод считает допустимыми.
8. Проиллюстрируйте работу функций, предназначенных для обработки двоичных файлов: FileCreate, FileOpen, FileRead, FileSeek, FileClose.
В хелп.
9. Проиллюстрируйте применение дискрипторов на примере управления кнопкой Пуск и Полосой задач.
Просто. Только нужно пример найти (получить HWND от кнопки и таскбара и что-нибудь с ними сделать (ShowWindow (false); )
Offline
Спасибо!!! Вот хотел уточнить:
Как получить хэндлы рабочего стола, таскбара, пуска;
Визуальные объекты - объекты визуального программирования (библиотека VCL);
Передача параметров в функцию по значению, по ссылке, передача параметра-указателя.
А тут-то что сложного?
Сложного-то ничего, но как это сделать?
Offline
Хэндл рабочего стола == NULL (это активно используется, если нужно вывести MessageBox, а окно либо еще не создалось, либо это делать не хочется).
насчет остальных, без шпаргалки не скажу. Наверняка, примеры есть на http://codeproject.com
По VCL - в хелп (я с ним (с VCL, а не с хелпом) последний раз работал лет двенадцать назад).
int foo (int a, int& b, int * c); // значение, ссылка, указатель
Offline
to ~AquaZ~
Да, парень, понятно твоё стремленье сэкономить год, но месяца два-три тебе обязательно нужно...
Offline
У меня возник вопрос по C++. Мне нужно воспользоваться типом Variant для возврата одной из функций, написанных в Дельфи. Я где-то читал, что аналогия вроде есть, но сам не нашёл. Кто-нибудь знает, как это можно сделать?
З.Ы. нашёл статью в MSDN, расписывающую структуру Variant'а... Знать бы как применить ещё:
http://msdn.microsoft.com/en-us/library/ms221627.aspx
Вроде бы вторая ссылка была полезнее. Нужно просто подключить к проэкту atlcomcli.h :
http://msdn.microsoft.com/en-us/library … 80%29.aspx
Last edited by Viger (16-07-2010 13:49)
Offline
Может проще переделать саму функцию в дельфи? Тип Variant - это кодинг для ленивых, которые не могут программировать, используя правильные типы данных (Integer, Boolean, TObject и т.д.).
Offline
Может и проще, вобще я использую QuickOpcode Alexander'а, написанный ещё довольно давно и по мне так проще писать, чем через CLEO. В моей версии исправлен вылет, поддерживаются все типы строк, в том числе указатели на строку, возможно писать опкоды-проверки и с переменным колличеством параметров + немного ускорен алгоритм работы.
Руки не доходят выложить(= А насчёт функций, то вот например:
function FUNC_READ_VALUE(TP : Char) : Variant;
function FUNC_WRITE_VALUE(TP : Char; Value : Variant) : Boolean;
Вместо CHAR 'i' или 'f' для обозначения типа. Для чтения в одном случае читаем параметр как float, в другом как integer, а в записе надо тоже разные использовать, чтобы не сбивать с толку и не писать целые числа как дробные... (З.Ы. кстати Boolean надо убрать, а FUNC_ заменить на OPCODE_ тогда будет красиво=))
Offline
А зачем столько сложностей с Variant? Так написать что мешает:
union {int; float;}
Offline
Можно поподробнее? Я C++ изучаю всего неделю где-то...
Вот допустим код функции:
VARIANT (__stdcall *FUNC_READ_VALUE)(char) = (VARIANT (__stdcall *)(char))GetProcAddress(Lib, "FUNC_READ_VALUE");
И как можно проще?
Offline
Так, ты похоже пытаешься из C++ вызвать функцию, написанную на Delphi и использующую ее стандартную библиотеку типов. Так не выйдет. Точно так же не выйдет вызвать эту же функцию, скажем, из программы, скомпилированной под Free Pascal Compiler. Реализации этих типов могут не совпадать даже в пределах одного языка, но разных компиляторов - что уж говорить о разных языках.
Ссылка выше на тип VARIANT относится к COM, и если библиотека на Delphi не использует эту технологию, то повторное использование этой библиотеки на других языках и компиляторах не подразумевается.
PS: Аналогичные непонятки обстоят с типом String. Поэтому в таких случаях в Delphi нужно использовать тип PChar.
PPS: Строго говоря, нет даже гарантии на совпадение типов Integer из Pascal и int из С.
Offline
Ну раз такая темка пошла, (хелпы по си++) то можно задать совершенно лёгкий вопрос?
Интересует, что есть такое стек и беззнаковый тип. Я знаю, что есть википедия и гугл, но там написано очень и очень замудрёно (как в докладах) по этому прошу что бы объяснили здесь.
Offline
Стек - кусок оперативки (наверное процессорной) для временного хранения инфы.
Беззнаковый (unsigned) тип - вариант числового типа, где старший бит определяет не знак (+/-), а принадлежит числу. ОДЗ (область допустимых значений) числа удваивается.
Offline
например для одного байта со знаком (signed) ОДЗ лежит в пределах -128..127 (используются только 7 битов из 8, 8й бит определяет знак +/-), а без знака (unsigned) ОДЗ 0..255 (используются все 8 битов).
стек - это типа колоды карт, где карта это какое-то значение (число, строка, и т.д.). Взяли значение, положили его на верх колоды (в определенную область памяти), потом эту же карту изъяли. Грубо говоря, в начале работы любой функции на стеке (в колоде) лежат только параметры этой функции, в ходе работы функции эти параметры со стека убираются, и на момент окончания стек пуст. Кроме параметров, на стек функция может класть временные значения.
для работы со стеком используются команды PUSH (положить) и POP (изъять)
Offline
Положить (push) данные можно только на верх колоды.
push {data} ;Данные, которые кладём push 7e ;асм мыслит в 16-тиричной системе счисления
Забрать (pop) можно только с верхушки колоды.
pop {reg} ;забираем в какой-нибудь регистр pop eax ;забрать верхушку стека в регистр eax
Offline
В зависимости от контекста, под стэком могут подразумеваться достаточно отличающиеся вещи.
Если речь идет о низкоуровневом программировании, как правило, под стэком подразумевается область памяти, предназначенная для хранения временных данных. Она может организовываться как отдельный сегмент или как часть сегмента данных. В стеке хранятся адреса возврата из функций, параметры, временные значения регистров и такая вещь, как локальные переменные функции (это называется stack frame функции).
О последнем стоит рассказать подробнее. Преимущество стека, как концепции, состоит в том, кто в нем очень просто выделять память - достаточно просто увеличить/уменьшить указатель стека на требуемое число байтов. (что очень выгодно отличается от традиционного динамического выделения памяти, где нужно долго искать подходящий блок среди всего набора блоков памяти). Как результат, для локальных переменных функции память выделяется на стеке. В старых компиляторах это делалось сохраненеим указателя стека SP в одном из регистров, и последующей модификацией SP. При выходе из функции, SP восстанавливался из регистра. В x86 для этого ввели даже специальные команды enter и leave.
Современные компиляторы не сохраняют SP, а просто учитывают все его изменения командами push, pop, call и т.д.. Это сильно усложняет компилятор, но, в результате не требуется использовать отдельный регистр для хранения значения SP.
Подведем итог. Если не залезать в ассемблер, стек - это место где хранятся локальные переменные фуункции.
Выделение локальных переменных можно считать мгновенным (в отличие от использования malloc/new). Освобождать локальные переменные не нужно (если для какой-то из них нужно вызвать деструктор, компилятор сделает это автоматически). Чтобы выделить на стеке блок памяти произвольного размера, в C можно использовать функцию alloca. Она, аналогично, отработает мгновенно и выделенный с ее помощью блок не требуется специально освобождать.
Минусы такого использования стека. Локальные переменные видны можно использовать только из той функции, в которой они определены и в тех функциях, которые из нее вызываются. Одна из распространенных ошибок новичков - вернуть указатель на стековую переменную в вызывающую функцию.
Следует также помнить, что объем стека ограничен. Я встречал программы, которые выделяли на стеке массив структур килобайт по 500 каждая, но это не является рекомендованной практикой.
Это была низкоуровневая часть. При высокоуровневом программировании, под стеком может подразумеваться коллекция, у которой есть доступ только к одному элементу - врешине стека. Т.е. мы можем поместить туда произвольное количество данных - по одному, и достать тоже по одному, в обратном порядке. Т.е. последний помещенный в стек элемент достается первым. При описании такого стека употребляется сокращение LIFO - Last In First Out.
(Еще употребляется такой термин, как стек FIFO - First In First Out, но это, на самом деле, не стек, а очередь).
Применительно к программированию, строво "стек" может применяться еще в нескольких контекстах (например, сетевой стек), но объяснение это уже выходит за разумные рамки.
Если вопросов стало больше чем было, я могу объяснить что-то более подробно (например тонкости реализации стека в разных процессорах или рассказать о вещах, которые опустил для упрощения, например, про отмотку стека (stack unwinding) при обработке исключений).
Offline
Спасибо, думаю всем будет интересно.
А в чём различие между х64 и х86(32)?
Offline
@~AquaZ~ - Архитектурно - ни в чем: это один и тот же процессор.
В реализации - размер регистров общего назначения, указателей и RFLAGS увеличили до 64 бит и количество GPR и XMM регистров увеличили вдвое. (т.е. сделали примерно то же, что было при переходе 286 -> 386)
В 64-битном режиме добавляются несколько команд (например, доступ к памяти по смещению относительно RIP (т.е. текущей команды), и некоторые древние команды не обрабатываются (предположительно, чтобы потом их выкинуть).
Еще, производители компиляторов решили воспользоваться тем, что регистров стало много и все привели к единому calling convention, более-менее похожему на то, как делается в нормальных процессорах (4 параметра в регистрах, остальное - на стеке).
Вот, в целом и все. В IA32/Intel64 Architecture Manual vol.1, полное описание изменений занимает страницы три-четыре, включая картинки.
Offline
@listener -
есть википедия и гугл, но там написано очень и очень замудрёно (как в докладах)
*убегает*
Offline
@Seemann - да нет, почему. Листенер объяснил довольно понятно. AquaZ тоже понятно разъяснил. Всем спасибо:^
Offline
PS: Аналогичные непонятки обстоят с типом String. Поэтому в таких случаях в Delphi нужно использовать тип PChar.
PPS: Строго говоря, нет даже гарантии на совпадение типов Integer из Pascal и int из С.
А кто не дают определить свой тип похожий на String?
Last edited by VintProg_Pro (15-09-2010 10:44)
Offline
@VintProg_Pro - все дают.:D В C++ Builder даже изобретать ничего не надо - там этот тип и так присутствует - полностью совместимый с Delphi. Подробнее сказать не могу - надо смотреть заголовочные файлы VCL. Но остаются сомнения, возможно ли просто перетащить VCL-определения с одной версии Delphi/CBuilder/Rad Studio на другую?
Тип std::string, например, не переносим с одного компилятора на другой. Стандарт C++ определяет только интерфейсы clr, но не определяет реализаций.
Offline
Pages: 1