You are on page 1of 10

Semana 11 Arreglos, matrices y punteros en ANSI C

Mag. Ing. Sergio Salas A.

Vectores
Los vectores son pilares en el lenguaje C ya que permiten agrupar un conjunto de datos en una sola variable. Cada dato tiene una ubicacin en memoria SRAM y es accedido a travs de un ndice. La 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 o un conjunto de datos. No es necesario indicar la dimensin en estos casos ya que el compilador automticamente asume que la dimensin del vector es igual al nmero de elementos asignados. Por ejemplo: char nombre[] = 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); } Mag. Ing. Sergio Salas A.

Ubicacin del vector en la SRAM


SRAM
edad[0] edad[1] 0x70 El primer elemento del vector tiene ndice 0. Por defecto en el compilador MPLAB C18 los vectores se comienzan a crear a partir de la direccin 0x60. Todos los ndices deben ser siempre nmeros enteros y positivos. Tambin es posible crear vectores de datos de mayor capacidad como por ejemplo 16 bits: unsigned int vector[3]={0x4050,0xCA0F,0x6F58}; en donde: la SRAM se distribuye de la manera siguiente: 0x50 0x40 0x0F 0xCA 0x58 0x6F 0x70 0x71 0x72 0x73 0x74 0x75 0x76 Mag. Ing. Sergio Salas A.

0x71
0x72 0x73 0x74

edad[2]
edad[3] edad[4]

Restricciones de los vectores (parte I)


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 PIC18F4550 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 8 bits (unsigned int, long, float). Por ejemplo: float numeros[20]; int detalles[100]; unsigned char coordenadas[60]; unsigned short muestras[80]; void main() { } Demasiadas variables. La memoria resulta insuficiente.

Mag. Ing. Sergio Salas A.

Restricciones de los vectores (parte II)


Por otro lado, es el programador quien debe tener sumo cuidado de no exceder el lmite de los ndices del 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() { edad[3] = 51; edad[4] = 55; while(1); } Dado que no debe tener ndice 4, edad[4] no est especificado e invadir el espacio dimensionado para peso[0], con lo cual peso[0] = 55. Esto obviamente no es lo que se quera realizar. Este tipo de error es nicamente mencionado por el compilador como advertencia ms no como error. Mag. Ing. Sergio Salas A.

Matrices
Las matrices son realmente vectores, pero son declarados como arreglos bidimiensionales, por lo cual poseen dos ndices: uno para indicar el nmero de fila y otro para el nmero de columna. Por ejemplo: unsigned char tabla[3][4] = {0,1,2,3 10,11,12,13, 20,21,22,23}; tabla[0][0] tabla[1][0] tabla[2][0] tabla[0][1] tabla[1][1] tabla[2][1] tabla[0][2] tabla[1][2] tabla[2][2] tabla[0][3] tabla[1][3] tabla[2][3]

No es recomendable el uso de matrices en un microcontrolador dado que la cantidad de memoria necesaria equivale a multiplicar ambos ndices por el nmero de bytes de datos. Por ejemplo, la variable tabla utiliza 3x4x1 bytes = 12 bytes de la memoria SRAM. PORTB = tabla[2][2]; //PORTB = 22; Mag. Ing. Sergio Salas A.

Punteros
Los punteros son sumamente importantes en C ya que al igual que los vectores nos permiten relacionar un conjunto de datos a una sola variable. La diferencia radica en que el puntero tiene direccin dinmica y puede apuntar a cualquier posicin de la memoria SRAM. La forma de declaracin de un puntero es la siguiente: unsigned char *p; char *mensaje = Hola mundo; En el primer caso se declara un puntero de nombre p que apunta a valores de 8 bits. El compilador se encarga de definir la direccin que este puntero posee en la SRAM, el cual puede ser modificado por el programador. En el segundo caso se declara un puntero de nombre mensaje el cual ha sido inicializado con una cadena de caracteres ASCII. El compilador se encarga de asignar una direccin para almacenar estos caracteres. Dicha direccin no siempre ser la misma y depender de cuantas otras variables hayan sido declaradas.

Mag. Ing. Sergio Salas A.

Manejo de punteros
unsigned char mensaje[]=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); }

Mag. Ing. Sergio Salas A.

Ejemplo de llenado de un puntero


El siguiente programa borra la cadena Hola Mundo del vector mensaje y lo reemplaza por ceros. unsigned char mensaje[] = "Hola Mundo"; unsigned char *p; char i = 0; void main() { p = &mensaje[0]; for(i=0;i<10;i++) { *p = 0; p++; } while(1); } Mag. Ing. Sergio Salas A.

Vectores punteros
En lenguaje C, un vector puede ser tambin tratado como puntero: unsigned char vec[10]; Void main() { vec[2] = 0; *(vec+2)=0; }

Mag. Ing. Sergio Salas A.

You might also like