sábado, 10 de febrero de 2007

Puntero Nil

El puntero nil es un puntero que no apunta a ninguna parte.

Un error muy común es acceder a una zona donde apunta un puntero indefinido porque:
  • No tiene permiso
  • no sabemos lo que hay
  • no sabemos interpretarlo
  • podemos dañar una zona importante del programa o sistema operativo
Punteros colgantes: cunado exiten varias copias de un puntero. Cuando una de las copias devulve la memoria con dipose, toma el valor nil y las demás copias quedan con el mismo valor, pero no son accesibles.

Operaciones con punteros

Los punteros permiten las siguientes operaciones:

Asignación de punteros: Si tenemos dos variables que apuntan al mismo sitio es posible asignar el valor de identificción de una de ellas a la otra.
p1 := p2 (asigna el valor del puntero p2 al puntero p1)

Comparación de igualdad o desigualdad. Para ver si dos punteros apuntan a la misma dirección.

Compatibilidad de asignación y comparación de los punteros.
  • Los punteros tienen el mismo identificador de tipo.
  • El identificador de tipo de una variable es un alias del otro.
  • Nil es compatible con todos los punteros tanto para asignación como en comparación.

New y Dispose punteros

New: Pide memoria al sistema operativo.
Dispose: Devuelve memoria al sistema operativo.

New: Formas de inicializar un puntero:

  • Solicitar memoria con new. Creua la variable apuntada del tipo al que apunta el puntero en la zona de memoria llamada HEAP.
  • Asignar a un puntero la dirección válida que contiene otro puntero.
Dispose: Se utiliza cuando las variables identificadas no son necesarias para liberar la memoria
  • Después de usar dispose la memoria devuelve la memoria del puntero.
  • El valor del puntero queda indefinido
  • No se puede volver a acceder a la zona de memoria especificada.
Para poder usar dispose:
  • El puntero tiene que ser no nil
  • El puntero no puede ser indefinido
  • El puntero no puede estar siendo accedido en ese momento.

Punteros en pascal

Los punteros representan cualquier dato de la memoria situado en una determinada dirección de memoria.

Los punteros se manejan mediante un identificador, el ual representa:
  • Dirección: Lugar de memoria en el que se encuentra el dato
  • Tipo: Nº de celdas ocupadas por el dato y la interpración de su contenido.
Un puntero siempre tiene que estar apuntando a un tipo de los siguientes datos:
  • Número real
  • Registro
  • Array
  • Otro puntero
También se define el puntero nulo (que no apunta a ninguna dirección) con la sentencia nil

sábado, 3 de febrero de 2007

Operaciones con registros

Para la asignación de registros es compatible en los siguientes casos:
  • Los registros tienen que ser de tipo idéntico
  • Un registros es un alias del otro
  • Los registros comparten la misma definición
  • Los registros están formados por componentes asignables
A su vez son registros que no se puden asignar los siguientes:
  • No pueden ser archivos o ficheros
  • No pueden estar formados por registros restringidos
  • No admiten los enlazables

Registros (record)

Un registro o record sirve para agrupar distinto tipo de datos pero que deben estar juntos. Por ejemplo los datos de una persona, nombre, edad, fecha nacimiento, sexo, etc.

Es necesario acceder de forma aleatoria a los campos de un registro, pero no puede ser calculado porque los campos pueden tener distinto tamaño, por lo que se crea un SELECTOR DE CAMPO o identificador. Se pueden realizar registros anidados.
Ejemplo de registro o record en pascal:
type
tFecha = record
dia: 1..31;
mes: 1..12;
año: 1..2100;
end;
Un registro puede tener varias variantes con un campo discriminante siempre presente, el cual elige una variante o otra según se indique. En el caso de ser boolean se elige la que sea true.
El campo discriminante tiene que ser de tipo ordinal, no puede ser anónimo y no enlazable.

Alguno de los campos de alguna variante puede ser un registro, el cual puede tener una parte variante también, etc.

Un error muy común es intentar acceder a un comapo de una variante no activa, porque en ese caso esa variante no existe.

jueves, 1 de febrero de 2007

Conjuntos en pascal

Pascal estándar permite el tratamiento de conjuntos como elementos. Un conjunto es una colección de elementos que no están repetidos. Los conjuntos en pascal tienen que tener un tipo base Ordinal necesariamente.

Los operadores de los conjuntos:
Intersección: *
Unión: +
Diferencia: -
Diferencia simétrica: >< pertenencia: in

Operadores relacionales y conjuntos: Sean A y B dos conjuntos
Igualdad: A = B True si tienen los mismo elementos
Desigualdad A <> B True si tienen elemendos distintos
Subconjunto A <= B True si A está contenido en B
Superconjunto A >= B True si B está contenido en A

Nota Se pueden agregar o quitar elementos de un conjunto con los operadores + y - de la siguiente forma Conjunto := Conjunto + ['e']

miércoles, 31 de enero de 2007

Operaciones con Ficheros

Conceptos Básicos:

El Buffer de archivo: El buffer es una variable ligada al archivo cuyo tipo es el tiopo baso de este y cuyo contenido es el componente de la posición actual del buffer.

Te presentamos los principales procedimientos y funciones para la utilización de ficheros tanto externos como internos en pascal.

REWRITE: Crea un fichero vacío en la posición eof y el buffer de archivo f^ queda indefinido.
Sintaxis: rewrite(fichero)

PUT: Agrega el componente del buffer de archivo f^ al fichero seleccionado.
Sintaxis: put(fichero)

RESET: Prepara el archivo para inspección.
Sintaxis reset(fichero)

GET: Pasa al siguiente componente y actualiza el buffer.
Sintaxis: get(fichero)

EOF: Detecta el final de fichero.
Sintaxis: eof(fichero)


EXTEND: Esta funcion es la fomra de añadir compentes a un archivo sin usar la funcion rewrite la cual destruye todo el contenido del fichero.
Sintaxis: extend(f);

READ: Lee del archivo indicado.
Sintaxis: read(fichero,v) Si v es un entero el procedimiento lee el primer entero eliminando los espacios y saltos de línea hasta él.
read(fichero,v) equivale a las siguientes sentencias:
begind
v:= fichero^;
get(fichero)
end;
WRITE: Escribe en el fichero seleccionado
Sintaxis: write(fichero,v)

domingo, 21 de enero de 2007

Visualizar matrices en pantalla

Muestra Matices en la salida estandar

type
tDimension = 1..100;
eMatriz(f,c: tDimension) = array [1..f,1..c] of real;

tRango = record
f,c: tDimension value 1;
end;

tpMatriz = ^eMatriz;


procedure EscribirMatriz(var m: tpMatriz);
var filas,col : integer;
begin
for filas := 1 to m^.f do begin
for col := 1 to m^.c do
write(m^[filas,col]:7:2);
writeln(resultado);
writeln(resultado)
end;
end;

Division matrices en pascal

División de dos matrices en pascal.
Para el uso de este procedmiento son necesarios los siguientes procedimientos.
Matriz Inversa
Multiplicar matrices

Dado la siguiente declaración de tipos:
type
tDimension = 1..100;
eMatriz(f,c: tDimension) = array [1..f,1..c] of real;

tRango = record
f,c: tDimension value 1;
end;

tpMatriz = ^eMatriz;


procedure Dividir(m1, m2: tpMatriz; var resul: tpMatriz);
var inversa: tpMatriz;
begin
{ Calcular inversa de m2 }
new (inversa, m2^.f, m2^.c);
MatrizInversa(m2,inversa);

Multiplicar(m1,inversa,resul);
end;