BotonMenu
BotonIndice

Visita : http://www.conoce3000.com
Paypal : https://www.paypal.me/conoce3000/1

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.5. PCHAR Y PWIDECHAR.
7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.5. PCHAR Y PWIDECHAR.
7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.5. PCHAR Y PWIDECHAR.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Pchar y PWideChar.

Estos tipos de datos son punteros con tipo, de los tipos de datos Char y WideChar. Estos tipos de datos se usan para definir cadenas de caracteres terminados en un carácter nulo o #0, que se usa en los lenguajes de programación C y C++. Su comportamiento es muy similar al de un tipo de dato string. Con estos tipos de datos no es necesario el uso de getmem, new, freemem y dispose. Sólo existe un número limitado de rutinas que se pueden usar con estas variables dinámicas, y algunas de ellas son: length, val, strToInt y StrToFloat, que funcionan del mismo modo a como se usan con las variables de tipo string.

Para acceder a un determinado carácter se hace uso de los corchetes del mismo modo como se hace con las variables de tipo string, con la diferencia de que el primer carácter empieza en 0. Los caracteres de un tipo de dato PChar son de 1 byte, y los de un PWideChar son de dos bytes, con lo que el último carácter de un PWideChar, que representa el carácter nulo será un #0 de 2 bytes.

Concatenar dos variables dinámicas de tipo PChar o PWidechar, no es posible. Es decir si cad1 y cad son de tipo PChar o PWidechar, lo siguiente no se puede hacer:

cad1:='hola';
cad:= cad1 + 'demo' ;

Estas variables se usan generalmente para poder usar librerías creadas con los lenguajes de programación C o C++. Como son la API de Windows, o las librerías GTK en Linux. A continuación un ejemplo del uso de las rutinas lenght, val, StrToInt y StrToFloat con PChar y PWideChar:


Descargar
{$codepage UTf8}
Uses Sysutils;
Var cad1:PChar;
    cad2:PWidechar;
    p:double;
    error:integer;
    anio:longint;
Begin

  cad1:='Hola';
  cad2:='こんにちは';
  Writeln('longitud cad1 : ',length(cad1));
  Writeln('longitud cad2 : ',length(cad2));
  
  cad1:='45.89';
  Val(cad1,p,error);
  if (error>0) then Writeln('Error')
  else Writeln('El numero convertido : ',p:4:2);
  p:=StrToFloat(cad1);
  Writeln('numero :',p:4:2);
   
  cad2:='89.89';
  Val(cad2,p,error);
  if (error>0) then Writeln('Error')
  else Writeln('El numero convertido : ',p:4:2);   
  p:=StrToFloat(cad2);
  Writeln('numero :',p:4:2);
   
  cad1:='1984';
  anio:=StrToInt(cad1);
  Writeln('Año :',anio);
  
  cad2:='2011';
  anio:=StrToInt(cad2);
  Writeln('Año :',anio)

End.
Código fuente 11: Ejemplo del uso de PChar y PWideChar.
Descargar

No es posible asignar un tipo de dato PWidechar a un tipo de dato PChar, y tampoco un PChar a un PWideChar. Es posible asignar un PChar a un string, pero lo contrario no es posible, a menos que se asigne tomando la dirección del primer carácter de la variable de tipo string con el operador @. Ejemplo:


Descargar
{$codepage UTf8}
										   
Var cad:String;
    cad1:Pchar;
Begin

  cad:='Hola';  
  
  cad1:=@cad[1];
  Writeln(cad1)
  
End.
Código fuente 12: Ejemplo de Asignacion de un String a un PChar.
Descargar

En el caso de PWideChar, es posible asignar un PWideChar a un tipo de dato string, lo contrario al igual que con Pchar no es posible aunque el compilador permite asignar un string tomando la dirección del primer carácter; el resultado no será el correcto debido a que los caracteres de un PWidechar serán de 2 bytes. Cuando se asignan un PWidechar a un tipo de datos string, el administrador de caracteres se encargará de hacer las conversiones necesarias entre las codificaciones de caracteres tal como se explico en el capítulo 2.6 "Administrador de Caracteres". A continuación un ejemplo de asignación de PWideChar a una variable de tipo string, en Linux:


Descargar
{$codepage UTf8}

USES cwstring;
VAR cad:String;
    cad1:PWideChar;
BEGIN  

  cad1:='こんにちは';
  cad:=cad1;
  Writeln(cad) 

END.
Código fuente 13: Ejemplo de asignacion de un PWideChar a un String en Linux.
Descargar

El programa anterior se hizo para Linux, porque en Windows el intérprete de comandos no trabaja adecuadamente con UTF8, si se desea probar el programa anterior en Windows, sólo debe comentar el uso de la unidad cwstring.

El tipo de dato PWideChar no se puede usar con las rutinas Write, Writeln, Read y Readln, pero sin embargo el tipo de dato PChar se puede usar con las rutinas Write y Writeln pero no con las rutinas read y readln.

Cuando se asigna directamente una cadena de caracteres a una variable de tipo PChar ó PWideChar, no se crea una variable dinámica, sólo se asigna la dirección de memoria de la cadena de caracteres. Las cadenas de caracteres que se usan directamente se almacenan en el área de datos junto con las variables estáticas.

Las rutinas getmem, y freemem sólo se pueden usar para crear variables dinámicas en el área de la memoria disponible de la computadora; es por eso que cuando se intenta usar freemem con una variable de tipo PChar ó PWideChar, al cual se le asigno una cadena de caracteres directamente, este nos muestre un mensaje de error sobre acceso no válido. Para aclarar un poco las cosas veamos el siguiente ejemplo:


Descargar
{$codepage UTf8}
VAR cad:PChar;

BEGIN  

  getmem(cad,10);
  freemem(cad)

END.
Código fuente 14: Crea una variable dinámica y después lo elimina.
Descargar

El programa compilara y al ejecutarse creará una variable dinámica y luego lo elimina, no aparecerá ningún error. Pero si asignamos una cadena de caracteres, como en el siguiente ejemplo:


Descargar
{$codepage UTf8}
VAR cad:PChar;

BEGIN  

  getmem(cad,10);
  cad:='hola'; 
  freemem(cad)

END.
Código fuente 15: Crea una variable dinámica e intenta elminar a lo que apunta la variable cad.
Descargar

Entonces el programa generará un error, debido a que inicialmente cad apunta a la variable dinámica creada con getmem, y después la variable cad cambia su dirección cuando se asigna la cadena de caracteres, es decir cad apunta ahora a la cadena de caracteres 'hola', y como esta cadena de caracteres esta en el área de datos junto con las variables estáticas; entonces freemem no podrá liberar o eliminar la variable dinámica, porque esta no se encuentra en el área de la memoria disponible de la computadora.


Última revisión: 10/12/2013.



SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo (a través de Paypal me), que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado.








PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.