#1 29-05-2010 19:10

~AquaZ~
Registered: 01-03-2010
Posts: 726

Помогите, пожалуйста, с Си++!!

Завтра сдаю экзамены по Си++ Билдер, все билеты простые. Но хочу сдать экстерном, чтобы второй год не ходить. Помогите, пожалуйста, вот вопросы, на которые я не могу ответить:

Спецификатор const в ссылочных параметрах и в параметрах-указателях.
Адресная и объектная части динамической переменной.
Проиллюстрируйте применение дискрипторов на примере блокировки Рабочего стола.
Программное порождение визуальных объектов.
Обработка одномерных и двумерных массивов, сохраняемых в текстовых файлах. Методы: LoadFromFile, SaveToFile, Add, c_str.
Передача параметров в функцию по значению, по ссылке, передача параметра-указателя.
Восемь способов передачи массивов в качестве параметра функции.
Проиллюстрируйте работу функций, предназначенных для обработки двоичных файлов: FileCreate, FileOpen, FileRead, FileSeek, FileClose.
Проиллюстрируйте применение дискрипторов на примере управления кнопкой Пуск и Полосой задач.

Завтра сдаю, срочно надо!
З.Ы. первый раз вижу слово дискрипторы

Offline

#2 29-05-2010 20:15

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Помогите, пожалуйста, с Си++!!

Мда. Это называется - "ты попал".
Половина вопросов подразумевает не правильный ответ, а такой ответ, чтобы преподаватель понял.

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

#3 29-05-2010 20:23

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Помогите, пожалуйста, с Си++!!

Спасибо!!! Вот хотел уточнить:
Как получить хэндлы рабочего стола, таскбара, пуска;
Визуальные объекты - объекты визуального программирования (библиотека VCL);

Передача параметров в функцию по значению, по ссылке, передача параметра-указателя.

А тут-то что сложного?

Сложного-то ничего, но как это сделать?

Offline

#4 29-05-2010 20:28

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Помогите, пожалуйста, с Си++!!

Хэндл рабочего стола == NULL (это активно используется, если нужно вывести MessageBox, а окно либо еще не создалось, либо это делать не хочется).
насчет остальных, без шпаргалки не скажу. Наверняка, примеры есть на http://codeproject.com

По VCL - в хелп (я с ним (с VCL, а не с хелпом) последний раз работал лет двенадцать назад).

int foo (int a, int& b, int * c); // значение, ссылка, указатель

Offline

#5 02-06-2010 08:25

reute70
From: Средняя Волга
Registered: 22-08-2009
Posts: 182

Re: Помогите, пожалуйста, с Си++!!

to ~AquaZ~
Да, парень, понятно твоё стремленье сэкономить год, но месяца два-три тебе обязательно нужно...

Offline

#6 16-07-2010 13:21

Viger
Registered: 14-05-2009
Posts: 24

Re: Помогите, пожалуйста, с Си++!!

У меня возник вопрос по C++. Мне нужно воспользоваться типом Variant для возврата одной из функций, написанных в Дельфи. Я где-то читал, что аналогия вроде есть, но сам не нашёл. Кто-нибудь знает, как это можно сделать?

З.Ы. нашёл статью в MSDN, расписывающую структуру Variant'а... Знать бы как применить ещё:
http://msdn.microsoft.com/en-us/library/ms221627.aspx

Вроде бы вторая ссылка была полезнее. Нужно просто подключить к проэкту atlcomcli.h smile:
http://msdn.microsoft.com/en-us/library … 80%29.aspx

Last edited by Viger (16-07-2010 13:49)

Offline

#7 16-07-2010 13:50

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Помогите, пожалуйста, с Си++!!

Может проще переделать саму функцию в дельфи? Тип Variant - это кодинг для ленивых, которые не могут программировать, используя правильные типы данных (Integer, Boolean, TObject и т.д.).

Offline

#8 16-07-2010 14:06

Viger
Registered: 14-05-2009
Posts: 24

Re: Помогите, пожалуйста, с Си++!!

Может и проще, вобще я использую 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

#9 16-07-2010 14:21

Alien
Registered: 12-10-2008
Posts: 564

Re: Помогите, пожалуйста, с Си++!!

А зачем столько сложностей с Variant? Так написать что мешает:

union {int; float;}

Offline

#10 16-07-2010 14:37

Viger
Registered: 14-05-2009
Posts: 24

Re: Помогите, пожалуйста, с Си++!!

Можно поподробнее? Я C++ изучаю всего неделю где-то...
Вот допустим код функции:

VARIANT (__stdcall *FUNC_READ_VALUE)(char) = (VARIANT (__stdcall *)(char))GetProcAddress(Lib, "FUNC_READ_VALUE");

И как можно проще?

Offline

#11 16-07-2010 15:02

Alien
Registered: 12-10-2008
Posts: 564

Re: Помогите, пожалуйста, с Си++!!

Так, ты похоже пытаешься из C++ вызвать функцию, написанную на Delphi и использующую ее стандартную библиотеку типов. Так не выйдет. Точно так же не выйдет вызвать эту же функцию, скажем, из программы, скомпилированной под Free Pascal Compiler. Реализации этих типов могут не совпадать даже в пределах одного языка, но разных компиляторов - что уж говорить о разных языках.
Ссылка выше на тип VARIANT относится к COM, и если библиотека на Delphi не использует эту технологию, то повторное использование этой библиотеки на других языках и компиляторах не подразумевается.

PS: Аналогичные непонятки обстоят с типом String. Поэтому в таких случаях в Delphi нужно использовать тип PChar.
PPS: Строго говоря, нет даже гарантии на совпадение типов Integer из Pascal и int из С.

Offline

#12 16-07-2010 17:46

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Помогите, пожалуйста, с Си++!!

Ну раз такая темка пошла, (хелпы по си++) то можно задать совершенно лёгкий вопрос?
Интересует, что есть такое стек и беззнаковый тип. Я знаю, что есть википедия и гугл, но там написано очень и очень замудрёно (как в докладах) по этому прошу что бы объяснили здесь.

Offline

#13 16-07-2010 18:24

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Помогите, пожалуйста, с Си++!!

Стек - кусок оперативки (наверное процессорной) для временного хранения инфы.
Беззнаковый (unsigned) тип - вариант числового типа, где старший бит определяет не знак (+/-), а принадлежит числу. ОДЗ (область допустимых значений) числа удваивается.

Offline

#14 16-07-2010 19:02

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Помогите, пожалуйста, с Си++!!

например для одного байта со знаком (signed) ОДЗ лежит в пределах -128..127 (используются только 7 битов из 8, 8й бит определяет знак +/-), а без знака (unsigned) ОДЗ 0..255 (используются все 8 битов).

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

для работы со стеком используются команды PUSH (положить) и POP (изъять)

Offline

#15 16-07-2010 20:06

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Помогите, пожалуйста, с Си++!!

Положить (push) данные можно только на верх колоды.

push {data} ;Данные, которые кладём
push 7e ;асм мыслит в 16-тиричной системе счисления

Забрать (pop) можно только с верхушки колоды.

pop {reg} ;забираем в какой-нибудь регистр
pop eax ;забрать верхушку стека в регистр eax

Offline

#16 16-07-2010 21:13

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Помогите, пожалуйста, с Си++!!

В зависимости от контекста, под стэком могут подразумеваться достаточно отличающиеся вещи.

Если речь идет о низкоуровневом программировании, как правило, под стэком подразумевается область памяти, предназначенная для хранения временных данных. Она может организовываться как отдельный сегмент или как часть сегмента данных. В стеке хранятся адреса возврата из функций, параметры, временные значения регистров и такая вещь, как локальные переменные функции (это называется 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

#17 16-07-2010 21:36

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Помогите, пожалуйста, с Си++!!

Спасибо, думаю всем будет интересно.
А в чём различие между х64 и х86(32)?

Offline

#18 16-07-2010 22:43

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Помогите, пожалуйста, с Си++!!

@~AquaZ~ - Архитектурно - ни в чем: это один и тот же процессор.

В реализации - размер регистров общего назначения, указателей и RFLAGS увеличили до 64 бит и количество GPR и XMM регистров увеличили вдвое.  (т.е. сделали примерно то же, что было при переходе 286 -> 386)

В 64-битном режиме добавляются несколько команд (например, доступ к памяти по смещению относительно RIP (т.е. текущей команды), и некоторые древние команды не обрабатываются (предположительно, чтобы потом их выкинуть).

Еще, производители компиляторов решили воспользоваться тем, что регистров стало много и все привели к единому calling convention, более-менее похожему на то, как делается в нормальных процессорах (4 параметра в регистрах, остальное - на стеке).

Вот, в целом и все. В IA32/Intel64 Architecture Manual vol.1, полное описание изменений занимает страницы три-четыре, включая картинки.

Offline

#19 17-07-2010 09:18

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Помогите, пожалуйста, с Си++!!

@listener -

есть википедия и гугл, но там написано очень и очень замудрёно (как в докладах)

wink
*убегает*

Offline

#20 17-07-2010 10:22

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Помогите, пожалуйста, с Си++!!

@Seemann - да нет, почему. Листенер объяснил довольно понятно. AquaZ тоже понятно разъяснил. Всем спасибо:^

Offline

#21 15-09-2010 10:43

VintProg_Pro
Registered: 17-06-2010
Posts: 153

Re: Помогите, пожалуйста, с Си++!!

PS: Аналогичные непонятки обстоят с типом String. Поэтому в таких случаях в Delphi нужно использовать тип PChar.
PPS: Строго говоря, нет даже гарантии на совпадение типов Integer из Pascal и int из С.

А кто не дают определить свой тип похожий на String?

Last edited by VintProg_Pro (15-09-2010 10:44)

Offline

#22 16-09-2010 07:11

Alien
Registered: 12-10-2008
Posts: 564

Re: Помогите, пожалуйста, с Си++!!

@VintProg_Pro - все дают.:D В C++ Builder даже изобретать ничего не надо - там этот тип и так присутствует - полностью совместимый с Delphi. Подробнее сказать не могу - надо смотреть заголовочные файлы VCL. Но остаются сомнения, возможно ли просто перетащить VCL-определения с одной версии Delphi/CBuilder/Rad Studio на другую?
Тип std::string, например, не переносим с одного компилятора на другой. Стандарт C++ определяет только интерфейсы clr, но не определяет реализаций.

Offline

Board footer

Powered by FluxBB