3. Vectores Punteros Funciones Estructuras

download 3. Vectores Punteros Funciones Estructuras

of 25

Transcript of 3. Vectores Punteros Funciones Estructuras

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    1/25

    Profesor:

    Mag. Ing. Sergio Salas Arriarn

    Diseo de sistemas

    microprocesados

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Tercera semana:

    Vectores, punteros, funciones, estructuras y

    Uniones en ANSI C

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    2/25

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Vectores

    Mag. Ing. Sergio Sala

    Los vectores son pilares en el lenguaje C ya que permiten agrupar un conjunto de dat

    variable. Cada dato tiene una ubicacin en memoria SRAM y es accedido a travs deLa declaracin de un vector sigue el siguiente formato:

    tipo de dato nombre_del_vector[cantidad de elementos]

    Se puede inicializar un vector de varias formas, asignando una cadena de caracteres

    datos. No es necesario indicar la dimensin en estos casos ya que el compilador auto

    que la dimensin del vector es igual al nmero de elementos asignados.

    Por ejemplo:charnombre[] = Arquitectura de computadoras II;

    char num[] = {1,2,3,4,5,6,7,8,9,10};

    unsigned char edad[5]; /*Se crea un vector de nombre edad de 5 elementos, donde

    cada elemento es de 8 bits*/

    void main(){

    edad[1] = 10; //El segundo elemento toma el valor de 10.

    PORTB = edad[1];

    while(1);

    }

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    3/25

    Ubicacin de un vector en la SRAM

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    edad[0]

    edad[1]

    edad[2]

    edad[3]

    edad[4]

    SRAM0x800

    0x801

    0x802

    0x803

    0x804

    El primer elemento del vector tiene ndice 0. Por defecto

    en el compilador HI-TECH C los vectores se comienzan

    a crear a partir de la direccin 0x800.

    Todos los ndices deben ser siempre nmeros enteros

    y positivos.

    Tambin es posible crear vectores de datos de mayorcapacidad como por ejemplo 16 bits:

    unsigned int vector[3]={0x4050,0xCA0F,0x6F58};

    en donde: la SRAM se distribuye de la manera siguiente:

    0x800

    0x801

    0x802

    0x803

    0x804

    0x805

    0x806

    0x50

    0x40

    0x0F

    0xCA

    0x58

    0x6F

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    4/25

    Restricciones de los vectores (parte

    I)

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Salas

    Muchas veces los programadores de ANSI C acostumbrados a trabajar en un

    entorno rico en recursos como lo es un computador compatible no tienen cuidado

    con la excesiva cantidad de declaracin de vectores en sus programas. El

    dsPIC30F3014 posee recursos limitados de memoria por lo cual no se debe

    abusar del uso de los vectores y menos si estos son declarados con tipos de mas

    de 16 bits (long, float). Por ejemplo:

    float numeros[100];

    int detalles[500];

    unsigned char coordenadas[600];

    unsigned short muestras[400];

    void main()

    {

    }

    Demasiadas variables.

    La memoria resulta

    insuficiente.

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    5/25

    Restricciones de los vectores (parte

    II)

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Por otro lado, es el programador quien debe tener sumo cuidado de no exceder el lmite

    vector ya que podra alterar el contenido de otras variables.

    Por ejemplo:

    unsigned char edad[4] = {20,30,40,50};

    unsigned char peso[4] = {70,80,90,85};

    void main(){

    peso[3] = 51;

    edad[4] = 55;

    while(1);

    }

    Dado que no debe tener ndice 4, edad[4] no est especificado e invadir el espacio dim

    peso[0], con lo cual peso[0] = 55. Esto obviamente no es lo que se quera realizar. Este ti

    nicamente mencionado por el compilador como advertencia ms no como error.

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    6/25

    Matrices

    Mag. Ing. Sergio Sala

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Las matrices son realmente vectores, pero son declarados como arreglos bidimiensionaposeen dos ndices: uno para indicar el nmero de fila y otro para el nmero de column

    unsigned char tabla[3][4] = {0,1,2,3

    10,11,12,13,

    20,21,22,23};

    tabla[0][0] tabla[0][1] tabla[0][2] tabla[0][3]

    tabla[1][0] tabla[1][1] tabla[1][2] tabla[1][3]

    tabla[2][0] tabla[2][1] tabla[2][2] tabla[2][3]

    No es recomendable el uso de matrices en un microcontrolador dado que la cantidad dnecesaria equivale a multiplicar ambos ndices por el nmero de bytes de datos. Por ej

    tabla utiliza 3x4x1 bytes = 12 bytes de la memoria SRAM.

    PORTB = tabla[2][2]; //PORTB = 22;

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    7/25

    Punteros

    Mag. Ing. Sergio Sala

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Los punteros son sumamente importantes en C ya que al igual que los vectorerelacionar un conjunto de datos a una sola variable. La diferencia radica en qu

    direccin dinmica y puede apuntar a cualquier posicin de la memoria SRAM.

    declaracin de un puntero es la siguiente:

    unsigned char *p;char*mensaje = Hola mundo;

    En el primer caso se declara un puntero de nombrep que apunta a valores de

    compilador se encarga de definir la direccin que este puntero posee en la SR

    ser modificado por el programador. En el segundo caso se declara un punteromensaje el cual ha sido inicializado con una cadena de caracteres ASCII. El co

    de asignar una direccin para almacenar estos caracteres. Dicha direccin no

    misma y depender de cuantas otras variables hayan sido declaradas.

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    8/25

    Manejo de punteros

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    unsigned charmensaje[]=Hola Mundo;

    unsigned char *p;

    void main()

    {

    TRISB = 0x00;p = &mensaje[0]; //p apunta a mensaje

    PORTB = *p; //PORTB = H

    p++; //p apunta a mensaje[1]

    PORTB = *p; //PORTB = o

    p[2]='K'; //mensaje[3]= K

    while(1);

    }

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    9/25

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Ejemplo de llenado de un

    puntero

    Mag. Ing. Sergio Sala

    unsigned char mensaje[] = "Hola Mundo";

    unsigned char *p;

    char i = 0;

    void main()

    {

    p = &mensaje[0];

    for(i=0;i

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    10/25

    FuncionesFacultad de Ingeniera Electrnica y MecatrnicaCarrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Tipo de la funcin Nombre de la funcin(tipo1argumento 1, tipo2 argumento 2, ,

    tipoN argumento N)

    Tipo de la funcin: Es el tipo de variable que se va a retornar. Puede ser un unsigne

    char, un int, un

    puntero, un vector, etc. Si no se va a retornar ningn valor la

    funcin, esta debe declararse de tipo void.

    Nombre de la funcin: Puede ser cualquier nombre que no comience con un dgito

    numrico. El nombre

    debe ser nico en todo el proyecto para evitar conflictos.

    Argumentos: Son parmetros iniciales que se ingresan a la funcin para que a

    partir de dichosvalores se genere un nuevo resultado. Cada argumento debe s

    Las funciones son rutinas agrupadas dentro de un bloque que posee entradas (argume(retornos) y se utilizan cuando el programa hace uso de bloques de cdigo que normal

    repetitivos como por ejemplo: Inicializar el LCD, transmitir un byte por el USART, conver

    binario a BCD, etc. Las funciones se caracterizan por tener la siguiente nomenclatura:

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    11/25

    Cmo se crea una

    funcin?

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    La funcin tiene dos etapas:

    1. La declaracin.

    2. La definicin de su estructura.

    Suponga que quiere desarrollar una funcin que retorne 0 si un nmero es impar.

    El cdigo es el siguiente:

    unsigned char PAR_IMPAR(unsigned char num);

    void main()

    {

    TRISB = 0xFF;

    TRISD = 0;

    PORTD = PAR_IMPAR(PORTB);

    while (1);

    }

    unsigned char PAR_IMPAR(unsigned char num)

    {

    if(num%2 == 0) return(1);

    else return(0);}

    Declaracin de la

    funcin

    Estructura de la

    funcin

    Invocacin a la

    funcin.

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    12/25

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    La sentencia return

    Mag. Ing. Sergio Sala

    Esta sentencia indica el fin de la funcin y permite retornar un valor. El valor de retorno

    mismo tipo de dato del cual fue declarada la funcin. Una funcin puede poseer mltipl

    return. Pero, solo una de ellas se puede ejecutar a la vez.

    Por ejemplo:

    unsigned char ff_verifica(unsiged char num)

    {

    if(num=50 && num =100 && num

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    13/25

    Funciones sin retorno (void)

    Mag. Ing. Sergio Sala

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Muchas veces se requieren funciones nicamente para la ejecucin de

    procedimientos, pero, no es necesario que para esto retornen un valor.

    Estas funciones deben ser entonces declaradas del tipo void. De la misma

    manera, si la funcin no recibiera parmetro alguno se coloca dentro del

    argumento el parmetro void o simplemente se deja vaco. Por ejemplo:

    void presenta(void)

    {

    TRISB = 0xFF;TRISD = 0x00;

    PORTD =~ PORTB;

    }

    void main()

    {

    presenta();

    PORTD=0;

    presenta();

    while(1);

    }

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    14/25

    Funciones recursivas

    Mag. Ing. Sergio Sala

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Es posible que una funcin se llame a si misma hasta que en un punto el retornogenere un valor conocido y de ah converja un resultado. Esto se conoce como

    recursividad. Por ejemplo:unsigned int fact(unsigned int num);

    unsigned int val=0;

    void main(){

    val = fact(5);

    while(1);

    }

    unsigned int fact(unsigned int num){

    if ( num

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    15/25

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Variables locales y globales

    Mag. Ing. Sergio Sala

    Toda variable declarada fuera del mbito de una funcin es considerada global. Las vari

    dentro del mbito de una funcin son consideradas locales. Las variables globales pueddesde cualquier funcin. Las variables locales solo existen dentro del mbito de una fun

    Por ejemplo:

    unsigned char a = 0; //variable global

    void main()

    {

    unsigned char b; //variable localTRISB = 0xFF;

    b = PORTB;

    a = ~b;

    while(1);

    }

    void config_Puerto(unsigned char config)

    {

    TRISD = config;

    a = 0; //la variable global

    } //puede ser usada aqu

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    16/25

    Sobrecarga de las variables locales y

    globales

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Qu sucede si declaramos una variable local y una global con el mismo nom

    unsigned int fc(unsigned int num);

    unsigned int val=0; //Variable global

    unsigned int p;

    void main()

    {

    val = 10; //La variable local vale 10.

    p = fc(40); //Se invoca a la funcin

    while(1); //val global sigue valiendo 10.

    }

    unsigned int fc(unsigned int num)

    {

    unsigned int val = 0; //Variable local del mismo nombre

    val = num/5; //La variable usada es la local

    return(val); //Retorna 8

    }

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    17/25

    Variables locales

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Una variable local siempre es creada al iniciar una funcin y destruida al salir deesta. Por lo tanto, no almacena su valor una vez que la funcin se vuelve a invocar.

    Ejemplo:unsigned char suma(unsigned char num);

    unsigned char val;

    void main()

    { val = suma(10); //al salir de la funcin p vale 10.

    val = suma(8); //al entrar a esta funcin p vale 0.

    val = suma(14); //al entrar a esta funcin p vale 0.

    while(1);

    }

    unsigned char suma(unsigned char num)

    {

    unsigned char p = 0;

    p+= num;

    return(p);

    }

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    18/25

    Variables estticas

    Mag. Ing. Sergio Sala

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Cuando se requiere que la variable local almacene el valor que tuvo al dejar por ltima

    dicha variable debe ser declarada como esttica. Esto hace que su funcionamiento se pvariable global.

    Por ejemplo:

    unsigned char suma(unsigned char num);

    unsigned char val;

    void main()

    {val = suma(10); //Primera vez p vale 10.

    val = suma(8); //Segunda vez p vale 18

    val = suma(14); //Tercera vez p vale 32

    while(1);

    }

    unsigned char suma(unsigned char num)

    {

    static unsigned char p = 0;

    p+= num;

    return(p);

    }

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    19/25

    El operador typedef

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    En muchas ocasiones es necesario cambiar el nombre de tipo de dato que

    se va a declarar para mejorar la legilibilidad del programa o hacerlo de tal

    manera que pueda ser claramente interpretado por otro programador que

    utiliza un sistema embebido diferente al suyo.

    Por ejemplo, al declarar una variable de tipo unsigned intse sabe que estatiene un tamao de 16 bits sin signo lo que significa que el valor posible de

    la variable puede alternar entre 0 y 65,535. Sin embargo, programadores

    de microcontroladores ATMEL u otros fabricantes pueden entender el tipo

    unsigned intcomo un valor de otra dimensin (de 8 bits sin signo por

    ejemplo). Para evitar malos entendidos se puede hacer uso del operatortypef de la siguiente manera:

    typedef unsigned int _8bits_sin_signo;

    _8bits_sin_signo var=0, num=10;

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    20/25

    EstructurasFacultad de Ingeniera Electrnica y MecatrnicaCarrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Las estructuras son arreglos de datos que se pueden invocar desde una sola variable

    vectores. La diferencia principal con estos ltimos radica en que los tipos de datos asopueden ser diferentes. Por ejemplo, suponga que queremos crear una variable Person

    asociada los siguientes datos: edad, peso, talla, DNI, nombre.

    La edad de la persona es un valor de 8 bits ya que puede oscilar entre 0 y 255 aos.

    El peso de la persona tambin es un valor de 8 bits y puede alternar entre 0 y 255 kg.

    La talla de la persona tambin es un valor de 8 bits y puede alternar entre 0 y 255 cms.

    El DNI de la persona es un valor de 32 bits sin signo ya que considera 7 cifras.El nombre de la persona es una cadena de caracteres de 30 dgitos.

    La asociacin de estas variables a una sola se hace mediante una estructura de la sigu

    struct{

    unsigned char edad;

    unsigned char peso;unsigned char talla;

    unsigned long DNI;

    unsigned char nombre[30];

    } Persona;

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    21/25

    Acceso a la estructura

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Una vez declarada la estructura ya sea en la zona de variables globales o locales es

    posible acceder a ella dentro de una funcin. Por ejemplo, para la estructura Persona

    se tiene:

    unsigned charnombre[] = Juan Perez;

    void main()

    {Persona.edad = 25;

    Persona.talla = 180;

    Persona.peso = 80;

    Persona. DNI = 40722891;

    Persona.nombre = &nombre[0];

    while(1);

    }

    La estructura creada ocupa en la memoria SRAM un total de 3 + 4 + 30 = 37 bytes de

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    22/25

    Variables de tamao definido por

    el programador

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    La ventaja de trabajar con estructuras es que nos permiten generar variables de

    tamaos predefinidos que pueden ser de hasta 1 bit. Esto nos da una gran ayuda

    para trabajar algoritmos, en los cuales se tienen que analizar conjuntos binarios que

    son menores a 8 bits.

    Por ejemplo observe la siguiente esctructura:struct{

    unsigned char bit0: 1;

    unsigned char bit1: 1;

    unsigned char bit2: 1;

    unsigned char bit3: 1;

    unsigned char bit4: 1;

    unsigned char bit5: 1;

    unsigned char bit6: 1;

    unsigned char bit7: 1;

    }_bits;

    void main()

    {

    _bits.bit0 = 1;

    _bits.bit1 = 0;

    _bits.bit2 = 1;

    _bits.bit3 = 0;

    _bits.bit4 = 0;

    _bits.bit5 = 1;

    _bits.bit6 = 1;

    _bits.bit7 = 0;

    while(1);

    }

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    23/25

    UnionesFacultad de Ingeniera Electrnica y MecatrnicaCarrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    Las uniones tienen una declaracin similar a las estructuras, la diferencia principal radic

    elementos de las uniones se sobre escriben y ocupan las mismas posiciones en la memmuy til ya que nos permite acceder al mismo espacio de memoria con diferentes nomb

    variable, con lo cual podemos acceder a todo un byte o word y a cada bit de estos de m

    Por ejemplo:

    union{unsigned char val;

    unsgined char p;

    }_bytes;

    void main(){

    _bytes.val = 5;

    _bytes.p = 10;

    while(1);

    }

    Tanto val como p ocupan el mis

    Espacio en la memoria SRAM.

    Tanto val = 5 y p = 5.Luego p = 10 y por tanto val = 10.

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    24/25

    Uniones con variables de diferente

    tamao

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag. Ing. Sergio Sala

    union{struct{

    unsigned char LSB;

    unsigned char MSB;

    }_bytes;

    unsigned int _word;

    }variable;

    void main()

    {

    variable._bytes.LSB = 0x05;

    variable._bytes.MSB = 0xC0;while(1);

    }

    0x05

    0xC0

    SRAM

    variable._word=0xC005

    variable._bytes.LSB

    variable._bytes.MSB

  • 7/29/2019 3. Vectores Punteros Funciones Estructuras

    25/25

    Facultad de Ingeniera Electrnica y Mecatrnica

    Carrera: Ingeniera Electrnica

    Mag Ing Sergio Sala

    Uniones con variables de tamao binariounion{ struct{

    unsigned char bit0: 1;

    unsigned char bit1: 1;

    unsigned char bit2: 1;

    unsigned char bit3: 1;

    unsigned char bit4: 1;unsigned char bit5: 1;

    unsigned char bit6: 1;

    unsigned char bit7: 1;

    }_bits;

    unsigned char _byte;

    } dato;

    void main()

    {

    dato._byte = 0x05; //dato._bits.bit0 = 1, dato._bits.bit2 = 1

    while(1);

    }