Guia de Referencia Rapida a MIkroC

Embed Size (px)

Citation preview

  • Si quiere saber ms de nuestros productos, por favor visite nuestra pgina web www.mikroe.com Si tiene problemas con cualquiera de nuestros productos o slo necesita informacin adicional, deje un ticket en www.mikroe.com/en/support Si tiene alguna pregunta, comentario o propuesta de negocio, pngase en contacto con nosotros [email protected]

    GUA DE REFERENCIA RPIDA AmikroC

  • 352

    La gua de referencia rpida mikroC proporciona definiciones formales de los elementoslxicos en los que consiste el lenguaje de programacin mikroC. Estos elementos sonpareciados a las unidades reconocidas por mikroC. Cada programa escrito en mikroCconsiste en las secuencias de los caracteres ASCII tales como letras, dgitos y signosespeciales. Los signos no imprimibles (por ejemplo: carcter nueva lnea, tabulador, etc)se refieren a los signos especiales tambin. Un conjunto de los elementos bsicos enmikroC es organizado y limitado. El programa se escribe en la ventana mikroC CodeEditor. Durante el proceso de compilacin se realiza el anlisis sintctico (parsing). Elparser debe identificar los tokens de forma que el cdigo fuente es tokenizado, es decir,reducido a tokens y espacios en blanco (whitespace).

    Espacio en blancoEl espacio en blanco (whitespace) es el nombre genrico dado a los espacios (en blanco),tabuladores horizontales y verticales y nueva lnea. Los espacios en blanco se utilizancomo separadores para indicar donde empiezan y terminan los tokens. Por ejemplo, lasdos secuencias:

    y

    son lxicamente equivalentes y se analizan idnticamente dando por resultado sietetokens cada uno:

    Espacio en blanco en las cadenas literalesCuando el espacio en blanco est dentro de una cadena literal no se utiliza como sepa-rador, sino que se interpreta como un carcter comn, esto es, como una parte de unasola cadena. Por ejemplo, la siguiente cadena:

    se descompone en cuatro tokens, con tal de que la cadena literal represente un token:

    Compilacin condicional Las directivas de compilacin condicional se utilizan generalmente para facilitar las mod-ificaciones y compilaciones de programas fuente en diferentes entornos de ejecucin.

    Directivas #if, #elif, #else, y #endif

    Las directivas condicionales #if, #elif, #else, y #endif se comportan igual que las senten-cias las sentencias condicionales comunes en mikroC. Si la expresin escrita despus de#if es cierta (tiene un valor distinto de cero), las lneas de cdigo que sigueninmediatamente a la directiva #if se retienen en la unidad de compilacin. La sintaxis es:

    Cada directiva #if en el cdigo fuente debe terminar por una directiva de cierre #endif.Puede haber cualquier nmero de #elif entre las directivas #if y #endif, pero slo se per-mite una directiva #else. La directiva #else, si est presente, precede a #endif.

    Directivas #ifdef y #ifndef

    Las directivas #ifdef y #ifndef son condicionales especializadas para comprobar si unidentificador est definido o no. La siguiente lnea:

    tiene exactamente el mismo efecto que #if 1 si el identificador est actualmente definido,o #if 0 si el identificador est actualmente indefinido. La directiva #ifndef comprueba lacondicin opuesta comprobada por #ifdef.

    char i;unsigned int j;

    chari ;

    unsigned int j;

    chari;unsignedintj;

    some_string = "mikro foo";

    some_string="mikro foo";

    Visin general de los elementos lxicos

    #if constant_expression_1

    [#elif constant_expression_2]

    ...[#elif constant_expression_n]

    [#else]

    #endif

    #ifdef identifier

  • TokensUn token es el elemento ms pequeo del lenguaje de programacin C reconocido porel compilador. El cdigo fuente es escaneado de izquierda a derecha. El analizador sin-tctico (parser) extrae los tokens, seleccionando el que coincida con la secuencia decaracteres ms larga posible dentro de la secuencia analizada.

    Palabras clave Las palabras clave o reservadas son los tokens que tienen el significado fijo y no sepueden utilizar como identificadores. Aparte da las palabras clave estndar en mikroChay un conjunto de identificadores predefinidos (de constantes y de variables) denomi-nados palabras reservadas. Ellas describen un microcontrolador especfico y no puedenser redefinidas. Lista alfabtica de las palabras clave en mikroC:

    3

    __asm_asmabsoluteasmatautobdata*bitbreakcasecdata*charcode*compact*constcontinuedata*defaultdeletedma*dodoubleelseenumexternfalse

    far*fdata*floatforgotoidata*ifilevel*intio*large*longndata*near*orgpascalpdata*registerreturnrx*sbitsfr*shortsignedsizeofsmall*

    staticstructswitchtypedefunionunsignedusingvoidvolatilewhilexdata*ydata*__automated**__cdecl**__export**__finally**__import**__pascal**__stdcall**__try**_cdecl**_export**_import**_pasclal**_stdcall**bool**

    catch**cdecl**inline**throw**true**try**class**explicit**friend**mutable**namespace**operator**private**protected**public**template**this**typeid**typename**virtual**

    * arquitectura dependiente

    ** reservado para la futura mejora

  • ComentariosLos comentarios son partes de programa utilizados para aclarar operaciones de progra-ma o para proporcionar ms informaciones sobre l. Son para uso exclusivo del progra-mador. Se eliminan del cdigo fuente antes del anlisis sintctico. Los comentarios enmikroC pueden ser unilneas o multilneas. Los multilneas estn entre llaves o /* y */como en el ejemplo a continuacin:

    Los cometarios unilneas empiezan por //. Ejemplo:

    Asimismo, los bloques de instrucciones del ensamblador pueden introducir los comen-tarios unilneas al colocar el signo ; delante del comentario:

    IdentificadoresLos identificadores son los nombres arbitrarios utilizados para identificar los objetosbsicos del lenguaje tales como: etiquetas, tipos, smbolos, constantes, variables, pro-cedimientos y funciones. Los identificadores pueden contener todas las letras mayscu-las y minsculas del abecedario (a a z, y A a Z), el guin bajo "_", y los dgitos 0 a 9. Elprimer carcter debe ser una letra o el guin bajo. mikroC no distingue maysculas yminsculas por defecto, as que Sum, sum y suM representan identificadores equiva-lentes. La distincin de maysculas y minsculas se puede habilitar/deshabilitar utilizan-do la opcin apropiada de mikroC IDE. Aunque los nombres de identificadores son arbi-trarios (de acuerdo con las reglas fijas), ocurre un error si se utiliza el mismo nombrepara ms de un identificador dentro del mismo mbito. Ejemplos de identificadores vlidos:

    y de identificadores invlidos:

    4

    /* Escriba su comentario aqu. Puede abarcar varias lneas */

    // Escriba su comentario aqu. // Puede abarcar una sla lnea.

    asm {some_asm ; Esta instruccin del ensamblador

    }

    temperature_V1Pressureno_hitdat2stringSUM3_vtext

    7temp // NO -- no puede empezar por un numeral %higher // NO -- no puede contener los caracteres especialesif // NO -- no puede coincidir con las palabras reservadasj23.07.04 // NO -- no puede contener los caracteres especiales (punto))

  • 5LiteralesLos literales son tokens que representan valores fijos y numricos o valores de carac-teres. El tipo de dato correspondiente a un literal es deducido por el compilador en basea indicios implcitos, como el valor numrico y formato usados en el cdigo fuente.

    Literales enterosLas constantes literales enteras pueden estar expresadas en los formatos hexadecimal(base 16), decimal (base 10), octal (base 8) o binario (base 2).

    4 Los literales enteros con el prefijo 0x (o 0X) se consideran nmeros hexadecimales. Por ejemplo, 0x8F

    4 En el formato decimal los literales enteros se representan como una secuencia de dgitos con el prefijo opcional + o - (no estn delimitados por coma, espacio enblanco o puntos). Si no se especifica el prefijo, el valor de la constante se considerapositivo. Por ejemplo, el nmero 6258 equivale a +6258.

    4 Las constantes literales enteras que empiezan con 0 se consideran nmeros octales. Por ejemplo, 0357.

    4 Las constantes con el prefijo 0b (o 0B) se consideran nmeros binarios. Por ejemplo, 0b10100101.

    Ejemplos de las constantes literales:

    El rango permitido para los literales enteros es determinado por el tipo long para los lit-erales con signo (signed) y por el tipo unsigned long para los literales sin signo(unsigned).

    Constantes literales de punto flotante (fraccionarias)Las constantes literales de punto flotante consisten en: 4 Parte entera;4 Punto decimal;4 Parte fraccionaria; y4 e/E y un entero con signo (exponente) Ejemplos de las constantes de punto flotante:

    Literales carcterUn literal carcter es una secuencia de caracteres ASCII delimitados por comillas simples.

    0x11 // literal hexadecimal equivale a literal decimal 1711 // literal decimal 011 // literal octal equivale a literal decimal 90b11 // literal binario equivale a literal decimal 3

    0. // = 0.0-1.23 // = -1.2323.45e6 // = 23.45 * 10^62e-5 // = 2.0 * 10^-53E+10 // = 3.0 * 10^10.09E34 // = 0.09 * 10^34

  • Cadenas literales (alfanumricas)Una cadena literal representa una secuencia de caracteres ASCII encerrados entrecomillas dobles. Como hemos mencionado, una cadena literal puede contener espacioen blanco. El parser no descompone las cadenas literales en tokens, sino que las inter-preta como una totalidad. La longitud de una cadana literal depende del nmero de car-acteres en los que consiste. Al final de cada cadena literal hay un carcter nulo (null),llamado el ASCII cero, que no cuenta en la longitud total de la cadena literal. Una cade-na literal que no contiene ningn signo entre comillas (cadena nula) se almacena comoun solo carcter nulo. Ejemplos de cadenas literales:

    Secuencias de escape El carcter barra invertida \ se uti-liza para introducir una secuenciade escape, que permite represen-tar visualmente ciertos caracteresque no tienen representacin grfi-ca. Una de las ms comunessecuencias de escape es el carc-ter nueva lnea \n. Una barrainvertida se utiliza con los nmerosoctales o hexadecimales para rep-resentar su smbolo ASCII. Latabla a la derecha muestra lassecuencias de escape vlidas.

    DisambiguacinAlgunas situaciones ambiguas pueden surgir cuando se utilizan secuencias de escape.Ver el ejemplo. La cadena literal se interpreta como \x09 y 1.0 Intro. Sin embrago,mikroC la compila como \x091 y .0 Intro.

    Para evitar estos problemas, podemos escribir el cdigo de la siguiente manera:

    Continuacin de lnea con barra invertida Una barra invertida \ se puede utilizar como carcter de continuacin de extender unacadena constante a travs de fronteras de lnea:

    6

    "Hola mundo!" // mensaje de 11 caracteres"La temperatura es estable" // mensaje de 25 caracteres" " // dos espacios de 2 caracteres"C" // letra C de 1 carcter"" // cadena nula de 0 caracteres

    Secuencia Valor Smbolo Que hace \a 0x07 BEL Timbre audible \b 0x08 BS Retroceso \f 0x0C FF Formfeed \n 0x0A LF Nueva lnea \r 0x0D CR Retorno decarro \t 0x09 HT Tabulador horizontal \v 0x0B VT Tabulador vertical \\ 0x5C \ Barra invertida \' 0x27 ' Comilla sencilla (Apstrofo) \" 0x22 " Comilla doble \? 0x3F ? Interrogacin \O cualquiera O = cadena de hasta tres

    dgitos octales \xH cualquiera H = cadena de dgitos

    hexadecimales \XH cualquiera H = cadena de dgitos

    hexadecimales

    Lcd_Out_Cp("\x091.0 Intro");

    Lcd_Out_Cp("\x09" "1.0 Intro")

    "Esto es realmente \una cadena de una lnea."

  • Constantes de enumeracin Las constantes de enumeracin son los identificadores definidos en declaraciones detipo enum. Por ejemplo:

    Los identificadores (enumeradores) utilizados deben ser nicos en el mbito de ladeclaracin enum. Se permiten los iniciadores negativos.

    PuntuadoresLos puntuadores utilizados en mikroC (conocidos como separadores) son:

    4 [ ] - corchetes;4 ( ) - parntesis;4 { } - llaves4 , - coma;4 ; - punto y coma ;4 : - dos puntos4 . - punto 4 * - asterisco4 = - signo igual4 # - almohadillaLa mayora de estos puntuadores tambin funcionan como operadores.

    CorchetesLos corchetes indican ndices de matrices uni y multi dimensionales:

    ParntesisLos parntesis () sirven para agrupar expresiones, aislar expresiones condicionales eindicar llamadas a funciones, y declaraciones de stas:

    7

    enum weekdays { SUN = 0, MON, TUE, WED, THU, FRI, SAT };

    char ch, str[] = "mikro";int mat[3][4]; /* matriz de 3 x 4 */ch = str[3]; /* cuarto elemento */

    d = c * (a + b); /* modifica la precedencia normal */if (d == z) ++x; /* expresin condicional */func(); /* llamada a funcin, sin parmetros */void func2(int n); /* declaracin de funcin, con parmetros */

  • 8LlavesLas llaves { } indican el inicio y el final de una sentencia compuesta:

    Una llave de cierre } se ultiliza como terminador en una sentencia compuesta. Por lotanto no se necesita el punto y coma despus de corchete de cierre, dejando aparte lasdeclaraciones en las estructruras.ComaLa coma , se utiliza para separar los parmetros en las llamadas a funcin, los identi-ficadores en las declaraciones y los elementos del inicializador:

    Punto y comaUn punto y coma ; es un terminador de sentencia. Cada expresin vlida en C (inluyen-do la vaca) seguida por un punto y coma se interpreta como una sentencia, conocidacomo sentencia de expresin. Un punto y coma se utiliza para indicar el inicio de loscomentarios en los bloques en ensamblador.

    Dos puntosDos puntos : se utilizan para indicar una etiqueta:

    PuntoUn punto . se utiliza para indicar el acceso a una estructura o a una unin de campo.Asimismo se puede utilizar para acceder a los bits particulares de registros en mikroC.Por ejemplo:

    Asterisco (Declaracin de punteros)Un asterisco * en una declaracin de variable indica la creacin de puntero a un tipo.Los punteros con niveles mltiples de indireccin pueden ser declarados al indicar unnmero apropiado de asteriscos:

    if (d == z) {++x;func();

    }

    Lcd_Out(1, 1, txt);char i, j, k;const char MONTHS[12] = (31,28,31,30,31,30,31,31,30,31,30,31);

    a + b; /* evala a + b, descarta el resultado */++a; /* efecto lateral en 'a', se descarta el valor ++a */; /* expresin vaca, o una sentencia nula */

    start: x = 0;...

    goto start;

    nombre.apellido = "Smith";

    char *char_ptr; /* declara puntero a carcter */

  • Signo igualEl signo igual = se utiliza para separar declaraciones de variables de las listas de ini-cializacin as como los lados izquierdo y derecho en las expresiones de asignacin

    Almohadilla (directiva de preproceso)La almohadilla (#) seala una directiva de preproceso cuando aparece en el primercarcter (distinto de espacio en blanco) de una lnea.

    Una declaracin introduce uno o ms nombres en un programa e informa al compiladorqu representa su nombre, de qu tipo es, cules operaciones se permiten, etc. Estecaptulo repasa los conceptos relacionados con declaraciones: declaraciones, defini-ciones, declaraciones de especificadores e inicializacin. Las entidades que se puedendeclarar incluyen: Variables; Constantes; Funciones; Tipos; Estructuras, uniones, y etiquetas de enumeraciones; Miembros de estructuras; Miembros de uniones; Otros tipos de matrices; Etiquetas de sentencias; yMacros de preprocesador.

    Declaraciones y definicionesAl definir las declaraciones, tambin conocidas como definiciones, adems de introducirel nombre de una entidad, se establece la creacin de la entidad. Puede haber muchasreferencias al mismo identificador, especialmente si el programa es multifichero, mien-tras que slo se permite una definicin para cada identificador. Por ejemplo:

    Declaraciones y declaradoresUna declaracin contiene especificadores seguidos por uno o ms identificadores(declaradores). Empieza con los especificadores opcionales de clase de almacenamien-to, especificadores de tipo u otros modificadores. Los identificadores se separan porcomas. La declaracin termina en un punto y coma:

    9

    int test[5] = { 1, 2, 3, 4, 5 };int x = 5;

    Declaraciones

    /* Definicin de variable i: */int i;/* La siguiente lnea es un error, i ya est definido!*/int i;

    clase-de-almacenamiento [cualificador-de-tipo] type var1 [=init1], var2 =init2], ... ;

  • 10

    Clase de almacenamientoUna clase de alacenamiento determina el mbito (visibilidad) y la duracin de variables y/o fun-ciones en un programa C. Las clases de almacenamiento que se pueden utilizar en un pro-grama C son: auto, register, static y extern.

    Auto El especificador de clase de almacenamiento auto declara una variable automtica (unavariable con duracin local). Una variable auto est visible slo dentro de bloque en elque est declarada. El especificador de clase de almacenamiento auto se refiere slo alos nombres de variables declaradas en un bloque o a los nombres de parmetros de fun-ciones. Sin embargo, estos nombres tienen almacenamiento automtico por defecto. Poresta razn el especificador de clase de almacenamiento auto es redundante con frecuen-cia en declaraciones de datos.

    RegisterEl especificador de clase de almacenamiento register se utiliza para definir las variableslocales que deben estar almacenadas en un registro en vez de en la RAM. Por elmomento, este modificador no tiene un significado especial en mikroC. MikroC simple-mente ignora solicitudes para la asignacin de registros.

    StaticEl especificador de clase de almacenamiento static permite definir variables o funcionescon el enlazado interno, lo que significa que cada parte de un identificador en particularrepresenta la misma varible o funcin dentro de un solo fichero. Adems, las variablesdeclaradas como static tienen una duracin de almacenamiento esttica, lo que quieredecir que tienen asignada una posicin de memoria desde el inicio de ejecucin de proga-ma hasta el final del mismo. La duracin de almacenamiento esttica de una variable esdiferente del mbito de fichero o global. Una variable puede tener duracin esttica y elmbito local.

    ExternEl especificador de clase de almacenamiento extern permite declarar objetos que sepueden utilizar en varios ficheros fuente. Una declaracin externa permite utilizar unavariable declarada en la siguiente parte del fichero fuente actual. La declaracin no susti-tuye la definicin. Se utiliza para describir una variable que est definida externamente.

    Una declaracin externa puede aparecer fuera de una funcin o en el principio de unbloque. Si la declaracin describe una funcin o aparece fuera de una funcin y describeun objeto con enlazado externo, la palabra clave extern es opcional.

    Si una declaracin para un identificador ya existe dentro del mbito de fichero, cualquierdeclaracin externa del mismo identificador encontrada dentro de un bloque se refiere almismo objeto. Si no hay otra declaracin para el identificador dentro del mbito defichero, el identificador tiene enlazado externo.

  • Cualificadores de tiposLos cualificadores de tipos en C aaden las propiedades especiales a las variables quese estn declarando. mikroC proporciona dos palabras clave: const y volatile.

    ConstEl cualificador const se utiliza para indicar que el valor de variable no puede ser cambi-ado. Su valor se establece en la inicializacin.

    VolatileEl cualificador volatile indica que los valores de variables pueden ser cambiados sinreparar en la interferencia de usuario en el programa. El compilador no debe optimizaresta variable.

    Especificador Typedef

    La declaracin typedef introduce un nombre que dentro del mbito se convierte en unsinnimo para el tipo especficado:

    Las declaraciones typedef se pueden utilizar para construir los nombres ms cortos ocon ms significado para los tipos que ya estn definidos por el lenguaje o por el usuario.Los nombres typedef permiten encapsular los detalles de implementacin que sepueden cambiar.

    A diferencia de las declaraciones class, struct, union y enum, las declaraciones typedefno introducen los tipos nuevos, sino los nombres nuevos para los tipos existentes.

    11

    typedef sinnimo;

  • 12

    Declaracin asmmikroC permite embeber las instrucciones del ensamblador en el cdigo fuente medi-ante la declaracin asm:

    Una sola instruccin del ensamblador puede ser embebida en el cdigo C:

    InicializacinEl valor inicial de un objeto declarado se puede establecer en el tiempo de declaracin.Este procedimiento es denominado inicializacin. Por ejemplo:

    mbito y visibilidad

    mbito (scope)El mbito de un identificador representa una regin de programa en la que se puede uti-lizar el identificador. Hay varias categoras del mbito lo que depende de cmo y dndese declaran los identificadores.

    Visibilidad (visibilidad)Similar al mbito, la visibilidad representa una regin de programa en la que se puedeutilizar el identificador dado. mbito y visibilidad coinciden generalmente, si bien puedendarse circunstancias en que un objeto puede aparecer invisible temporalmente debido ala presencia de un identificador duplicado (un identificador del mismo nombre, pero delmbito diferente). El objeto existe, pero el identificador original no puede ser utilizadopara accederlo hasta que el identificador duplicado es terminado. La visibilidad no puedeexceder al mbito, pero ste puede exceder a la visibilidad.

    asm {bloque de instrucciones del ensamblador

    }

    asm instruccin del ensamblador;

    int i = 1;char *s = "hello";struct complex c = {0.1, -0.2};// donde 'complex' es una estructura que contiene dos objetos de tipofloat

  • 13

    mikroC es estrictamente un lenguaje de tipo, lo que significa que cada variable o con-stante son de tipo definido antes de que se inicie el proceso de compilar. Al comprobarel tipo no es posible asignar o acceder incorrectamente a objetos.

    mikroC soporta los tipos de datos estndar (predefinidos) tales como los tipos enteroscon signo o sin signo de varios tamaos, matrices, punteros, estructuras y uniones etc.Adems, el usuario puede definir nuevos tipos de datos al utilizar el especificador type-def. Por ejemplo:

    Tipos aritmticosLos especificadores de tipos aritmticos incluyen las siguientes palabras clave: void,char, int, float y double, precedidas por los siguientes prefijos: short (corto), long (largo),signed (con signo) y unsigned (sin signo). Hay dos tipos aritmticos, el tipo entero y elde punto flotante.

    Tipos enterosLos tipos char e int, junto con sus variantes se consideran los tipos de datos enteros.Sus formas se crean utilizando uno de los siguientes prefijos de los modificadores short,long, signed y unsigned. La tabla ms abajo representa las caractersticas principales detipos enteros. Palabras clave entre parntesis pueden ser omitidas (con frecuencia).

    Tipos

    typedef char MyType1[10];typedef int MyType2;typedef unsigned int * MyType3;typedef MyType1 * MyType4; MyType2 mynumber;

    Tipo Tamao en bytes

    Rango

    (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295

  • 14

    Tipos de punto flotante (fraccionarios)Los tipos de punto flotante float y double junto con el tipo long double se consideran tiposde punto flotante. En la tabla ms abajo se muestran las caractersticas principales delos tipos de punto flotante:

    EnumeracionesEl tipo de datos de enumeracin se utiliza para representar un conjunto de valoresabstracto y discreto, con los nombres simblicos apropiados. La enumeracin se declarade la siguiente manera:

    Tipo VoidEl tipo Void es un tipo especial que indica la ausencia de valor. No hay objetos de void;En vez de eso, el tipo void se utiliza para derivar los tipos ms complejos.

    Tipo Tamao en bytes Rango

    float 4 -1.5 * 1045 .. +3.4 * 1038 double 4 -1.5 * 1045 .. +3.4 * 1038 long double 4 -1.5 * 1045 .. +3.4 * 1038

    enum colores { negro, rojo, verde, azul, violeta, blanco } c;

    void print_temp(char temp) {Lcd_Out_Cp("Temperature:");Lcd_Out_Cp(temp);Lcd_Chr_Cp(223); // carcter de gradoLcd_Chr_Cp('C');

    }

  • 15

    PunterosUn puntero es una variable cuyo fin especfico es almacenar direcciones de memoria deobjetos. Una variable accede directamente a la direccin de memoria mientras que elpuntero puede ser pensado como una referencia a la direccin. Los punteros se declar-an de la manera similar a cualquier otra variable, con un asterisco * delante del identifi-ador. Los punteros deben ser inicializados antes de que se utilicen. Por ejemplo, paradeclarar un puntero a un objeto de tipo int es necesario escribir:

    Para acceder al dato almacenado en la locacin de memoria a la que apunta un pun-tero, es necesario aadir el prefijo * al nombre del puntero. Por ejemplo, vamos adeclarar la variable p que apunta a un objeto de tipo unsigned int, y luego vamos a asig-narle el valor 5 al objeto:

    Un puntero se puede asignar al otro puntero del tipo compatible, as que los dos apun-tarn a la misma locacin de memoria. Al modificar el objeto al que apunta un puntero,ser modificado automticamente el objeto al que apunta otro puntero, porque com-parten la misma locacin de memoria.

    Punteros nuloUn puntero nulo tiene un valor reservado que es frecuentemente pero no necesaria-mente el valor nulo, lo que indica que no se refiere a ningn objeto. Asignar la constanteentera 0 a un puntero significa asignarle un valor nulo.

    El puntero a void se difiere del puntero nulo. La siguiente declaracin declara vp comoun puntero genrico capaz de ser asignado por cualquier valor del puntero, incluyendovalor nulo.

    int *nombre_del_puntero; /* Puntero no inicializado */

    unsigned int *p;...*p = 5;

    int *pn = 0; /* Aqu est un puntero nulo */

    /* Podemos probar el puntero de la siguiente manera */if ( pn == 0 ) { ... }

    void *vp;

  • 16

    Punteros a funcionesComo indica su nombre, los punteros a funciones son los punteros que apuntan a fun-ciones.

    int addC(char x,char y){return x+y;

    }int subC(char x,char y){

    return x-y;}int mulC(char x,char y){

    return x*y;}

    int divC(char x,char y){return x/y;

    }

    int modC(char x,char y){return x%y;

    }// matriz de puntero a funciones que recibe dos tipos chars y devuelve eltipo intint (*arrpf[])(char,char) = {addC, subC, mulC, divC, modC};int res;char i;void main() {

    for (i=0;i

  • 17

    EstructurasLa estructura es un tipo derivado que generalmente representa un conjunto de los miem-bros nombrados (o de las componentes) definido por el usuario. Estos miembros puedenser de cualquier tipo. Declaracin e inicializacin de estructurasLas estructuras se declaran mediante la palabra clave struct:

    En este ejemplo, la etiqueta tag es el nombre de estructura; lista-de-declaradores-de-miembros es una lista de miembros de estructura, o sea, una lista de declaraciones devariables. Las variables de tipo estructurado se declaran de la misma forma que las vari-ables de cualquier otro tipo.Declaraciones incompletasLas declaraciones incompletas son conocidas tambin como declaraciones anticipadas o ade-lantadas. Un puntero a un tipo de estructura puede aparecer regularmente en la declaracin deotro tipo de estructura an antes de que el tipo de estructura apuntada haya sido declarado.

    La primera aparicin de A se denomina incompleta porque todava no existe definicin paraella. Una declaracin incompleta sera correcta aqu ya que la definicn de B no requiere cono-cer el tamao de A.

    Estructuras sin nombres y TypedefsSi se omite el nombre de estructura, aparece una estructura sin nombre. Las estructuras sinnombres pueden utilizarse para declarar identificadores en la lista-de-declaradores-de-miembros-delimitados por comas para que sean (o deriven) del tipo de estructura dado. Los objetos adicionales no se pueden declarar en ningn otro sitio. Es posible crear un type-def al mismo tiempo que se declara una estructura, con o sin nombre:

    Tamao de estructuraEl tamao de estructura en la memoria se puede determinar mediante el operador size-of. No es necesario que el tamao de la estructura sea igual a la suma de tamaos desus miembros. A menudo es ms grande debido a ciertas limitaciones de almacenamientode memoria.

    struct tag {lista-de-declaradores-de-miembros};

    struct A; // declaracin incompletastruct B {struct A *pa;};struct A {struct B *pb;};

    /* Con nombre: */typedef struct mystruct { ... } Mystruct;Mystruct s, *ps, arrs[10]; /* igual que struct mystruct s, etc. */

    /* Sin nombre: */typedef struct { ... } Mystruct;Mystruct s, *ps, arrs[10];

  • 18

    AsignacinLas variables del mismo tipo estructurado pueden ser asignadas una a otra mediante eloperador de asignacin simple (=), lo que copiar todo el contenido de variables a susdestinaciones a pesar de la complejidad interior de la estructura. Fjese que dos vari-ables son del mismo tipo de estructura si las dos estn definidas por la mismadeclaracin o utilizando el mismo identificador de tipos. Por ejemplo:

    Acceso a miembros de estructurasPara acceder a los miembros de estructuras y uniones se utilizan las dos siguientesoperadores de seleccin:. (punto); y-> (flecha a la derecha).

    El operador . se llama selector directo de miembro. Se utiliza para acceder directa-mente a uno de miembros de estructura.

    El operador -> se llama el selector indirecto (de puntero) de miembro.

    Tipos de unionesLos tipos de uniones son los tipos derivados, con cierta similitud sintctica y funcionalcon los tipos de estructura. La diferencia principal es que los miembros de uniones com-parten el mismo espacio de memoria.

    Declaracin de unionesLas uniones tienen la misma declaracin que las estructuras, con la palabra clave unionutilizada en vez de struct:

    /* a and b are of the same type: */struct {int m1, m2;} a, b;

    /* Pero c y d no _son_ del mismo tipo aunque las descripciones de susestructuras son idnticas: */struct {int m1, m2;} c;struct {int m1, m2;} d;

    s.m // direct access to member m

    ps->m // acceso indirecto a miembro m;// igual que (*ps).m

    etiqueta de unin {lista-de-declaradores-de-miembros};

  • 19

    Campos de bitsLos campos de bits son grupos de un nmero determinado de bits, que pueden o notener un identificador asociado. Los campos de bits permiten subdividir las estructurasen las partes nombradas de tamaos definidos por el usuario.

    Declaracin de campos de bitsLos campos de bits se pueden declarar slamente en las estructuras y uniones. Laestructura se declara normalmente y se le asignan los campos individuales de la sigu-iente manera (los campos deben ser de tipo unsigned):

    Es este ejemplo, la etiqueta tag es el nombre opcional de la estructura mientras quelista-de-declaradores-de-campos-de-bits es la lista de campos de bits. Cada identifi-cador de campos de bits requiere dos puntos y su ancho en bits tiene que ser especifi-cado explcitamente.

    Acceso a los campos de bitsA los campos de bits se les puede acceder de la misma manera que a los miembros deestructura utilizando el selector directo e indirecto de miembro . y ->.

    struct tag {lista-de-declaradores-de-campos-de-bits sin signo;

    }

    // Este ejemplo escribe la estructura Value_For_PORT0 to P0struct myPort {lo_nibble :4;hi_nibble :4;

    } Value_For_PORT0;

    void main() {...Value_For_PORT0.lo_nibble = 7;Value_For_PORT0.hi_nibble = 0x0C;P0 = *(char *) (void *)&Value_For_PORT0;

    // typecasting :// 1. dirrecin de estructura a puntero a void // 2. puntero a void a puntero a char// 3. dereferenciar para obtener el valor

    }

  • 20

    MatricesLa matriz es el tipo estructurado ms simple y ms utilizado. Una variable de tipo dematriz es realmente una matriz de los objetos del mismo tipo. Estos objetos son los ele-mentos de una matriz identificados por su posicin en la misma. Una matriz representauna zona de almacenamiento contiguo, suficiente grande para contener todos sus elementos.

    Declaracin de matricesLa declaracin de matrices es similar a la declaracin de variables, con los corchetes aa-didos despus del identificador:

    Una matriz nombrada como nombre_de_matriz y compuesta de los elementos detipo_de_elemento se declara aqu. El tipo_de_elemento puede ser de cualquier tipoescalar a excepcin de void, tipo definido por el usuario, puntero, enumeracin u otramatriz. El resultado de la constante - expresin entre corchetes determina un nmero deelementos de la matriz. Ejemplos de la declaracin de matrices:

    Inicializacin de matricesUna matriz puede ser inicializada en la declaracin al asignarle una secuencia de val-ores delimitados por comas, entre llaves. Al inicializar una matriz en la declaracin, sepuede omitir el nmero de elementos puesto que ser determinado automticamente abase del nmero de los elementos asignados. Por ejemplo:

    Matrices multidimensionales Una matriz es unidimensional si es de tipo escalar. A veces las matrices unidimension-ales se denominan vectores. Las matrices multidimensionales se crean al declarar matri-ces de tipo matriz. El ejemplo de una matriz bidimensional:

    La variable m representa una matriz de 50 elementos. Cada uno representa una matrizde los elementos de tipo char. As es creada una matriz de 50x20 elementos. El primerelemento es m[0][0], mientras que el ltimo es m[49][19]. Una matriz multidimensional se puede inicializar con un conjunto de valores apropiadoentre corchetes. Por ejemplo:

    tipo_de_elemento nombre_de_matriz [constante-expresin];

    #define MAX = 50int vector_one[10]; /* declara una matriz de 10 elementos enteros */float vector_two[MAX]; /* dem de 50 elementos flotantes */float vector_three[MAX - 20]; /* dem de 30 elementos flotantes */

    /* Declarar una matriz que contiene el nmero de das de cada mes */int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

    char m[50][20]; /* matriz bidimensional de tamao 50x20 */

    int a[3][2] = {{1,2}, {2,6}, {3,7}};

  • 21

    La conversin es un proceso de cambiar el tipo de variable. mikroC soporta las conver-siones implcita y explcita.

    Conversin implcitaLa conversin automtica de un valor de un tipo de datos al otro por un lenguaje de pro-gramacin, sin hacerlo especficamente por el programador, es denominada conversinde tipos implcita. El compilador realiza la conversin implcita en los siguientes casos:

    4 Un operando est preparado para una operacin aritmtica o lgica;4 Una asignacin se ha hecho a un valor de un tipo diferente del valor asignado;4 Una funcin est proporcionada con el valor de argumento que es de un tipo diferente

    del parmetro;4 El valor devuelto de la funcin es de tipo diferente del tipo de valor que debe ser

    devuelto (tipo de valor devuelto predefinido).

    PromocinCuando los operandos son de tipos diferentes, mediante la conversin implcita se real-iza la promocin de tipo ms bajo a tipo ms alto, de la siguiente manera:

    short int, long, float, or doublechar int, long, float, or doubleint long, float, or doublelong float or double

    Los bytes ms altos del operando sin signo extendido se llenan de ceros. Los bytes msaltos del operando con signo extendido se llenan del signo de bit. Si el nmero es negativo,los bytes ms altos se llenan de unos, de lo contrario se llenan de ceros. Por ejemplo:

    RecorteEn las sentencias de asignacin y en las sentencias que requieren una expresin de tipoparticular, el valor correcto ser almacenado en el destino slo si el resultado de expre-sin no excede al rango del destino. Por el contrario, los datos que sobran, o sea, losbytes ms altos se pierden.

    Conversin de tipos

    char a; unsigned int b;...a = 0xFF;b = a; // promocin de a a unsigned int, b equivale a 0x00FF

    char i; unsigned int j;...j = 0xFF0F;i = j; // i obtiene el valor 0x0F, byte ms alto 0xFF se pierde

  • 22

    Conversin explcitaLa conversin explcita se puede realizar sobre cualquier expresin al utilizar el operadorunitario de conversin de tipos. Un caso especial es conversin entre los tipos con signoy sin signo.

    Tal conversin explcita no cambia la representacin binaria de los datos. Por ejemplo:La conversin explcita no se puede realizar sobre el operando que est a la izquierda del

    operador de asignacin:

    Ejemplo de la conversin explcita:

    short b;char a;...b = -1;a = (char)b; // a es 255, no 1

    //Es porque el dato se queda en la representacin binaria// 11111111; pero el compilador la interpreta de la manera diferente

    char a, b, c; unsigned int cc;...a = 241;b = 128;c = a + b; // es igual a 113c = (unsigned int)(a + b); // es igual a 369cc = a + b; // es igual a 369

    (int)b = a; // Compilador informa acerca de un error

  • 23

    Las funciones son los subprogramas que realizan ciertas tareas a base de variosparmetros de entrada. Las funciones pueden devolver un valor despus de la ejecu-cin. La funcin devuelve un valor despus de la ejecucin. El valor devuleto de la fun-cin se puede utilizar en las expresiones. Una llamada a funcin se considera una expre-sin como cualquier otra. Cada programa debe tener una sola funcin llamada main quemarca el punto de entrada del programa.Las funciones se pueden declarar en los ficheros de cabecera estndar o proporciona-dos por el usuario, o dentro de ficheros de programa.Declaracin de funcinLas funciones se declaran en los ficheros fuentes del usuario o se ponen disponibles alenlazar las libreras precompiladas. La sintaxis de declaracin de funcin es:

    nombre_de_funcin representa el nombre de funcin y debe ser un identificador vlido. tipo_de_resultado representa el tipo del resultado de funcin que puede ser cualquiertipo estndar o definido por el usuario.

    Prototipos de funcinUna funcin puede ser definida slo una vez en el programa, pero puede ser declarada variasveces, en el supuesto de que las declaraciones sean compatibles. Los parmetros puedentener los nombres diferentes en las declaraciones diferentes de la misma funcin:

    Definicin de funcinLa definicin de funcin consiste en su declaracin y su cuerpo. El cuerpo de funcin es realmente un bloque - una secuencia de las definiciones locales y sentencias encer-radas entre corchetes {}. Todas las variables declaradas dentro del cuerpo de funcinson locales a la funcin, o sea, tienen el mbito de funcin. Ejemplo de una definicinde funcin:

    Funciones

    tipo_de_resultado nombre_de_funcion name(lista-de-declaradores-de-parmetros));

    /* Aqu estn dos prototipos de la misma funcin: */

    int test(const char*) /* declara la pruba de funcin */int test(const char*p) /* declara la misma prueba de funcin */

    /* la funcin max devuelve el mayor argumento: */

    int max(int x, int y) {return (x>=y) ? x : y;

    }

  • 24

    Llamada a funcinUna llamada a funcin se realiza al especificar su nombre seguido por los parmetrosactuales colocados en el mismo orden que los parmetros formales correspondientes.Si hay una llamada a funcin en una expresin, el valor devuelto de funcin se utilizarcomo un operando en dicha expresin.

    Cada expresin en la llamada a funcin es un argumento actual.

    Conversin de argumentosEl compilador es capaz de forzar a los argumentos cambiar su tipo en otro adecuado deacuerdo con las reglas de conversin implcita.

    Ya que el programa tiene el prototipo de funcin func, convierte limit y ch en long, utilizan-do las reglas estndar de asignacin antes de pasarlos al parmetro formal apropiado.

    Operador EllipsisEl operador ellipsis ... consiste en tres puntos sucesivos sin intervencin de espaciosen blanco. Un ellipsis se puede utilizar en las listas de argumentos formales de prototi-pos de funciones para indicar un nmero variable de argumentos o de argumentos contipos distintos. Por ejemplo:

    Esta declaracin indica que func se define de tal manera que las llamadas tengan oblig-atoriamente por lo menos dos argumentos (int y char), pero tambin pueden tenercualquier nmero de argumentos adicionales.

    nombre_de_funcin (expresin_1, ... , expresin_n);

    int limit = 32;char ch = 'A';long res;

    // prototipoextern long func(long par1, long par2);

    main() {...res = func(limit, ch); // llamada a funcin

    }

    void func (int n, char ch, ...);

  • 25

    Los operadores son un tipo de tokens que indican las operaciones que se realizan sobrelos operandos en una expresin. Si el orden de ejecucin de operaciones no es deter-minado explcitamente madiante parntesis, lo determinar el operador de precedencia.

    Presedencia y asociatividad de operadoresHay 15 categoras de presedencia en mikroC. Los operadores de la misma categoratienen igual presedencia. Cuando aparecen operadores duplicados en la tabla, el oper-ador de la precedencia ms alta es unitario. Cada categora tiene una regla de asocia-tividad: de izquierda a derecha o de derecha a izquierda. En ausencia de parntesis,estas reglas se aplican al agrupar las expresiones con operadores de igual presedencia.

    Operadores

    4 Operadores aritmticos 4 Operador de asignacin 4 Operador de manejo de bits4 Operadores lgicos4 Operadores de indireccin/referencia4 Operadores relacionales4 Selectores de miembros de estruc-

    tura

    4 Operador coma, 4 Operador condicional ? : 4 Operador de subndice de matriz [] 4 Operador de llamada a funcin () 4 Operador Sizeof4 Operadores de preproceso # y ##

  • 26

    Operadores aritmticosLos operadores aritmricos se utilizan para realizar las operaciones matemticas. Todos losoperadores aritmticos se asocian de izquierda a derecha.

    Operadores relacionesLos operadores relacionales se utilizan para com-probar la veracidad o falsedad de expresiones. Siuna expresin es cierta, devuleve 1, al contrariodevuleve 0. Todos los operadores relacionales seasocian de izquierda a derecha. Opedarodes de manejo de bits Los operadores de manejo de bits se utilizan para modificar los bits individuales de unoperando. Los operadores de manejo de bits realizan desplazamiento de izquierda aderecha. La nica excepcin es el complemento a uno ~ que realiza desplazamiento dederecha a izquierda.

    Operador Operacin Precedencia Operadores binarios

    + suma 12

    - resta 12

    * multiplicacin 13

    / divisin 13

    % Operador de mdulo devuelve el resto de la divisin de enteros (no puede ser utilizado con nmeros fraccionarios)

    13

    Operadores unitarios + Ms unitarios no afecta al operando 14

    - Menos unitario cambia el signo del operando 14

    ++

    El incremento aade uno al valor del operando. El postincremento aade uno al operando despus de que haya sido evaluado, mientras que el preicremento aade uno antes de la evaluacin del operando.

    14

    --

    El decremento resta uno del valor del operando. El postdecremento resta uno del valor del operando despus de que haya sido evaluado, mientras que el predecremento resta uno antes de la evaluacin del operando.

    14

    Operador Operacin Precedencia== igual que 9 != desigual que 9 > mayor que 10 < menor que 10

    >= mayor o igual que 10 Desplazamiento a derecha; desplaza los bits a derecha, el bit ms a la derecha se pierde y se le asigna un 0 al bit ms a la izquierda, en caso contrario el signo de byte no cambia.

    11

  • 27

    Operadores lgicosLos operandos de las operaciones lgicas se consideranciertos o falsos, segn su valor sea 0 o distinto de 0. Losoperadores lgicos siempre devuleven 1 o 0. Los oper-adore lgicos && y || se asocian de izquierda a derecha.Operador de negacin lgica ! se asocia de derecha aizquierda.

    Operador condicional El operador condicional ?:es el nico operador ternario en mikroC. La sintaxis del oper-ador condicional es:

    expresin1 se evala primero. Si el resultado es cierto, entonces se evala la expre-sin2, mientras que la expresin3 se ignora. Si expresin1 resulta falsa se evala laexpresin2 mientras que la expresin2 se ignora. El resultado ser el valor de la expre-sin2 o la expresin3, dependiendo de cul se evala.

    Operador de asignacin simpleEl operador se asignacin simple = se utiliza para la asignacin de valor comn:

    expression1 es un objeto (locacin de memoria) al que se le asigna el valor de la expre-sin2.

    Operador de asignacin compuestamikroC permite la asignacin ms compleja por medio del operador de asignacin com-puesta. La sintaxis de asignacin compuesta es:

    donde op puede ser uno de los operadores binarios +, -, *, /, %, &, |, ^, .

    La asignacin compuesta ms arriba es una forma corta de la siguiente expresin:

    expresin1 ? expresin2 : expresin3;

    expresin1 = expresin2;

    expresin1 op= expresin2;

    expresin1 = expresin1 op expresin2;

    Operador Operacin Precedencia

    && Y lgico (AND) 5

    || O lgico (OR) 4

    ! negacin lgica 14

  • 28

    Operadores de desplazamiento de bitsHay dos operadores de desplazamiento de bits en mikroC. Son el operador > que realiza un desplaza-miento de bits a la derecha. Cada uno de los operadores tiene dos operandos. Eloperando izquierdo es un objeto que se desplaza, mientras que el derecho indica elnmero de desplazamientos que se realizarn. Los dos operandos deben ser de tipointegral. El operando derecho debe ser el valor positivo. Al desplazar a la izquierda losbits que salen por la izquierda se pierden, mientras que los nuevos bits a la derecha serellenan con ceros. Por lo tanto, el desplazamiento del operando sin signo a la izquier-

    da por n posiciones equivale a multiplicarlo por 2n

    si todos los bits descartados sonceros. Lo mismo se puede aplicar a los operandos con signo si todos los bits descarta-dos son iguales que el signo de bit. Al desplazar a la derecha los bits que salen por laderecha se pierden, mientras que los nuevos bits a la izquierda se rellenan con ceros(en caso del operando sin signo) o con el signo de bit (en caso del operando con signo).El desplazamiento del operando a la derecha por n posiciones equivale a dividirlo por 2n.

    Una expresin es una secuencia de operadores, operandos y puntuadores que devuel-ven un valor. Las expresiones primarias son: literales, constantes, variables y llamadasa funcin. Se pueden utilizar para crear las expresiones mas complejas por medio deoperadores. La forma de agrupacin de los operandos y de las subexpresiones no rep-resenta obligatoriamente el orden en el que se evalan en mikroC.

    Expresiones con coma Una caracterstica especial en mikroC es que permite utilizar coma como operador desecuencias para formar as llamadas expresiones con coma o secuencias. En la sigu-iente secuencia:

    cada expresin se evala de izquierda a derecha. El valor y el tipo de la expresin concoma equivale al valor y al tipo de expresin_n.

    Operador Operacin Precedencia

    > Desplazamiento a derecha 11

    Expresiones

    expresin_1, expresin_2, ... expresin_n;

  • 29

    Las sentencias especifican y controlan el flujo de ejecucin del programa. En ausenciade las sentencias de salto y de seleccin, las sentencias se ejecutan en el orden de suaparicin en el cdigo de programa. En lneas generales, las sentencias se puedendividir en:

    Sentencias de etiquetaCada sentencia en programa puede ser etiquetada. Una etiqueta es un identificadorcolocado delante de la sentencia de la siguiente manera:

    La misma etiqueta no se puede redefinir dentro de la misma funcin. Las etiquetas tienen sus pro-pios espacios de nombres y por eso el identificador de etiqueta puede corresponder a cualquier otroidentificador en el programa.

    Sentencias de expresinCualquier expresin seguida por punto y coma forma una sentencia de expresin:

    Un caso especial es la sentencia nula; consiste en un solo punto y coma (;). Una sen-tencia nula se utiliza con frecuencia en los bucles vacos:

    Sentencias

    4 Sentencias de etiqueta;4 Sentencias de expresin; 4 Sentencias de seleccin;

    4 Sentencias de iteracin (Bucles); 4 Sentencias de salto; y4 Sentencias compuestas (Bloques).

    identificador_de_etiqueta: sentencia;

    expresin;

    for (; *q++ = *p++ ;); /* el cuerpo de este bucle es una sentencia nula */

  • 30

    Sentencias condicionalesLas sentencias condicionales o las sentencias de seleccin permiten decidir entre distin-tos cursos de accin en funcin de ciertos valores.

    Sentencia If La sentencia If es una sentencia condicional. La sintaxis de la sentencia if es la siguiente:

    Si some_expression se evala como cierta, se ejecuta statement1. Por el contrario, seejecuta statement2. La palabra clave else con la sentencia alternativa (statement2) esopcional.

    Sentencias If anidadas Sentencias If anidadas requieren atencin especial. La regla general es que se descom-ponen empezando por la sentencia If ms interior (ms anidada), mientras que cadasentencia else se relaciona con la If ms cercana y disponible a su izquierda:

    Sentencia SwitchLa sentencia switch es una sentencia condicional de ramificacin mltiple, basada enuna cierta condicin. Consiste en una sentencia de control (selector) y una lista de losvalores posibles de la expresin. La sintaxis de la sentencia switch es la siguiente:

    Primero se evala la expression (condicin). Entonces la sentencia switch la compara contodas las constantes-expresiones disponibles que siguen la palabra clave case. Si hay unacoincidencia, switch pasa el control a la constante-expresin correspondiente despus deque se ejecuta la siguiente sentencia.

    if some_expression statement1; [else statement2;]

    if (expression1) statement1;else if (expression2)if (expression3) statement2;else statement3; /* esto pertenece a: if (expression3) */else statement4; /* esto pertenece a: if (expression2) */

    switch (expression) {case constant-expression_1 : statement_1;

    ...case constant-expression_n : statement_n;[default : statement;]

    }

  • 31

    Sentencias de iteracinLas sentencias de iteracin permiten repetir un conjunto de sentencias.

    Sentencia ForLa sentencia for se utiliza para implementacin del bucle iterativo cuando el nmero deiteraciones est especificado. La sintaxis de la sentencia for es la siguiente:

    Antes de la primera interacin del bucle, init-expression pone las variables a los valoresiniciales. En init-expression no es posible declarar. Condition-expression se compruebaantes de la primera ejecucin del bloque. La sentencia for se ejecuta repetidamentehasta que el valor de condition-expression sea falso. Despus de cada iteracin delbucle, increment-expression incrementa el contador de bucle.Ejemplo de calcular el producto escalar de dos vectores, utilizando la sentencia for:

    Sentencia WhileLa sentencia while se utiliza para implementacin del bucle iterativo cuando el nmerode iteraciones no est especificado. Es necesario comprobar la condicin de iteracinantes de la ejecucin del bucle. La sintaxis de la sentencia while es la siguiente:

    La sentencia some_stat se ejecuta repetidamente siempre que el valor de la expresincond_exp sea cierto. El valor de la expresin se comprueba antes de que se ejecute lasiguiente iteracin. Por eso, si el valor de la expresin es falso antes de entrar el bucle,no se ejecutar ninguna iteracin, Probablemente la forma ms simple de crear un bucleinfinito sea la siguiente:

    Sentencia Do La sentencia do se utiliza para implementacin del bucle iterativo cuando el nmero deiteraciones no es especificado. La sentencia se ejecuta repetidamente hasta que laexpresin sea cierta La sintaxis de la sentencia do es la siguiente:

    La sentencia some_stat se ejecuta repetidamente hasta que el valor de la expresincond_exp llegue a ser cierto. La expresin se evala despus de cada iteracin as queel bucle ejecutar la sentencia por lo menos una vez.

    for ([init-expression]; [condition-expression]; [increment-expression]) statement;

    for ( s=0, i=0; i

  • 32

    Sentencias de salto mikroC soporta las siguientes sentenicas de salto: break, continue, return and goto.

    Sentencia Break Aveces es necesario detener el bucle dentro del cuerpo. La sentencia break dentro de buclesse utiliza para pasar el control a la primera sentencia despus del bucle respectivo. La sen-tencia break se usa con frecuencia en las sentencias switch para detener su ejecucindespus de que ocurra la primera coincidencia positiva. Por ejemplo:

    Sentencia ContinueLa sentencia continue dentro del bucle se utiliza para iniciar una nueva iteracin delbucle. Las sentencia que siguen la sentencia continue no se ejecutarn.

    Sentencia Return La sentencia return se utiliza para salir de la funcin actual devolviendo opcionalmenteun valor. La sintaxis es:

    La expresin se evala y devuelve el resultado. El valor devuelto se convierte automti-camante en el tipo de funcin esperado, si es necesario. La expresin es opcional.

    switch (state) {case 0: Lo(); break;case 1: Mid(); break;case 2: Hi(); break;default: Mensaje("estado invlido!");

    }

    while (..) {...if (val>0) continue;...// continue salta aqu}

    do {...if (val>0) continue;...// continue salta aquwhile (..);

    for (..;..;..) {...if (val>0) continue;...// continue salta aqu}

    return [expresin];

  • 33

    Sentencia Goto La sentencia goto se utiliza para saltar de forma incondicional a la parte apropiada deprograma. La sintaxis de la sentencia goto es:

    Esta sentencia ejecuta un salto a la etiqueta identificador_de_etiqueta. La sentenciagoto puede estar delante o detrs de la declaracin de la etiqueta. La declaracin de eti-queta y la sentencia goto deben pertenecer a la misma rutina. Por consiguiente, no esposible saltar a un procedimiento o una funcin o de ellos. La sentencia goto se puedeutilizar para salir de cualquier nivel de las estructuras anidadas. No es recomendablesaltar a bucles u otras sentencias estructuradas, ya que se pueden producir resultadosinesperados. En general no es recomendable utilizar la sentencia goto dado que prcti-camente cada algoritmo se puede realizar sin ella dando los programas estructuradoslegibles. No obstante, la sentencia goto es til para salir de las estructuras de control profunda-mente anidadas.

    El preprocesador es un procesador de texto integrado que prepara el cdigo fuente parala compilacin. El preprocesador permite: 4 insertar un texto de un fichero especfico en un punto determinado en el cdigo.

    (Inclusin de ficheros)4 sustituir los smbolos lxicos especficos por otros smbolos (Macros); y4 compilacin condicional que incluye u omite condicionalmente las partes del cdigo

    (compilacin condicional)

    Directivas de preprocesoCualquier lnea en el cdigo fuente precedida por el smbolo # se considera directiva depreproceso (o una lnea de control), a menos que # est incluido en una cadena literal,una constante carcter o integrado en un comentario. mikroC soporta las directivas depreproceso estndar:

    # (null directive) #error #ifndef#define #endif #include#elif #if #line#else #ifdef #undef

    for (...) {for (...) {

    ...if (disaster)

    goto Error;...

    }}...

    Error: // error handling code

    goto identificador_de_etiqueta;

    Preprocesador

  • 34

    Inclusin de ficherosLa directiva #include copia un fichero especificado en el cdigo fuente. La sintaxis de ladirectiva #include tiene uno de dos formas:

    El preprocesador sustituye la lnea #include por el contenido de un fichero especficadoen el cdigo fuente. Por eso, la colocacin de #include puede afectar al mbito y a laduracin de todos los identificadores en el fichero incluido. La diferencia entre estas dosformas yace en encontrar algoritmo utilizado para intentar a localizar el fichero a incluir.

    Ruta explcitaColocar una ruta explcita en nombre_de_fichero, significa que se buscar slo dichacarpeta. Por ejemplo:

    MacrosLas macros proporcionan un macanismo de reemplazo de tokens, antes de la compi-lacin.

    Definir Macros y expansiones de macros La directiva # define define una macro:

    Cada ocurrencia de identificador_de_macro en el cdigo fuente precedida por esta lneade control ser reemplezada por una secuencia_de_tokens (probablemente vaca).

    Macros con ParmetrosLa siguiente sintaxis se utiliza para definir una macro con parmetros:

    arg_list opcional es una secuencia de los identificadores separados por comas, como lalista de argumentos de una funcin en C. Cada identificador separado por comas tienela funcin de un argumento formal o un marcador de posicin. Un simple ejemplo:

    #include #include "nombre_de_fichero"

    #include "C:\my_files\test.h"

    /* Una simple macro que devuelve el mayor argumento: */#define _MAX(A, B) ((A) > (B)) ? (A) : (B)

    #define identificador_de_macro

    #define identificador_de_macro ()

  • 352

    La gua de referencia rpida mikroC proporciona definiciones formales de los elementoslxicos en los que consiste el lenguaje de programacin mikroC. Estos elementos sonpareciados a las unidades reconocidas por mikroC. Cada programa escrito en mikroCconsiste en las secuencias de los caracteres ASCII tales como letras, dgitos y signosespeciales. Los signos no imprimibles (por ejemplo: carcter nueva lnea, tabulador, etc)se refieren a los signos especiales tambin. Un conjunto de los elementos bsicos enmikroC es organizado y limitado. El programa se escribe en la ventana mikroC CodeEditor. Durante el proceso de compilacin se realiza el anlisis sintctico (parsing). Elparser debe identificar los tokens de forma que el cdigo fuente es tokenizado, es decir,reducido a tokens y espacios en blanco (whitespace).

    Espacio en blancoEl espacio en blanco (whitespace) es el nombre genrico dado a los espacios (en blanco),tabuladores horizontales y verticales y nueva lnea. Los espacios en blanco se utilizancomo separadores para indicar donde empiezan y terminan los tokens. Por ejemplo, lasdos secuencias:

    y

    son lxicamente equivalentes y se analizan idnticamente dando por resultado sietetokens cada uno:

    Espacio en blanco en las cadenas literalesCuando el espacio en blanco est dentro de una cadena literal no se utiliza como sepa-rador, sino que se interpreta como un carcter comn, esto es, como una parte de unasola cadena. Por ejemplo, la siguiente cadena:

    se descompone en cuatro tokens, con tal de que la cadena literal represente un token:

    Compilacin condicional Las directivas de compilacin condicional se utilizan generalmente para facilitar las mod-ificaciones y compilaciones de programas fuente en diferentes entornos de ejecucin.

    Directivas #if, #elif, #else, y #endif

    Las directivas condicionales #if, #elif, #else, y #endif se comportan igual que las senten-cias las sentencias condicionales comunes en mikroC. Si la expresin escrita despus de#if es cierta (tiene un valor distinto de cero), las lneas de cdigo que sigueninmediatamente a la directiva #if se retienen en la unidad de compilacin. La sintaxis es:

    Cada directiva #if en el cdigo fuente debe terminar por una directiva de cierre #endif.Puede haber cualquier nmero de #elif entre las directivas #if y #endif, pero slo se per-mite una directiva #else. La directiva #else, si est presente, precede a #endif.

    Directivas #ifdef y #ifndef

    Las directivas #ifdef y #ifndef son condicionales especializadas para comprobar si unidentificador est definido o no. La siguiente lnea:

    tiene exactamente el mismo efecto que #if 1 si el identificador est actualmente definido,o #if 0 si el identificador est actualmente indefinido. La directiva #ifndef comprueba lacondicin opuesta comprobada por #ifdef.

    char i;unsigned int j;

    chari ;

    unsigned int j;

    chari;unsignedintj;

    some_string = "mikro foo";

    some_string="mikro foo";

    Visin general de los elementos lxicos

    #if constant_expression_1

    [#elif constant_expression_2]

    ...[#elif constant_expression_n]

    [#else]

    #endif

    #ifdef identifier

  • Si quiere saber ms de nuestros productos, por favor visite nuestra pgina web www.mikroe.com Si tiene problemas con cualquiera de nuestros productos o slo necesita informacin adicional, deje un ticket en www.mikroe.com/en/support Si tiene alguna pregunta, comentario o propuesta de negocio, pngase en contacto con nosotros [email protected]

    GUA DE REFERENCIA RPIDA AmikroC