Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

BHAMF

Como transformar String em PChar

Mensagens Recomendadas

BHAMF

Um tópico informativo é este. Não achei nenhum conteúdo sobre isto por aqui, então resolvi postar como que conseguimos transformar uma string em PChar.

A dúvida surgiu quando eu estava utilizando um comando em que um de seus parâmetros era PChar, porém eu não conseguia por si só, guardar informações que o utilizador digitava direto na variável PChar, e nem passar a informação de uma string para um PChar: 

[...]
procedure SndPlaySound(name : PChar, TypePlay : integer);
.[...]
Var
 mus : PChar;
 mus2 : String
begin
 [...]
 readln(mus); //isso não era possível, pois dava o erro "can't read or write variables of this type"
 SndPlaySound(mus, 1);

//////////////////////////
//nem isto era possível:
 
 readln(mus2);
 mus := mus2; //pois dava o erro "Incompatible types "AnsiString" and "PChar"

então, a maneira que eu achei de resolução foi esta função das profundezas da internet:


//
// Apenas tens de colocar a variável que desejas que seja transformada em PChar:

 PChar(variable); //daí podes usar com algum atributo, etc. Vejam os exemplos.

Ex.:
[...]
var
 mus : PChar;
 mus2 : string;
begin
 [...]
 readln(mus2);
 mus := PChar(mus2); //isto já daria certo!
 SndPlaySound(mus, 1);

{ou desta maneira também}
 readln(mus2);
 SoundPlaySound(PChar(mus2), 1); //perfeito!

Era isto! Valeu pessoal, espero que tenham gostado!

Caso tenham mais propostas, melhoras, podem mandar.

 

B.H.A.M.F, Natal, RN. Brasil.

 25/12/2018 | 14:21 (Horário de Brasília)

Editado por BHAMF

Brenio Hallison A.M. Filho

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Não sei que compilador utilizas, mas isso não é possível no Free Pascal 3.

Há duas formas de fazer a conversão: uma "à trolha" e uma correcta.

Versão "trolha":

program trolha;

var s : string;
    p : pchar;

begin
    p := @s[1];
    // ou...
    p := @s;
end.

Versão correcta:

program correcto;
uses strings;

function str2pchar(const s : string) : pchar;
begin
    str2pchar := stralloc(length(s) + 1);
    strpcopy(str2pchar, s);
end;

var s : string;
    p : pchar;

begin
    p := str2pchar(s);
    writeln(p);
    strdispose(p);
end.

Notas:

  1. A versão "trolha" vai gerar memory leaks;
  2. A versão que propuseste também deverá ter memory leaks;
  3. A versão completa é aquela que faz a gestão correcta do heap.

Cumprimentos.


Knowledge is free!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.