Share via


Usando matrizes, cadeias de caracteres e ponteiros

O programa Doctor (consulte \samples\rpc\doctor no Platform Software Development Kit (SDK)) é um bom exemplo de um aplicativo que demonstra as compensações de design envolvidas com atributos de matriz e cadeia de caracteres. O programa Doctor é uma pequena versão amostral de um programa mais conhecido, Eliza, desenvolvido pelo pesquisador de inteligência artificial Joseph Weizenbaum no MIT na anos 1960. O programa imita um terapeuta usando uma simples correspondência de padrões para responder à entrada de linguagem natural.

O programa Eliza gravou a sessão a seguir.

Usuário Eliza
Os homens são todos iguais. De que maneira?
Eles estão sempre nos incomodando sobre algo ou outro. Você pode pensar em um exemplo específico?
Bem, meu namorado me fez vir aqui. Seu namorado fez você vir aqui.
Ele diz que estou deprimido a maior parte do tempo. Lamento ouvir que você está deprimido.
É verdade, estou infeliz. Você acha que vir aqui vai ajudá-lo a não ser infeliz?
Preciso de ajuda. isso parece certo. O que significaria para você se tivesse ajuda?
Talvez eu possa aprender a me dar bem com minha mãe. Fale-me mais sobre sua família.
Minha mãe cuida de mim. Quem mais em sua família cuida de você?
Meu pai. Seu pai.
Você é como meu pai de certa forma. Que semelhança você vê?

 

O programa Doctor pode ser dividido em aplicativos do lado do cliente e do lado do servidor. O lado do cliente solicita a entrada do paciente e exibe a resposta do médico. O lado do servidor processa a entrada do paciente e gera a resposta do médico. Este é um exemplo clássico de um aplicativo cliente-servidor: o cliente é responsável pela interação do usuário enquanto o servidor lida com a carga computacional extensiva. Poucos dados são passados e retornados pela função, mas, como os dados podem exigir uma quantidade significativa de processamento, o servidor os processa.

O programa Doctor usa uma matriz de caracteres para entrada e retorna outra matriz de caracteres como saída. A tabela a seguir lista quatro maneiras de passar matrizes de caracteres entre o cliente e o servidor e os atributos e funções necessários para implementar cada abordagem.

Abordagem Atributos ou funções
Matrizes de caracteres contadas [ size_is], [ length_is], [ ref]
Cadeias de caracteres gerenciadas por stub [ string], [ ref], midl_user_allocate no servidor
Cadeias de caracteres gerenciadas por stub [ string], [ unique], midl_user_allocate no cliente e no servidor
Função que retorna uma cadeia de caracteres [ exclusivo]

 

Dentro das restrições associadas a essas combinações de atributos, há maneiras alternativas de enviar uma matriz de caracteres de cliente para servidor e de retornar outra matriz de caracteres de servidor para cliente.

Os tópicos a seguir demonstram as compensações de design entre as várias interfaces que podem gerenciar esses parâmetros.