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