Używanie tablic, ciągów i wskaźników
Program Doctor (patrz \samples\rpc\doctor w Platform Software Development Kit (SDK)) jest dobrym przykładem aplikacji, która demonstruje kompromisy projektowe związane z atrybutami tablicowymi i łańcuchowymi. Program Doctor to mała przykładowa wersja lepiej znanego programu, Eliza, opracowana przez badacza sztucznej inteligencji Josepha Weizenbaum w MIT w 1960 roku. Program naśladuje terapeutę przy użyciu prostego dopasowania wzorca, aby reagować na dane wejściowe języka naturalnego.
Program Eliza nagrał następującą sesję.
Użytkownik | Eliza |
---|---|
Mężczyźni są podobnie. | W jaki sposób? |
Oni zawsze nas irytują o coś lub innego. | Czy można pomyśleć o konkretnym przykładzie? |
Cóż, mój chłopak zmusił mnie, abym tu przyszła. | Twój chłopak sprawił, że tu przyszłaś. |
Mówi, że jestem przygnębiony przez większość czasu. | Przykro mi usłyszeć, że jesteś przygnębiony. |
To prawda, jestem nieszczęśliwy. | Czy myślisz, że przybycie tutaj pomoże ci nie być niezadowolonym? |
Potrzebuję pomocy; to wydaje się pewne. | Co to znaczy dla Ciebie, jeśli masz jakąś pomoc? |
Być może mogłabym nauczyć się dogadywać z moją matką. | Powiedz mi więcej o swojej rodzinie. |
Moja matka dba o mnie. | Kto jeszcze w twojej rodzinie dba o Ciebie? |
Mój ojciec. | Twój ojciec. |
Jesteś jak mój ojciec pod pewnymi względami. | Jakie podobieństwo widzisz? |
Program Doctor można podzielić na aplikacje po stronie klienta i po stronie serwera. Po stronie klienta pacjent jest proszony o dane wejściowe i wyświetlana jest odpowiedź lekarza. Strona serwera przetwarza dane wejściowe pacjenta i generuje odpowiedź lekarza. Jest to klasyczny przykład aplikacji klient-serwer: klient jest odpowiedzialny za interakcję użytkownika, podczas gdy serwer obsługuje duże obciążenie obliczeniowe. Nie wiele danych jest przekazywanych do funkcji i zwracanych przez nią, ale ponieważ dane mogą wymagać znacznej ilości przetwarzania, serwer przetwarza je.
Program Doctor używa tablicy znaków dla danych wejściowych i zwraca inną tablicę znaków jako dane wyjściowe. W poniższej tabeli wymieniono cztery sposoby przekazywania tablic znaków między klientem a serwerem oraz atrybutami i funkcjami wymaganymi do zaimplementowania poszczególnych metod.
Podejście | Atrybuty lub funkcje |
---|---|
Liczone tablice znaków | [ size_is], [ length_is], [ ref] |
Ciągi zarządzane przez stuba | [ ciąg], [ ref], midl_user_allocate na serwerze |
Ciągi zarządzane przez łączniki | [ łańcuch znaków], [ unikatowy], midl_user_allocate na kliencie i serwerze |
Funkcja zwracająca ciąg | [ unikatowy] |
W ramach ograniczeń skojarzonych z tymi kombinacjami atrybutów istnieją alternatywne sposoby wysyłania jednej tablicy znaków z klienta do serwera i zwracania innej tablicy znaków z serwera do klienta.
W poniższych tematach przedstawiono kompromisy projektowe między różnymi interfejsami, które mogą zarządzać tymi parametrami.