El tipo de variable más grande en Pascal. Pascal. Tipos de datos. Tipos de lenguaje estructurado

Cualquier programa escrito en cualquier lenguaje de programación está diseñado esencialmente para procesar datos. Los datos pueden ser números, textos, gráficos, sonido, etc. Algunos datos son datos de origen, otros son el resultado, que se obtiene al procesar los datos de origen por parte del programa.

Los datos se almacenan en la memoria de la computadora. El programa accede a ellos utilizando nombres de variables asociados con las ubicaciones de memoria donde se almacenan los datos.

Las variables se describen antes del código principal del programa. Aquí se indican los nombres de las variables y el tipo de datos almacenados en ellas.

Hay muchos tipos de datos en el lenguaje de programación Pascal. Además, el propio usuario puede definir sus propios tipos.

El tipo de una variable determina qué datos se pueden almacenar en la ubicación de memoria asociada a ella.

Tipo de variables entero solo se puede asociar con valores enteros generalmente en el rango de -32768 a 32767. Pascal tiene otros tipos de enteros (byte, entero largo).

Tipo de variables real almacenar números reales (fraccionarios).

Variable Booleano El tipo (booleano) (booleano) solo puede tomar dos valores: verdadero(1, verdadero) o FALSO(0, falso).

Tipo de carácter (char) Puede tomar valores de una secuencia ordenada específica de caracteres.

tipo de intervalo definido por el usuario y formado únicamente a partir de tipos ordinales. Representa un subconjunto de valores en un rango específico.

Puedes crear tu propio tipo de datos. enumeración simple valores que puede tomar una variable de este tipo. Este es el llamado tipo de datos enumerados.

Todos los anteriores son tipos de datos simples. Pero también los hay complejos y estructurados, que se basan en tipos simples.

Formación Es una estructura que ocupa una única área en la memoria y consta de un número fijo de componentes del mismo tipo.

Instrumentos de cuerda es una secuencia de caracteres. Además, el número de estos caracteres no puede ser superior a 255 inclusive. Esta limitación es rasgo característico Pascal.

Registro Es una estructura que consta de un número fijo de componentes llamados campos. Los datos en diferentes campos de un registro pueden ser de diferentes tipos.

Conjuntos Representa una colección de cualquier número de elementos, pero del mismo tipo enumerado.

Archivos para Pascal, son secuencias del mismo tipo de datos que se almacenan en dispositivos de memoria externos (por ejemplo, un disco duro).

El concepto de un tipo de datos como puntero asociado con el almacenamiento dinámico de datos en la memoria de la computadora. A menudo, utilizar tipos de datos dinámicos es más eficaz en programación que utilizar tipos de datos estáticos.

Los datos son concepto general para todo con lo que opera computadora. Cualquier tipo de datos define el conjunto de valores que puede tomar una variable particular y las operaciones que se les pueden aplicar. Cada variable encontrada en un programa debe estar asociada a un solo tipo.

Hay dos tipos de tipos simples en Pascal: tipos ordinales y tipos reales. Un tipo ordinal lo define el programador (tipo de enumeración o tipo de rango) o se indica con el nombre de uno de los tres tipos ordinales predefinidos: booleano, entero o char. Un tipo real se indica con el nombre de tipo prescriptivo Real.

Un tipo enumerado se caracteriza por el conjunto de elementos incluidos en él. diferentes significados, entre los cuales se define un orden lineal. Los valores en sí se designan en la definición de este tipo mediante nombres.

Un tipo de rango (limitado) se especifica utilizando valores mínimos y máximos relacionados con un tipo ordinal descrito anteriormente. Así es como se genera un nuevo tipo ordinal.

Tipos de datos ordinales

Un tipo de datos ordinal describe un conjunto finito y ordenado de valores. Estos valores se asignan a la secuencia de números ordinales 0,1,2,...; se hace una excepción sólo para los números enteros ordinales, que se asignan a sí mismos. Cada tipo ordinal tiene un mínimo y valor máximo. Para todos los valores excepto el mínimo hay un valor anterior, y para todos los valores excepto el máximo hay un valor posterior.

Las funciones prescritas succ, pred y ord aceptan argumentos de cualquiera de los tipos ordinales:
succ(X) - da el siguiente valor ordinal después de X
pred(X) - da el valor ordinal que precede a X
ord(X) - da el número ordinal de X

Para todos los tipos ordinales, existen operadores relacionales = , = y > , suponiendo que ambos operandos son del mismo tipo.

tipo booleano

Un valor booleano es uno de dos valores de verdad, indicados por los nombres predefinidos falso y verdadero.

Existen los siguientes operaciones lógicas, dando un valor lógico cuando se aplica a operandos lógicos:
y - lógico Y
o - lógico O
no - lógico NO

Además, cualquiera de las operaciones relacionales (=, =, >, in) produce un resultado lógico.

Además tipo booleano definido de modo que falso

También se prescriben funciones lógicas(es decir, funciones que producen un resultado lógico):
impar(F): verdadero si el número entero es F-impar y el resultado es falso si F-par
eoln(F) - verificación de fin de línea
eof(F) - verificación de fin de archivo

tipo entero

El tipo de número entero incluye una variedad de números enteros.

Cuando se trabaja con operandos enteros, las siguientes operaciones aritméticas producen valores enteros:
* - multiplicación
div - parte entera de la división
mod - resto de la división
+ - suma
- - resta

Pascal también tiene una constante predefinida llamada MaxInt, que contiene el valor máximo de un número entero y es igual a 32767.

Todo el resultado Proporcionar cuatro importantes funciones prescritas:
abdominales(yo) - valor absoluto valor entero yo
sgr(I) - el valor entero de I al cuadrado dado que I trunc(R) - da la parte entera del número real R
round(R): devuelve un número entero redondeado. En este caso: para R>0 significa trunc(R+0.5), y para R

Si I es un valor entero, entonces:
succ(I) - da el siguiente valor entero (I+1)
pred(I) - da el valor entero anterior (I-1)

Tipo de carácter (Char)

Los valores char son los elementos de un conjunto de caracteres finito y ordenado. Los valores de este tipo están representados por un solo carácter encerrado entre comillas simples (apóstrofes). Si se necesita el apóstrofe, se escribe dos veces.
Ejemplos: "*" "G" "3" """" "X"

    Para el tipo Char, se aplican los siguientes supuestos mínimos:
  1. Los dígitos decimales del 0 al 9 están ordenados según sus valores numéricos y se suceden entre sí (por ejemplo, succ("5") = "6").
  2. Puede haber letras mayúsculas desde la "A" hasta la "Z"; Si es así, entonces se ordenan en orden alfabético, pero no necesariamente se suceden (por ejemplo, "A"
  3. puede existir letras minúsculas de "a" a "z"; si es así, entonces están ordenados alfabéticamente, pero no necesariamente están seguidos uno del otro (por ejemplo, "a"

Para asignar un conjunto determinado de caracteres a números de serie y viceversa, existen dos funciones predefinidas:
ord(C) - da número de serie carácter C en dicho conjunto ordenado de caracteres
chr(I) - proporciona el carácter con número de secuencia I

Para argumentos de tipo Char, las funciones predefinidas pred y succ se pueden definir de la siguiente manera:
pred(C) = chr(ord(C)-I)
succ(C) = chr(ord(C)+I)

Comentario. El símbolo anterior o siguiente depende del conjunto de símbolos especificado, por lo que ambas relaciones son válidas sólo si el símbolo anterior o siguiente existe.

tipo real

Los valores de tipo real son los elementos de un subconjunto definido por la implementación. números reales.

Todas las operaciones con cantidades reales son aproximadas, su precisión está determinada por la implementación (máquina) con la que se está tratando. El tipo real es un tipo simple, no es un tipo ordinal. Los valores reales no tienen número ordinal y no existe ningún valor anterior o siguiente para ninguno de ellos.

Si al menos uno de los operandos es de tipo real (el otro puede ser un número entero), las siguientes operaciones dan un resultado real:
* - multiplicación
/ - división (ambos operandos pueden ser números enteros, pero el resultado siempre es real)
+ - suma
- - resta

Hay funciones prescritas que dan un resultado real dado un argumento real:
abs(R) - valor absoluto de R
sqr(R) - R al cuadrado si el resultado está dentro del rango de números reales

Y estas funciones prescritas dan un resultado real con un argumento entero o real:
sin(X) - da el seno de X; X se expresa en radianes
cos(X) - da el coseno de X; X se expresa en radianes
arctan(X) - da la arcotangente de X expresada en radianes
ln(X) - da el valor del logaritmo natural (base e) para X, X>0
exp(X) - da el valor función exponencial(es decir, a la potencia de X)
sqrt(X) - da el valor de la raíz cuadrada de X, X>=0

Advertencia. Las funciones pred, succ no se pueden usar para argumentos reales. No se pueden usar valores de tipo real al indexar matrices, para controlar en un bucle con un parámetro, para determinar. tipo básico conjuntos, para indexar en el operador variante.

Agencia Federal para la Educación

Abstracto

"TIPOS DE DATOS EN PASCAL"

1. tipos de datos

Cualquier dato, es decir las constantes, variables, propiedades, valores de funciones o expresiones se caracterizan por sus tipos. El tipo define el conjunto valores aceptables, que puede tener tal o cual objeto, así como el conjunto de operaciones válidas que se le aplican. Además, el tipo también determina el formato de la representación interna de los datos en la memoria del PC.

En general, el lenguaje Object Pascal se caracteriza por una estructura ramificada de tipos de datos (Fig. 1.1). El lenguaje proporciona un mecanismo para crear nuevos tipos, gracias al cual el número total de tipos utilizados en un programa puede ser tan grande como se desee.

Los datos procesados ​​en el programa se dividen en variables, constantes y literales:

Constantes representan datos cuyos valores se establecen en la sección de declaración constante y no cambian durante la ejecución del programa.

variables se declaran en la sección de declaración de variables, pero a diferencia de las constantes, reciben sus valores durante la ejecución del programa y estos valores se pueden cambiar. Se puede hacer referencia a las constantes y variables por su nombre.

Literal no tiene identificador y está representado directamente por el valor en el texto del programa.

Tipo define el conjunto de valores que pueden tomar los elementos de datos y el conjunto de operaciones permitidas sobre ellos.

Éste y los cuatro capítulos siguientes proporcionan descripción detallada todos los tipos.

1.1 tipos simples

A tipos simples Estos incluyen tipos ordinales, reales y de fecha y hora.

tipos ordinales se diferencian en que cada uno de ellos tiene un número finito valores posibles. Estos valores se pueden ordenar de cierta manera (de ahí el nombre de los tipos) y, por lo tanto, cada uno de ellos se puede asociar con algún número entero: el número ordinal del valor.

tipos reales, estrictamente hablando, también tienen un número finito de valores, que está determinado por el formato de la representación interna de un número real. Sin embargo, el número de valores posibles de tipos reales es tan grande que no es posible asociar un número entero (su número) a cada uno de ellos.

Tipo de fecha y hora Diseñado para almacenar fecha y hora. De hecho, utiliza el formato real para estos fines.

1.1.1 Tipos ordinales

Los tipos ordinales incluyen (consulte la Figura 1.1) tipos enteros, lógicos, de caracteres, enumerados y de rango. A cualquiera de ellos se le puede aplicar la función Ord(x), que devuelve el valor ordinal de la expresión X.


Arroz. 1.1 - Estructura del tipo de datos

Para entero tipos, la función ord(x) devuelve el valor de x en sí, es decir, Ord(X) = x para x que pertenece a cualquier entero tipo. Aplicando Ord(x) a lógico , simbólico y enumerable tipos da un número entero positivo en el rango de 0 a 1 ( tipo booleano), de 0 a 255 ( simbólico), de 0 a 65535 ( enumerable). rango de tipos conserva todas las propiedades del tipo ordinal base, por lo que el resultado de aplicarle la función ord(x) depende de las propiedades de este tipo.

También puedes aplicar funciones a tipos ordinales:

pred(x)- devuelve el valor anterior del tipo ordinal (el valor que corresponde al número ordinal ord(x) -1, es decir ord(pred(x)) = ord(x) - 1;

éxito(x)- devuelve el siguiente valor del tipo ordinal, que corresponde al número ordinal ord(x) +1, es decir ord(Succ(x)) = ord(x) + 1.

Por ejemplo, si un programa define una variable

entonces la función PRED(c) devolverá el carácter "4", y la función SUCC(c) devolverá el carácter "6".

Si imaginas alguna tipo ordinal como un conjunto ordenado de valores que aumentan de izquierda a derecha y ocupan un determinado segmento en el eje numérico, entonces la función pred(x) no está definida para el extremo izquierdo y succ (x) para el extremo derecho de este segmento.

tipos de enteros . El rango de valores posibles de los tipos enteros depende de su representación interna, que puede ser de uno, dos, cuatro u ocho bytes. en la mesa 1.1 muestra los nombres de los tipos de números enteros, la longitud de su representación interna en bytes y el rango de valores posibles.

Tabla 1.1 - Tipos de números enteros

Nombre Longitud, bytes Rango de valores
Cardenal 4 0. .. 2 147 483 647
Byte 1 0...255
punto corto 1 -128...+127
Pequeño 2 -32 768...+32 767
Palabra 2 0...65 535
Entero 4
punto largo 4 -2 147 483 648...+2 147 483 647
Int64 8 -9*1018...+9*1018
palabra larga 4 0. . .4 294 967 295

Tipos palabra larga Y Int64 se introdujeron por primera vez en la versión 4, y los tipos Pequeño Y Cardenal no disponible en Delphi 1. Tipo entero para esta versión ocupa 2 bytes y tiene un rango de valores de -32768 a +32767, es decir, lo mismo que Pequeño .

Cuando utilice procedimientos y funciones con parámetros enteros, debe guiarse por el "anidamiento" de tipos, es decir dondequiera que se pueda utilizar palabra, permitido usar Byte(pero no al revés), en punto largo“entra” Pequeño, que a su vez incluye punto corto .

Relación de procedimientos y funciones aplicables a tipos integrales, se da en la tabla. 1.2. Las letras b, s, w, i, l denotan expresiones del siguiente tipo: Byte , Entero corto, palabra, entero y entero largo ,

x es una expresión de cualquiera de estos tipos; las letras vb, vs, vw, vi, vl, vx denotan variables de los tipos correspondientes. Un parámetro opcional se indica entre corchetes.

Tabla 1.2 - Procedimientos estándar y funciones aplicables a tipos completos

Apelar Tipo de resultado Acción
abdominales(x) incógnita Módulo de devoluciones x
chr(b) Carbonizarse Devuelve un carácter por su código
diciembre(vx[,i]) - Disminuye el valor de vx en i, y en ausencia de i, en 1
inc(vx[,yo]) - Aumenta el valor de vx en i, y en ausencia de i, en 1
Hola(w) Byte Devuelve la reverencia más alta del argumento.
Hola (yo) Mismo Devuelve el tercer byte
Lo(yo) Devuelve el byte bajo del argumento.
Bajo) Mismo
impar(l) Booleano Devuelve Verdadero si el argumento es un número impar
Aleatorio(w) Igual que el parámetro Devoluciones número pseudoaleatorio, distribuido uniformemente en el rango 0...(w-l)
cuadrado(x) incógnita Devuelve el cuadrado del argumento.
intercambiar(yo) Entero Intercambia bytes en una palabra
intercambiar(w) Palabra Mismo

Cuando se opera con números enteros, el tipo de resultado corresponderá al tipo de los operandos, y si los operandos son de diferentes tipos de enteros - tipo general, que incluye ambos operandos. Por ejemplo, cuando se opera con punto corto Y palabra el tipo común será entero. EN configuración estándar el compilador Delphi no produce código que controle posible verificación el valor está fuera del rango aceptable, lo que puede dar lugar a malentendidos.

tipos booleanos . Los tipos lógicos incluyen Booleano, ByteBool, Bool, wordBool Y bool largo. En Pascal estándar, solo se define el tipo Booleano, se introducen otros tipos lógicos en Object Pascal para compatibilidad con Windows: tipos Booleano Y ByteBool cada uno ocupa un byte, booleano Y PalabraBool- 2 bytes cada uno, bool largo- 4 bytes. Los valores booleanos pueden ser una de las constantes predeclaradas Falso o Verdadero.

Dado que el tipo booleano es un tipo ordinal, se puede utilizar en una declaración de bucle de tipo contable. En Delfos 32 para Booleano significado

Ord (Verdadero) = +1, mientras que para otros tipos ( Bool, PalabraBool etc.)

Ord(True) = -1, por lo que este tipo de operadores deben usarse con precaución. Por ejemplo, para la versión Delphi 6, la instrucción ejecutable showMessage(" --- ") en el siguiente bucle para nunca será ejecutado:

para L:= Falso a Verdadero

MostrarMensaje("--);

Si reemplazamos el tipo de parámetro de bucle L en el ejemplo anterior con Booleano, el bucle se ejecutará y el mensaje aparecerá en la pantalla dos veces. [Para las versiones 1 y 2 de Delphi o (Verdadero) =+1 para cualquier tipo booleano.]

Tipo de personaje . El valor de un tipo de carácter es el conjunto de todos los caracteres de la PC. A cada carácter se le asigna un número entero en el rango de 0...255. Este número sirve como código para la representación interna del símbolo; lo devuelve la función ord.

Para codificar en Windows, se utiliza el código ANSI (llamado así por el American National Standard Institute, el instituto de estandarización estadounidense que propuso este código). La primera mitad de los caracteres de PC con códigos 0...127 corresponde a la Tabla 1.3. La segunda mitad de los caracteres con códigos 128...255 cambia para varias fuentes. Fuentes estándar de Windows Arial Cyr, Courier New Cyr y Times New Roman utilizan los últimos 64 códigos (del 192 al 256) para representar los caracteres cirílicos (sin las letras “ё” y “Ё”): “A”... “Za” están codificados con los valores 192.. 223, “a”... “i” - 224...255. Los símbolos “Ё” y “е” tienen los códigos 168 y 184, respectivamente.

Tabla 1.3 - Codificación de caracteres según el estándar ANSI

Código Símbolo Código. Símbolo Código. Símbolo Código Símbolo
0 NUL 32 LICENCIADO EN DERECHO. 64 @ 96 "
1 ZON 33 ! 65 A 97 A
2 STX 34 66 EN 98 b
3 ETX 35 # 67 CON 99 Con
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 mi 101 mi
6 ACK 38 & 70 F 102 F
7 BEL 39 " 71 GRAMO 103 d
8" BS 40 ( 72 norte 104 h
9 HT 41 ) 73 I 105 i
10 LF 42 * 74 j 106 j
11 Vermont 43 + 75 A 107 k
12 FF 44 F 76 l 108 1
13 CR 45 - 77 METRO 109 metro
14 ENTONCES 46 78 norte 110 norte
15 SI. 47 / 79 0 111 oh
16 DEL 48 0 80 R 112 PAG
17 DC1 49 1 81 q 113 q
18 DC2 50 2 82 R 114 r
19 DC3 51 3 83 S 115 s
20 CC 4 52 4 84 t 116 t
21 N.A.K. 53 5 85 Ud. 117 tu
22 SINC 54 6 86 V 118 v
23 ETB 55 7 87 W. 119 W.
24 PODER 56 8 88 incógnita 120 incógnita
25 E. M. 57 9 89 Y 121 Ud.
26 SUB 58 : 90 z .122 z
27 ESC 59 ; 91 t 123 {
28 FS 60 < 92 \ 124 1
29 G.S. 61 = 93 ] 125 }
30 R.S. 62 > 94 l 126 ~
31 A NOSOTROS 63 F 95 127 r

Los caracteres con códigos 0...31 se refieren a códigos de servicio. Si estos códigos se utilizan en el texto de caracteres del programa, se consideran espacios en blanco.

Tipos de datos en lenguaje Pascal: clasificación y descripciones. Tipos de datos aritméticos y ordinales, acciones con ellos. Expresiones aritméticas: funciones, operaciones y orden de acciones. Compatibilidad de tipos de datos y conversiones.

Los compiladores Pascal requieren que se proporcione información sobre la cantidad de memoria necesaria para ejecutar un programa antes de ejecutarlo. Para hacer esto, en la sección de descripción de la variable ( var) debe enumerar todas las variables utilizadas en el programa. Además, también es necesario indicarle al compilador cuánta memoria ocupará cada una de estas variables. También sería bueno acordar de antemano las distintas operaciones aplicables a determinadas variables...

Todo esto se puede comunicar al programa simplemente indicando el tipo de la variable futura. Al tener información sobre el tipo de variable, el compilador "comprende" cuántos bytes se le deben asignar, qué acciones se pueden realizar con ella y en qué construcciones puede participar.

Para comodidad de los programadores. lenguaje pascal hay muchos tipos estándar datos y además la capacidad de crear nuevos tipos.

A la hora de construir nuevos tipos de datos a partir de los existentes (estándar o definidos nuevamente por el propio programador), debemos recordar que cualquier edificio debe construirse sobre una buena base. Por eso, ahora hablaremos de esta “base”.

Residencia en tipos de datos básicos Se construyen todos los demás tipos del lenguaje Pascal, que se denominan: construido.

La división en tipos de datos básicos y construidos en Pascal se muestra en la tabla:

Los tipos de datos construidos por el programador se describen en la sección tipo según la siguiente plantilla:

tipo<имя_типа> = <описание_типа>;

Por ejemplo:

escriba Lat_Bukvy = "a" .. "z", "A" .. "Z";

Los tipos de datos básicos son estándar, por lo que no es necesario describirlos en la sección tipo. Sin embargo, si se desea, esto también se puede hacer, por ejemplo, dando definiciones largas. nombres cortos. digamos ingresando nuevo tipo datos

escriba Int = Entero;

Puedes acortar un poco el texto del programa.

Los tipos construidos estándar tampoco necesitan describirse en la sección tipo. Sin embargo, en algunos casos esto aún debe hacerse debido a requisitos de sintaxis. Por ejemplo, en lista de parámetros procedimientos o funciones No se pueden utilizar constructores de tipos (ver conferencia 8).

Tipos de datos ordinales

Entre los tipos de datos básicos, los más notables son tipos ordinales. Este nombre se puede justificar de dos maneras:

Rutinas estándar que procesan tipos de datos ordinales

Sólo para cantidades tipos ordinales determinado siguientes funciones y procedimientos:

  1. Función orden(incógnita) devuelve el número ordinal del valor de la variable x (relativo al tipo al que pertenece la variable x).
  2. Función pred(incógnita) devuelve el valor que precede a x (no aplicable al primer elemento del tipo).
  3. Función Éxito(incógnita) devuelve el valor siguiente x(k último elemento tipo de no aplicable).
  4. Procedimiento (incógnita) devuelve el valor que sigue a x (para tipos de datos aritméticos esto es equivalente al operador x:= x + 1).
  5. Procedimiento (xk) devuelve el valor k-ésimo después de x (para tipos de datos aritméticos esto es equivalente al operador x:= x + k).
  6. Procedimiento Dic(incógnita) devuelve el valor que precede a x (para tipos de datos aritméticos esto es equivalente al operador x:= x - 1).
  7. Procedimiento Dic(xk) devuelve el valor k–e que precede a x (para tipos de datos aritméticos esto es equivalente al operador x:= x - k).

A primera vista, parece como si el resultado de aplicar el procedimiento (incógnita) coincide completamente con el resultado de aplicar la función Éxito(incógnita). Sin embargo, la diferencia entre ellos aparece en los límites del rango permitido. Función Éxito(incógnita) no aplicable a elemento máximo como, aquí está el procedimiento (incógnita) no producirá ningún error, pero, actuando según las reglas de la suma mecánica, sumará la siguiente unidad al número del elemento. El número, por supuesto, saldrá del rango y, debido al truncamiento, se convertirá en el número del valor mínimo del rango. Resulta que los procedimientos () Y Dic() perciben cualquier tipo ordinal como si estuviera “cerrado en un anillo”: inmediatamente después del último valor viene nuevamente el primer valor.

Expliquemos todo lo dicho con un ejemplo. Para tipo de datos

escriba Dieciséis = 0 .. 15 ;

intentar sumar 1 al número 15 dará como resultado el siguiente resultado:

1 1 1 1 1 1 0 0 0 0

La unidad inicial quedará cortada y, por tanto, resulta que (15)=0 .

Se observa una situación similar en el límite inferior del rango permitido de un tipo de datos ordinal arbitrario para el procedimiento Dic(incógnita) y funciones pred(incógnita):

Tipos de datos relacionados con ordinal

Describamos ahora tipos de datos ordinales con más detalle.

  1. tipo booleano Booleano tiene dos valores: Falso y Verdadero, y para ellos se cumplen las siguientes igualdades:
  2. Al tipo de carácter Carbonizarse incluye 256 caracteres tabla ASCII extendida(por ejemplo, "a", "b", "i", "7", "#"). Número de carácter devuelto por la función. orden() , coincide con el número de este símbolo en tabla ASCII.
  3. tipos de datos enteros Pongámoslo en una tabla:
  4. Listable Los tipos de datos se especifican en la sección. tipo enumerando explícitamente sus elementos. Por ejemplo:

    tipo Semana = (dom, lun, mar, mié, jueves, viernes, sábado);

    Recuerde que para este tipo de datos:

  5. Tipos de datos de intervalo se especifican sólo por los límites de su rango. Por ejemplo:

    tipo Mes = 1 .. 12 ;
    Budni = lunes .. viernes;

  6. El programador puede crear sus propios tipos de datos, que son una combinación de varios tipos estándar. Por ejemplo:

    escriba Valid_For_Identifiers = "a" .. "z", "A" .. "Z", "_", "0" .. "9";

Este tipo consiste en combinar varios intervalos, y en en este caso se ha cambiado el orden de las letras latinas: si en el tipo estándar

Agencia Federal para la Educación

Abstracto

"TIPOS DE DATOS EN PASCAL"

1. tipos de datos

Cualquier dato, es decir las constantes, variables, propiedades, valores de funciones o expresiones se caracterizan por sus tipos. Un tipo define el conjunto de valores válidos que puede tener un objeto, así como el conjunto de operaciones válidas que se le pueden aplicar. Además, el tipo también determina el formato de representación interna de los datos en la memoria del PC.

En general, el lenguaje Object Pascal se caracteriza por una estructura ramificada de tipos de datos (Fig. 1.1). El lenguaje proporciona un mecanismo para crear nuevos tipos, gracias al cual el número total de tipos utilizados en un programa puede ser tan grande como se desee.

Los datos procesados ​​en el programa se dividen en variables, constantes y literales:

Constantes representan datos cuyos valores se establecen en la sección de declaración constante y no cambian durante la ejecución del programa.

variables se declaran en la sección de declaración de variables, pero a diferencia de las constantes, reciben sus valores durante la ejecución del programa y estos valores se pueden cambiar. Se puede hacer referencia a las constantes y variables por su nombre.

Literal no tiene identificador y está representado directamente por el valor en el texto del programa.

Tipo define el conjunto de valores que pueden tomar los elementos de datos y el conjunto de operaciones permitidas sobre ellos.

Este y los cuatro capítulos siguientes proporcionan descripciones detalladas de cada tipo.

1.1 tipos simples

Los tipos simples incluyen tipos ordinales, reales y de fecha y hora.

tipos ordinales Se diferencian en que cada uno de ellos tiene un número finito de valores posibles. Estos valores se pueden ordenar de cierta manera (de ahí el nombre de los tipos) y, por lo tanto, cada uno de ellos puede asociarse con algún número entero: el número ordinal del valor.

tipos reales, estrictamente hablando, también tienen un número finito de valores, que está determinado por el formato de la representación interna de un número real. Sin embargo, el número de valores posibles de tipos reales es tan grande que no es posible asociar un número entero (su número) a cada uno de ellos.

Tipo de fecha y hora Diseñado para almacenar fecha y hora. De hecho, utiliza el formato real para estos fines.

1.1.1 Tipos ordinales

Los tipos ordinales incluyen (consulte la Figura 1.1) tipos enteros, lógicos, de caracteres, enumerados y de rango. A cualquiera de ellos se le puede aplicar la función Ord(x), que devuelve el valor ordinal de la expresión X.


Arroz. 1.1 - Estructura del tipo de datos

Para entero tipos, la función ord(x) devuelve el valor de x en sí, es decir, Ord(X) = x para x que pertenece a cualquier entero tipo. Aplicando Ord(x) a lógico , simbólico y enumerable tipos da un número entero positivo en el rango de 0 a 1 ( tipo booleano), de 0 a 255 ( simbólico), de 0 a 65535 ( enumerable). rango de tipos conserva todas las propiedades del tipo ordinal base, por lo que el resultado de aplicarle la función ord(x) depende de las propiedades de este tipo.

También puedes aplicar funciones a tipos ordinales:

pred(x)- devuelve el valor anterior del tipo ordinal (el valor que corresponde al número ordinal ord(x) -1, es decir ord(pred(x)) = ord(x) - 1;

éxito(x)- devuelve el siguiente valor del tipo ordinal, que corresponde al número ordinal ord(x) +1, es decir ord(Succ(x)) = ord(x) + 1.

Por ejemplo, si un programa define una variable

entonces la función PRED(c) devolverá el carácter "4", y la función SUCC(c) devolverá el carácter "6".

Si imaginamos cualquier tipo ordinal como un conjunto ordenado de valores, que aumenta de izquierda a derecha y ocupa un determinado segmento en el eje numérico, entonces la función pred(x) no está definida para la izquierda y succ (x) para la derecha. final de este segmento.

tipos de enteros . El rango de valores posibles de los tipos enteros depende de su representación interna, que puede ser de uno, dos, cuatro u ocho bytes. en la mesa 1.1 muestra los nombres de los tipos de números enteros, la longitud de su representación interna en bytes y el rango de valores posibles.

Tabla 1.1 - Tipos de números enteros

Nombre Longitud, bytes Rango de valores
Cardenal 4 0. .. 2 147 483 647
Byte 1 0...255
punto corto 1 -128...+127
Pequeño 2 -32 768...+32 767
Palabra 2 0...65 535
Entero 4
punto largo 4 -2 147 483 648...+2 147 483 647
Int64 8 -9*1018...+9*1018
palabra larga 4 0. . .4 294 967 295

Tipos palabra larga Y Int64 se introdujeron por primera vez en la versión 4, y los tipos Pequeño Y Cardenal no disponible en Delphi 1. Tipo entero para esta versión ocupa 2 bytes y tiene un rango de valores de -32768 a +32767, es decir, lo mismo que Pequeño .

Cuando utilice procedimientos y funciones con parámetros enteros, debe guiarse por el "anidamiento" de tipos, es decir dondequiera que se pueda utilizar palabra, permitido usar Byte(pero no al revés), en punto largo“entra” Pequeño, que a su vez incluye punto corto .

La lista de procedimientos y funciones aplicables a tipos de números enteros se proporciona en la tabla. 1.2. Las letras b, s, w, i, l denotan expresiones del siguiente tipo: Byte , Entero corto, palabra, entero y entero largo ,

x es una expresión de cualquiera de estos tipos; las letras vb, vs, vw, vi, vl, vx denotan variables de los tipos correspondientes. Un parámetro opcional se indica entre corchetes.

Tabla 1.2 - Procedimientos y funciones estándar aplicables a tipos completos

Apelar Tipo de resultado Acción
abdominales(x) incógnita Módulo de devoluciones x
chr(b) Carbonizarse Devuelve un carácter por su código
diciembre(vx[,i]) - Disminuye el valor de vx en i, y en ausencia de i, en 1
inc(vx[,yo]) - Aumenta el valor de vx en i, y en ausencia de i, en 1
Hola(w) Byte Devuelve la reverencia más alta del argumento.
Hola (yo) Mismo Devuelve el tercer byte
Lo(yo) Devuelve el byte bajo del argumento.
Bajo) Mismo
impar(l) Booleano Devuelve Verdadero si el argumento es un número impar
Aleatorio(w) Igual que el parámetro Devuelve un número pseudoaleatorio distribuido uniformemente en el rango 0...(w-l)
cuadrado(x) incógnita Devuelve el cuadrado del argumento.
intercambiar(yo) Entero Intercambia bytes en una palabra
intercambiar(w) Palabra Mismo

Al operar con números enteros, el tipo de resultado corresponderá al tipo de los operandos, y si los operandos son de diferentes tipos de enteros, un tipo común que incluya ambos operandos. Por ejemplo, cuando se opera con punto corto Y palabra el tipo común será entero. En la configuración predeterminada, el compilador Delphi no produce código para comprobar si un valor está fuera de rango, lo que puede provocar malentendidos.

tipos booleanos . Los tipos lógicos incluyen Booleano, ByteBool, Bool, wordBool Y bool largo. En Pascal estándar, solo se define el tipo Booleano, se introducen otros tipos lógicos en Object Pascal para compatibilidad con Windows: tipos Booleano Y ByteBool cada uno ocupa un byte, booleano Y PalabraBool- 2 bytes cada uno, bool largo- 4 bytes. Los valores booleanos pueden ser una de las constantes predeclaradas Falso o Verdadero.

Dado que el tipo booleano es un tipo ordinal, se puede utilizar en una declaración de bucle de tipo contable. En Delfos 32 para Booleano significado

Ord (Verdadero) = +1, mientras que para otros tipos ( Bool, PalabraBool etc.)

Ord(True) = -1, por lo que este tipo de operadores deben usarse con precaución. Por ejemplo, para la versión Delphi 6, la instrucción ejecutable showMessage(" --- ") en el siguiente bucle para nunca será ejecutado:

para L:= Falso a Verdadero

MostrarMensaje("--);

Si reemplazamos el tipo de parámetro de bucle L en el ejemplo anterior con Booleano, el bucle se ejecutará y el mensaje aparecerá en la pantalla dos veces. [Para las versiones 1 y 2 de Delphi o (Verdadero) =+1 para cualquier tipo booleano.]

Tipo de personaje . El valor de un tipo de carácter es el conjunto de todos los caracteres de la PC. A cada carácter se le asigna un número entero en el rango de 0...255. Este número sirve como código para la representación interna del símbolo; lo devuelve la función ord.

Para codificar en Windows, se utiliza el código ANSI (llamado así por el American National Standard Institute, el instituto de estandarización estadounidense que propuso este código). La primera mitad de los caracteres de PC con códigos 0...127 corresponde a la Tabla 1.3. La segunda mitad de los caracteres con códigos 128...255 varía según las diferentes fuentes. Las fuentes estándar de Windows Arial Cyr, Courier New Cyr y Times New Roman utilizan los últimos 64 códigos (de 192 a 256) para representar caracteres cirílicos (sin las letras “ё” y “Ё”): “A”... “Z” están codificados los valores 192..223, “a”... “i” - 224...255. Los símbolos “Ё” y “е” tienen los códigos 168 y 184, respectivamente.

Tabla 1.3 - Codificación de caracteres según el estándar ANSI

Código Símbolo Código. Símbolo Código. Símbolo Código Símbolo
0 NUL 32 LICENCIADO EN DERECHO. 64 @ 96 "
1 ZON 33 ! 65 A 97 A
2 STX 34 66 EN 98 b
3 ETX 35 # 67 CON 99 Con
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 mi 101 mi
6 ACK 38 & 70 F 102 F
7 BEL 39 " 71 GRAMO 103 d
8" BS 40 ( 72 norte 104 h
9 HT 41 ) 73 I 105 i
10 LF 42 * 74 j 106 j
11 Vermont 43 + 75 A 107 k
12 FF 44 F 76 l 108 1
13 CR 45 - 77 METRO 109 metro
14 ENTONCES 46 78 norte 110 norte
15 SI. 47 / 79 0 111 oh
16 DEL 48 0 80 R 112 PAG
17 DC1 49 1 81 q 113 q
18 DC2 50 2 82 R 114 r
19 DC3 51 3 83 S 115 s
20 CC 4 52 4 84 t 116 t
21 N.A.K. 53 5 85 Ud. 117 tu
22 SINC 54 6 86 V 118 v
23 ETB 55 7 87 W. 119 W.
24 PODER 56 8 88 incógnita 120 incógnita
25 E. M. 57 9 89 Y 121 Ud.
26 SUB 58 : 90 z .122 z
27 ESC 59 ; 91 t 123 {
28 FS 60 < 92 \ 124 1
29 G.S. 61 = 93 ] 125 }
30 R.S. 62 > 94 l 126 ~
31 A NOSOTROS 63 F 95 127 r

Los caracteres con códigos del 0 al 31 se refieren a códigos de servicio. Si estos códigos se utilizan en el texto de caracteres del programa, se consideran espacios en blanco.

Para escribir carbonizarse Se aplican operaciones relacionales, así como funciones integradas:

Carbón (c)- tipo de función carbonizarse; convierte una expresión a tipo Byte en un símbolo y lo devuelve con su valor;

UpCase(CH)- tipo de función carbonizarse; devuelve una letra mayúscula si sn es minúscula letra latina; de lo contrario, devuelve el símbolo сн (para cirílico, devuelve el carácter original).

Tipo de enumeración . Un tipo enumerado se especifica mediante una enumeración de los valores que puede recibir. Cada valor recibe un nombre mediante algún identificador y se ubica en una lista entre paréntesis, por ejemplo:

colores = (rojo, blanco, azul);

El uso de tipos enumerados hace que los programas sean más visuales.

La correspondencia entre los valores de un tipo de enumeración y los números ordinales de estos valores se establece mediante el orden de enumeración: el primer valor de la lista recibe el número ordinal 0, el segundo - 1, etc. La cardinalidad máxima de un El tipo de enumeración es de 65536 valores, por lo que, de hecho, el tipo de enumeración especifica algún subconjunto del tipo completo. palabra y puede considerarse como una declaración compacta de un grupo de constantes enteras con valores 0, 1, etc.

El uso de tipos enumerados aumenta la confiabilidad de los programas al permitirle controlar los valores que reciben las variables correspondientes. En Object Pascal está permitido conversión inversa: cualquier tipo de expresión Palabra se puede convertir en un valor de un tipo enumerado a menos que el valor de la expresión entera exceda la cardinalidad de ese tipo. Esta conversión se logra mediante el uso de una función declarada automáticamente con el nombre del tipo enumerado.

rango de tipos . Un tipo de rango es un subconjunto de su tipo base, que puede ser cualquier tipo ordinal excepto un tipo de rango.

Un tipo de rango se define por los límites de sus valores dentro del tipo base:

<мин.знач.>..<макс.знач.>

Aquí<мин. знач. > - valor mínimo rango de tipos;<макс. знач. >- su valor máximo.

No es necesario describir el tipo de rango en la sección de tipo, pero se puede especificar directamente al declarar la variable.

Al determinar un tipo de rango, debe seguir las siguientes reglas:

dos caracteres “..” se tratan como un solo carácter, por lo que no se permiten espacios entre ellos; el borde izquierdo del rango no debe exceder su borde derecho.

Un tipo de rango hereda todas las propiedades de su tipo base, pero con las limitaciones de su menor potencia. En particular, si se define una variable.

La biblioteca estándar de Object Pascal incluye dos funciones que admiten trabajar con tipos de rango:

Alto(x)- devuelve el valor máximo del tipo de rango al que pertenece la variable x;

Bajo(x)- devuelve el valor mínimo del tipo de rango.

1.1.2 Tipos reales

A diferencia de los tipos ordinales, cuyos valores siempre se asignan a una serie de números enteros y, por lo tanto, se representan de manera absolutamente exacta en PC, los valores de los tipos reales definen un número arbitrario solo con cierta precisión finita dependiendo del formato interno del número real. .

Tabla 1.4 - Tipos reales

EN versiones anteriores Delphi 1...3 tipo Real ocupaba 6 bytes y tenía un rango de valores desde 2,9*10-39 hasta 1,7*1038. En las versiones 4 y 5 este tipo equivale al tipo Doble. Si es necesario (por motivos de compatibilidad), utilice 6 bytes Real, debe especificar una directiva del compilador (SREALCOMPATIBILITY ON).

Como se puede ver en la tabla. 1.4, un número real en Object Pascal ocupa de 4 a 10 bytes contiguos y tiene la siguiente estructura en la memoria de la PC.

Aquí s es el dígito de signo del número; e - parte exponencial; contiene orden binario; m es la mantisa del número.

mantisa m tiene una longitud de 23 (para soltero) hasta 63 (para Extendido) bits binarios, lo que garantiza una precisión de 7...8 para soltero y 19...20 para Extendido dígitos decimales. El punto decimal (coma) está implícito delante del dígito izquierdo (el más significativo) de la mantisa, pero cuando se opera con un número, su posición se desplaza hacia la izquierda o hacia la derecha de acuerdo con el orden binario del número almacenado en la parte exponencial. , por lo tanto, las operaciones con números reales se denominan aritmética de coma flotante (coma).

Tenga en cuenta que el coprocesador aritmético siempre procesa números en el formato Extendido, y los otros tres tipos reales en este caso se obtienen simplemente truncando los resultados a tamaños requeridos y se utilizan principalmente para ahorrar memoria.

Los tipos ocupan una posición especial en Object Pascal comp Y Divisa, que se tratan como números reales con partes fraccionarias de longitud fija: en comp la parte fraccionaria tiene una longitud de 0 dígitos, es decir simplemente está ausente, en divisa la longitud de la parte fraccionaria es de 4 decimales. De hecho, ambos tipos definen un entero grande con signo que almacena de 19 a 20 dígitos decimales significativos (internamente ocupan 8 bytes contiguos). Al mismo tiempo, en expresiones comp Y divisa totalmente compatible con cualquier otro tipos reales: todas las operaciones reales están definidas en ellos, pueden usarse como argumentos funciones matemáticas etc. El área de aplicación más adecuada para estos tipos es la contabilidad.

1.1.3 Tipo de fecha y hora

El tipo de fecha y hora está definido por un identificador estándar FechaHora y está diseñado para almacenar simultáneamente fecha y hora. En la representación interna ocupa 8 bytes y similares divisa representa un número real con un fijo parte fraccionaria: la parte entera del número almacena la fecha y la parte fraccionaria almacena la hora. La fecha se define como la cantidad de días que han pasado desde el 30 de diciembre de 1899, y el tiempo como la fracción de día que ha pasado desde las 0 horas, por lo que el valor 36444.837 corresponde a la fecha 11/10/1999 y la hora 20:05. El número de días puede ser negativo, pero las funciones para convertir una fecha a un tipo de cadena ignoran los valores inferiores a -693594 (correspondiente a la fecha 00.00.0000 de la Natividad de Cristo).

Tipo de datos anterior FechaHora se definen las mismas operaciones que con números reales, y las expresiones de este tipo pueden involucrar constantes y variables de tipos enteros y reales.

porque el tipo FechaHora compatible con el formato de números reales, es posible determinar fácilmente una fecha que esté varios días por delante o por detrás de una determinada: para ello, basta con sumar o restar el número entero deseado a la fecha dada, respectivamente.

1.2 tipos estructurados

Cualquiera de tipos estructurados(y en Object Pascal hay cuatro: matrices, registros, conjuntos y archivos) se caracteriza por la multiplicidad de elementos que forman este tipo. Cada elemento, a su vez, puede pertenecer a un tipo estructurado, lo que nos permite hablar de posible anidamiento de tipos. Object Pascal permite una profundidad arbitraria de anidamiento de tipos, pero la longitud total de cualquiera de ellos en la representación interna no debe exceder los 2 GB.

Para compatibilidad con Pascal estándar, Object Pascal permite colocar una palabra reservada antes de una declaración de tipo estructurado. lleno, indicando al compilador que guarde siempre que sea posible la memoria asignada para objetos de tipo estructurado; pero el compilador en realidad ignora esta instrucción: "empaquetar" datos en Object Pascal se realiza automáticamente siempre que sea posible.

1.2.1 Matrices

Las matrices en Object Pascal son similares en muchos aspectos a tipos similares datos en otros lenguajes de programación. rasgo distintivo arrays es que todos sus componentes son datos del mismo tipo (posiblemente estructurados). Estos componentes se pueden organizar fácilmente y se puede acceder a cualquiera de ellos simplemente especificando su número de serie.

La descripción del tipo de matriz se especifica de la siguiente manera:

<имя типа>= matriz[<сп.инд.типов>] de<тип>;

Aquí<имя типа>- identificador correcto; matriz, de- palabras reservadas (matriz, de);<сп.инд.типов>- una lista de uno o más tipos de índice, separados por comas; los corchetes que enmarcan la lista son un requisito de sintaxis;<тип>- cualquier tipo de Objeto Pascal.

Cualquier tipo ordinal con una capacidad de no más de 2 GB se puede utilizar como tipo de índice en Object Pascal (es decir, excepto palabra larga Y Int64)

La profundidad de anidamiento de los tipos estructurados en general y, en consecuencia, de los arrays, es arbitraria, por lo que el número de elementos en la lista de tipos de índice (tamaño del array) no está limitado, sin embargo, la longitud total de la representación interna de cualquier La matriz no puede tener más de 2 GB. En la memoria de la PC, los elementos de la matriz se suceden entre sí de tal manera que cuando se mueven de direcciones bajas a altas, el índice más derecho de la matriz cambia más rápidamente.

En Object Pascal, puede utilizar un único operador de asignación para transferir todos los elementos de una matriz a otra matriz del mismo tipo.

1.2.2 Registros

Registro Es una estructura de datos que consta de un número fijo de componentes llamados campos de un registro. A diferencia de una matriz, los componentes (campos) de un registro se pueden varios tipos. Para que sea posible hacer referencia a uno u otro componente de un registro, los campos reciben nombres.

La estructura de una declaración de tipo postal es:

<имятипа>=registro<сп.полей>fin;

Aquí<имя типа>- identificador correcto; grabar/finalizar- palabras reservadas (grabar, finalizar);<сп.полей>- lista de campos; es una secuencia de secciones de un registro separadas por un punto y coma.

Cada sección de un registro consta de uno o más identificadores de campo, separados por comas.

Oferta caso... de, que abre la parte variante, es superficialmente similar al operador de selección correspondiente, pero en realidad solo desempeña el papel de una peculiar palabra funcional, indicando el comienzo de la parte variante. Por eso al final de la parte variante no debes poner fin como una pareja para caso... de. (Dado que la parte variante es siempre la última en el registro, todavía va seguida del final, pero solo como un par para registrar). Tecla de selección de frases caso... de El compilador lo ignora efectivamente: el único requisito para ello en Object Pascal es que la clave defina algún tipo ordinal estándar o predeclarado.

Los nombres de los campos deben ser únicos dentro del registro donde se declaran; sin embargo, si los registros contienen campos de registro, es decir, están anidados entre sí, los nombres se pueden repetir en diferentes niveles de anidamiento.

1.2.3 Conjuntos

Conjuntos - son conjuntos del mismo tipo de objetos lógicamente relacionados entre sí. La naturaleza de las relaciones entre objetos sólo está implícita en el programador y no está controlada de ninguna manera por Object Pascal. El número de elementos incluidos en un conjunto puede variar de 0 a 256 (un conjunto que no contiene elementos se llama vacío). Es la inconstancia del número de sus elementos lo que los conjuntos se diferencian de las matrices y los registros.

Dos conjuntos se consideran equivalentes si y sólo si todos sus elementos son iguales y el orden de los elementos del conjunto es indiferente. Si todos los elementos de un conjunto están incluidos también en otro, se dice que el primer conjunto está incluido en el segundo. Un conjunto vacío se incluye en cualquier otro conjunto.

La descripción del tipo de conjunto es:

<имя типа>= conjunto de<базовый тип>;

Aquí<имя типа>- identificador correcto; conjunto, de- palabras reservadas (conjunto, de);<базовый тип>- el tipo básico de elementos del conjunto, que puede ser cualquier tipo ordinal, excepto Palabra, entero, entero largo, int64 .

Para definir un conjunto se utiliza el llamado constructor de conjuntos: una lista de especificaciones de los elementos del conjunto, separados por comas; la lista está enmarcada corchetes. Las especificaciones de elementos pueden ser constantes o expresiones de un tipo base, o un tipo de rango del mismo tipo base.

La estructura interna del conjunto es tal que a cada uno de sus elementos se le asigna un dígito binario (un bit); si un elemento está incluido en el conjunto, el dígito correspondiente tiene el valor 1, en caso contrario - 0. Al mismo tiempo unidad minima la memoria es un byte que contiene 8 bits, por lo que el compilador asignó un byte a los conjuntos y, como resultado, la capacidad de cada uno de ellos llegó a ser igual a 8 elementos. La capacidad máxima del conjunto es de 256 elementos. Para tales conjuntos, el compilador asigna 16 bytes adyacentes.

Y un experimento más: cambie el rango del tipo base a 1..256. Aunque la cardinalidad de este tipo es de 256 elementos, cuando intentas compilar el programa, el compilador informará un error: Conjuntos puede tener como máximo 256 elementos (los conjuntos no pueden tener más de 256 elementos) porque la numeración de los elementos del conjunto comienza desde cero, independientemente del límite inferior declarado en el programa. El compilador permite el uso como tipo base de un tipo de rango entero con un límite mínimo de 0 y un máximo de 255, o cualquier tipo enumerado con no más de 256 elementos (la cardinalidad máxima de un tipo enumerado es 65536 elementos).

1.3 cuerdas

Los siguientes tipos se utilizan para el procesamiento de texto en Object Pascal:

cuerda corta cadena corta o cadena [n], donde norte<= 255;

cuerda larga cadena ;

linea ancha Cadena ancha ;

cadena de terminal nulo pchar .

Lo que estos tipos tienen en común es que cada cadena se trata como una matriz unidimensional de caracteres, cuyo número puede cambiar en un programa en ejecución: para la cadena [n], la longitud de la cadena cambia de 0 a n, para cadena Y pchar- de 0 a 2 GB.

Pascal estándar utiliza sólo cadenas cortas Cadena[n]. En la memoria, a dicha cadena se le asignan n+i bytes, el primer byte contiene la longitud actual de la cadena y los caracteres mismos se ubican a partir del segundo byte. Dado que la longitud de la cadena en este caso es de un byte, la longitud máxima de una cadena corta no puede exceder los 255 caracteres. El tipo estándar se utiliza para declarar una cadena corta de longitud máxima. cadena corta(equivalente Cadena).

Windows utiliza ampliamente cadenas de terminal nulo, que son cadenas de caracteres delimitadas por el carácter #o. La longitud máxima de dicha cadena está limitada únicamente por la memoria disponible y puede ser muy grande.

Se ha introducido un nuevo tipo en las versiones de 32 bits de Delphi. cadena, combinando las comodidades de ambos tipos. Cuando se trabaja con este tipo, la memoria se asigna según sea necesario (dinámicamente) y está limitada por la memoria disponible para el programa.

1.4 Punteros y memoria dinámica

1.4.1 Memoria dinámica

memoria dinámica- esta es la RAM de la PC proporcionada al programa durante su funcionamiento. La ubicación de datos dinámicos significa el uso de memoria dinámica directamente mientras el programa se está ejecutando. Por el contrario, la asignación estática la realiza el compilador Object Pascal cuando se compila el programa. Con la colocación dinámica, no se conoce de antemano ni el tipo ni la cantidad de datos que se van a colocar.

1.4.2 Señales

La RAM de una PC es un conjunto de celdas para almacenar información: bytes, cada uno de los cuales tiene su propio número. Estos números se llaman direcciones y le permiten acceder a cualquier byte de memoria. Object Pascal proporciona al programador un medio flexible para gestionar la memoria dinámica: los llamados punteros. Un puntero es una variable que contiene la dirección de un byte de memoria como valor. Usando punteros, puede colocar cualquiera de los tipos de datos conocidos en Object Pascal en la memoria dinámica. Sólo algunos de ellos ( Byte, Char, ShortInt, Booleano) ocupan un byte en la representación interna, el resto, varios adyacentes. Por lo tanto, el puntero en realidad sólo aborda el primer byte de datos.

Normalmente, un puntero está asociado con algún tipo de datos. Llamaremos a estos punteros escritos. Para declarar un puntero escrito, use el ícono ^, que se coloca delante del tipo correspondiente.

En Object Pascal, puede declarar un puntero sin tener que asociarlo con ningún tipo de datos específico. Para ello se utiliza el tipo estándar. puntero, Por ejemplo:

Los punteros de este tipo se denominarán sin tipo. Dado que los punteros sin tipo no están asociados con un tipo específico, se pueden usar para asignar dinámicamente datos cuya estructura y tipo cambian a medida que se ejecuta el programa.

Como ya se mencionó, los valores de los punteros son las direcciones de las variables en la memoria, por lo que es de esperar que el valor de un puntero se pueda pasar a otro. De hecho, esto no es del todo cierto. En Object Pascal, solo puede pasar valores entre punteros asociados con el mismo tipo de datos.

1.4.3 Asignar y liberar memoria dinámica

Toda la memoria dinámica en Object Pascal se trata como una matriz continua de bytes, que se denomina montón.

La memoria para cualquier variable asignada dinámicamente se asigna mediante el procedimiento Nuevo. El parámetro para llamar a este procedimiento es un puntero escrito. Como resultado del acceso, el puntero adquiere un valor correspondiente a la dirección desde la que se pueden colocar los datos. El valor al que apunta el puntero, es decir, los datos reales asignados al montón, se indica mediante el signo ^, que se coloca inmediatamente después del puntero. Si no hay ningún signo ^ después del puntero, significa la dirección donde se encuentran los datos. Tiene sentido volver a pensar en lo que acabamos de decir: el valor de cualquier puntero es una dirección, y para indicar que no estamos hablando de la dirección, sino de los datos que se encuentran en esa dirección, se coloca un ^ después del puntero (a veces esto se denomina puntero de desreferenciación).

Los datos asignados dinámicamente se pueden utilizar en cualquier parte del programa donde sean válidos para constantes y variables del tipo apropiado.

La memoria dinámica no solo se puede tomar del montón, sino también devolverla. Para hacer esto, use el procedimiento Desechar. Por ejemplo, los operadores

Disponer(pJ);

Disponer(pR);

devolverá al montón la memoria que se asignó previamente a los punteros pJ y pR (ver arriba).

Tenga en cuenta que el procedimiento Dispose (pPtr) no cambia el valor del puntero pPtr, sino que solo devuelve al montón la memoria previamente asociada con este puntero. Sin embargo, volver a aplicar el procedimiento a un puntero libre provocará un error de tiempo de ejecución. El programador puede marcar el puntero liberado con la palabra reservada nil.

1.5 Alias ​​de tipo

Para cualquier tipo puedes declarar tantos alias como quieras. Por ejemplo:

TMyInteger = Entero;

En el futuro, el alias se podrá utilizar de la misma forma que el tipo base:

Mylnt: TMyInteger;

Mylnt:= 2*Redondo(pi);

Este tipo de alias se suelen utilizar para mejorar la visibilidad del código del programa. Sin embargo, en Object Pascal puedes declarar alias fuertemente tipados agregando el tipo de palabra reservada antes del nombre del tipo base:

TMyIntegerType = tipo Entero;

MylntVar: TMyIntegerType;

Desde el punto de vista del compilador, los alias escritos son compatibles con el tipo base en varios tipos de expresiones, pero en realidad declaran un nuevo tipo de datos, por lo que no pueden usarse como parámetros formales para llamar a subrutinas en lugar del tipo base. Si, por ejemplo, se declara un procedimiento

función MylntFunc(APar: entero): Entero;

entonces tal apelación a ella

MylntFunc(MylntVar)

será considerado erróneo por el compilador.

Los alias fuertemente tipados obligan al compilador a generar información de tipo en tiempo de ejecución (RTTI). Esta información suele ser utilizada por el entorno Delphi para respaldar el funcionamiento de varios tipos de editores.




Arriba