Использование массивов, строк и указателей
Программа "Доктор" (см. примеры\rpc\doctor в пакете SDK для платформы) является хорошим примером приложения, демонстрирующего компромиссы проектирования, связанные с массивом и строковыми атрибутами. Программа "Доктор" — это небольшая примерная версия более известной программы, Элиза, разработанная исследователем искусственного интеллекта Джозефом Вайзбаумом в MIT в 1960-х годах. Программа имитирует терапевта с помощью простого сопоставления шаблонов для реагирования на входные данные естественного языка.
Программа Eliza записала следующий сеанс.
Пользователь | Элиза |
---|---|
Мужчины все так же. | Каким образом? |
Они всегда достают нас по поводу чего-то. | Можете ли вы подумать о конкретном примере? |
Ну, мой бойфренд заставил меня прийти сюда. | Твой бойфренд заставил тебя приехать сюда. |
Он говорит, что я часто нахожусь в депрессии. | Мне жаль, что вы подавлены. |
Это правда, я несчастный. | Вы думаете, что приехать сюда поможет вам не быть несчастным? |
Мне нужна помощь; это кажется определенным. | Что бы это означало для вас, если вы получили некоторую помощь? |
Возможно, я мог бы научиться ладить с моей матерью. | Расскажите мне больше о вашей семье. |
Моя мать заботится обо мне. | Кто еще в вашей семье заботится о тебе? |
Мой отец. | Ваш отец. |
Ты как мой отец в некотором смысле. | Какое сходство вы видите? |
Программа "Доктор" может быть разделена на клиентские и серверные приложения. Сторона клиента запрашивает у пациента ввод и отображает ответ врача. Серверная сторона обрабатывает входные данные пациента и создает ответ врача. Это классический пример клиентского приложения: клиент отвечает за взаимодействие с пользователем, а сервер обрабатывает обширную вычислительную нагрузку. Не так много данных передается и возвращается функцией, но, поскольку данные могут требовать значительного объема обработки, сервер обрабатывает его.
Программа "Доктор" использует массив символов для ввода и возвращает другой массив символов в качестве выходных данных. В таблице ниже перечислены четыре способа передачи массивов символов между клиентом и сервером, а также атрибуты и функции, необходимые для реализации каждого подхода.
Подход | Атрибуты или функции |
---|---|
Подсчитываемые массивы символов | [ size_is], [ length_is], [ ref] |
Строки, управляемые заглушками | [ строка], [ ссылка], midl_user_allocate на сервере |
Строки, управляемые заглушками | [ строка], [ уникальный], midl_user_allocate на клиенте и сервере |
Функция, возвращающая строку | [ уникальные] |
В ограничениях, связанных с этими сочетаниями атрибутов, существуют альтернативные способы отправки одного массива символов от клиента на сервер и возврата другого массива символов с сервера на клиент.
В следующих разделах демонстрируется компромисс между различными интерфейсами, которые могут управлять этими параметрами.