Jump to content
BHAMF

Como transformar String em PChar

Recommended Posts

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)

Edited by BHAMF

Brenio Hallison A.M. Filho

 

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.