¿Esto para que es? {$mode objfpc}{$H+}{$J-}
El compilador FPC tiene una serie de modos, el modo objfpc es uno de ellos y es probablemente el mas usado debido a que provee caracteristicas que son muy communes, por ejemplo "class". {$h+} selectiona "LONGSTRINGS ON" en ese modo, un string es un apuntador a un bloque de memoria manejado por el compilador que almacena los caracteres que forman el string. {$J-} le indica al compilador que no debe acceptar "constantes" que puedan ser escritas/modificadas.
He visto en la documentacion que para devolver un valor en una funcion utiliza 'result' pero yo aprendi que se usaba el mismo nombre de la funcion,¿cual es la forma correcta?
Las dos formas son correctas pero usar "result" es mas flexible porque si decides cambiar el nombre de la function, no tienes que cambiar cada linea donde la function is asignada un valor.
Me he quedado en la parte de los enumerados pero no me queda muy claro,estoy usando esto {$scopedenums on} para facilitar el uso del enumerado,no entiendo muy bien como usar esto.
Una enumeracion is simplemente un grupo de constantes. El nombre del group es el nombre de la enumeracion.
{$scopedenums on} cambia la forma de referirse a una constante. si esta "on", las constantes tienen que ser referidas con el nombre de la enumeracion (que identifica el grupo que contiene la constante.)
Es muy util, porque permite tener constantes con el mismo nombre. si scopedenums esta "off" no es possible usar un nombre para mas de una constante, el compilador se queja que hay un duplicado. si scopedenums esta "on" el compilador puede aceptar constantes con el mismo nombre siempre y cuando esten en differentes grupos/enumeraciones porque el nombre completo de la constante es <nombre de la enumeracion>.<nombre de la constante>.
type
TAnimalKind = (akDuck, akCat, akDog);
TAnimals = set of TAnimalKind;
TAnimalKind = (akDuck, akCat, akDog);
TAnimalNames = array [TAnimalKind] of string;
El compilador se va a quejar que TAnimalKind no es un nombre unico. Las definiciones que tienes alli tienen los significados siquientes:
TAnimalKind es un grupo de constantes. La constante akDuck es zero (en enumeraciones, el compilador empieza a asignar valores a partir de zero), akCat es 1 y akDog es 2.
TAnimals es un conjunto de TAnimalKind. Cuando akDog es anadido en un conjunto de TAnimals (una variable de tipo "TAnimals"), un bit que identifica que akDog es un miembro del conjunto es asignado el valor "1", si akDog es retirado del conjunto entonces ese bit es asignado zero. Un set es un grupo de bits que indica si un miembro esta or no esta en el conjunto.
TAnimalNames es un arreglo de "string". El arreglo esta "ordenado" por las constantes nombradas en TAnimalKind. Es decir, TAnimalNames[akDuck] identifica un string que contiene el nombre en caracteres que corresponde a akDuck (muy probablemente un string "Duck"), lo mismo para akCat, akDog.
lo que sigue es un programa muy corto que usa las definiciones que mostrates:
{$APPTYPE CONSOLE}
program DataTypes;
type
TAnimalKind = (akDuck, akCat, akDog);
TAnimals = set of TAnimalKind;
TAnimalNames = array [TAnimalKind] of string;
var
AnimalKind : TAnimalKind;
Animals : TAnimals = []; { vacio/empty }
AnimalNames : TAnimalNames = ('Duck', 'Cat', 'Dog');
begin
writeln;
AnimalKind := akCat;
Animals := [akDuck];
writeln(' akDog esta en el conjunto de animales ? ', akDog in Animals);
writeln(' akDuck esta en el conjunto de animales ? ', akDuck in Animals);
AnimalKind := akDog;
writeln;
writeln(' un akDog se llama un : ', AnimalNames[AnimalKind]);
writeln;
writeln('press ENTER/RETURN to end this program');
readln;
end.
HTH.