Использование массивов, строк и указателей

Программа "Доктор" (см. \samples\rpc\doctor в пакете sdk для платформы) является хорошим примером приложения, демонстрирующего конструктивные компромиссы, связанные с атрибутами массива и строки. Программа «Доктор» — это небольшая версия более известной программы Элизы, разработанной исследователем искусственного интеллекта Джозефом Вайденбаумом в Массачусетском технологическом институте в 1960-х годах. Программа имитирует терапевта, используя простое сопоставление шаблонов для реагирования на ввод естественного языка.

Программа Eliza записала следующий сеанс.

Пользователь Элиза
Мужчины все похожи. Каким образом?
Они всегда прослушивают нас о чем-то или другом. Можете ли вы представить конкретный пример?
Ну, мой парень заставил меня прийти сюда. Твой парень заставил тебя приехать сюда.
Он говорит, что я в депрессии большую часть времени. Мне жаль, что вы в депрессии.
Это правда, я несчастлив. Как вы думаете, приезд сюда поможет вам не быть несчастным?
Мне нужна помощь; что многое кажется определенным. Что бы это значило для вас, если бы вы получили помощь?
Возможно, я смогу научиться ладить с моей матерью. Расскажите мне больше о своей семье.
Моя мать заботится обо мне. Кто еще в вашей семье заботится о вас?
Мой отец. Ваш отец.
В некотором смысле ты похожа на моего отца. Какое сходство вы видите?

 

Программу Doctor можно разделить на клиентские и серверные приложения. Клиентская сторона запрашивает у пациента ввод и отображает ответ врача. Серверная сторона обрабатывает входные данные пациента и создает ответ врача. Это классический пример клиентско-серверного приложения: клиент отвечает за взаимодействие с пользователем, а сервер обрабатывает обширную вычислительную нагрузку. Функция передает и возвращает не так много данных, но так как данные могут потребовать значительного объема обработки, сервер обрабатывает их.

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

Подход Атрибуты или функции
Массивы подсчитаемых символов [ size_is], [ length_is], [ ссылка]
Строки, управляемые заглушками [ string], [ ref], midl_user_allocate на сервере
Строки, управляемые заглушками [ строка], [ уникальный], midl_user_allocate на клиенте и сервере
Функция, возвращающая строку [ уникальный]

 

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

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