Поделиться через


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

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

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

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

 

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

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

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

 

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

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