Udostępnij za pośrednictwem


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.