Está en la página 1de 57

Conceptos b asicos del lenguaje C

Seminario de Sistemas Embebidos - FIUBA Alan Kharsansky (akharsa@gmail.com)

Octubre - 2011

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

1 / 57

Indice I
1 2

Introducci on Conceptos b asicos del lenguaje C Hello, world! Directivas de pre-procesador Variables y tipos de datos Generalidades Tipos de datos Derivados Tama nos de los tipos de datos Operadores Generalidades Precedencia de operadores Estructuras de control de ujo Condicionales Repetitivas Funciones
Conceptos b asicos del lenguaje C Octubre - 2011 2 / 57

Alan Kharsansky (akharsa@gmail.com) ()

Indice II
Forma general Retorno Parametros

Punteros Punteros y arrays Punteros a estructuras

Strings Denici on

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

3 / 57

Introducci on

Introducci on

El objetivo de esta clase es repasar los conceptos claves del lenguaje C que utilizaremos a lo largo del Seminario de Sistemas Embebidos. Para una referencia completa del lenguaje se recomienda consultar: The C Programming Language: Kernighan; Dennis M. Ritchie (March 1988)

En esta presentaci on solo se utilizar an aquellas funciones y estructuras del lenguaje que se utilizan con m as frecuencia para la programaci on de microcontroladores. No es una denici on completa del lenguaje desde ning un punto de vista.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

4 / 57

Conceptos b asicos del lenguaje C

Hello, world!

Hello, World!
La estructura b asica de un programa en C se puede ver en el siguiente ejemplo:

#i n c l u d e < s t d i o . h> i n t main ( ) { // E s t e e s un c o m e n t a r i o de una l i n e a p r i n t f ( h e l l o , w o r l d \ n ) ; return 0; / E s t e e s un c o m e n t a r i o m u l t i l i n e a / }

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

5 / 57

Conceptos b asicos del lenguaje C

Hello, world!

Hello, World!

Donde lo primero que nos encontramos es una directiva del pre-procesador: el Include.
#i n c l u d e < s t d i o . h>

Esta directiva, insertar a de manera exacta el contenido del archivo stdio.h al comienzo de nuestro programa. Notar la diferencia de utilizar: Par entesis angulares <> Comillas dobles

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

6 / 57

Conceptos b asicos del lenguaje C

Hello, world!

Hello, World!
Luego nos encontramos con la implementaci on de una funci on. En este caso el main que debe existir en toda aplicaci on escrita en lenguaje C. Una funci on se declara de la siguiente manera:
[ t i p o de d a t o de r e t o r n o ] nombre ( [ param1 ] , [ param2 ] , . . . ) { // I m p l e m e n t a c i o n }

Que en este caso es:


i n t main ( v o i d ) { // I m p l e m e n t a c i o n }

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

7 / 57

Conceptos b asicos del lenguaje C

Hello, world!

Hello, World!

Y por u ltimo nos encontramos con una llamada a una funci on a la que se le pasa un par ametro, comentarios, y la sentencia return. Algunas cosas importantes a tener en cuenta: Los bloques de c odigo deben ir entre llaves { } Las sentencias deben terminarse en punto y coma ; Unicidad del main()

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

8 / 57

Conceptos b asicos del lenguaje C

Directivas de pre-procesador

Directivas del pre-procesador


Las m as importantes y que utilizaremos con m as frecuencia son:
#d e f i n e NOMBRE [ VALOR ]

#i n c l u d e

l e d D r i v e r s . h

#i f d e f DEBUG p r i n t f ( e n c e n d i e n d i o maquina ) ; #e l s e // No i m p r i m o nada #e n d i f

Cuidado! Las directivas de pre-procesador no se terminan en punto y coma.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

9 / 57

Variables y tipos de datos

Generalidades

Variables y tipos de datos

Las variables son los elementos son los elementos b asicos contenedores de datos de un programa. Deben tener un tipo especico seg un el contenido que almacenaran y con los operadores podremos actuar sobre ellas.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

10 / 57

Variables y tipos de datos

Tipos de datos

Tipos de datos nativos

Existen pocos tipos de datos nativos desde la primera versi on del lenguaje. Luego se agregaron nuevos para facilitar su uso. char: puede almacenar un caracter (ASCII). int: puede almacenar un numero entero. oat: almacena un numero real representado en punto otante de precisi on simple. double: similar al oat pero de doble precisi on.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

11 / 57

Variables y tipos de datos

Tipos de datos

Modicadores y calicadores

Los modicadores permiten alterar el tipo de variables de alguna u otra manera. Algunos com unmente usados son: signed y unsigned long y short Los calicadores son: const: signica que su contenido no se podr a alterar. volatile: le indican al compilador que tiene propiedades especiales para tener en cuenta en la optimizaci on.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

12 / 57

Variables y tipos de datos

Tipos de datos

Declaraci on de variables

Se pueden utilizar las siguientes formas de declaraci on con y sin inicializaci on:
int valor ; unsigned i n t valor2 , v a l o r 3 ; f l o a t Kp = 0 . 4 5 4 ; i n t a , b =5; char l e t r a = Z ;

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

13 / 57

Variables y tipos de datos

Tipos de datos

Alcance (scope)

Una variable se dice que puede ser: Local si est a declarada dentro de una funci on o bloque de c odigo

Global si est a declarada fuera de toda funci on. Las variables globales pueden ser accedidas por cualquier funci on o bloque de c odigo, mientras que las locales, solo dentro del entorno que fue creada.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

14 / 57

Variables y tipos de datos

Derivados

Derivados

Existen tambi en los tipos derivados. Estos son: Arreglos (arrays) Estructuras Tipos enumerativos Punteros

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

15 / 57

Variables y tipos de datos

Derivados

Arreglos

Los arreglos son contenedores de m ultiples variables contiguas del mismo tipo. Son de acceso aleatorio y se los puede acceder f acilmente en cualquier posici on. Su declaraci on es la siguiente:

char b u f f e r [ 1 0 0 ] ; i n t g a i n s [ 4 ] = {10 ,20 , 30 ,50}; c h a r msg [ ] = { H e l l o , w o r l d ! } ;

Cuantos elementos tendr a el arreglo msg?

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

16 / 57

Variables y tipos de datos

Derivados

Estructuras

Las estructuras son tipos de datos creados por el usuario que contienen uno o m as tipos de datos (nativos o creados por el usuario). Por ejemplo, si queremos almacenar diferentes datos de una persona, ser a u til posiblemente tener un tipo de dato persona que tenga los siguientes atributos: nombre edad altura peso

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

17 / 57

Variables y tipos de datos

Derivados

Estructuras
Para declarar este tipo de datos nuevo, se debe utilizar la siguiente sintaxis:
typedef struct { c h a r name [ 1 0 0 ] ; u n s i g n e d i n t a ge ; float height ; f l o a t weight ; }user t ;

Y luego usarlas como cualquier otro tipo de datos:


u s e r t User ; u s e r t admins [ 1 0 ] ;

En realidad, el typedef y el struct no necesariamente deben ir juntos, pero por comodidad se lo suele utilizar as .
Alan Kharsansky (akharsa@gmail.com) () Conceptos b asicos del lenguaje C Octubre - 2011 18 / 57

Variables y tipos de datos

Derivados

Tipos enumerativos
Los tipos enumerativos solo admiten una cantidad nita de posibles valores. Se los suele utilizar cuando se busca que una variable solo pueda tomar determinados valores como ser: TRUE y FALSE, los d as de la semana, colores, etc. Para declararlos se usa la siguiente sintaxis:
t y p e d e f enum {TRUE, FALSE } b o o l e a n t ;

El compilador utilizar a alguna representaci on para el TRUE y otra para el FALSE, pero el programador no debe preocuparse por ello. Para declarar una variable se puede usar el siguiente fragmento de c odigo:
b o o l e a n t showDebug = FALSE ;

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

19 / 57

Variables y tipos de datos

Derivados

Punteros

Los punteros son variables que no contienen datos sino posiciones de memoria, muy com unmente de otras variables. Para declararlas se utiliza el s mbolo asterisco * y se declaran de la siguiente manera:
i n t p1 ; c h a r msg ; // p1 e s un p u n t e r o a un i n t // msg e s un p u n t e r o a un c h a r

Su uso y sus detalles se ver an en las siguientes secciones

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

20 / 57

Variables y tipos de datos

Tama nos de los tipos de datos

Tama no de los tipos de datos

Es l ogico pensar que si un char debe contener un caracter ASCII entonces el mismo debe poder almacenar 8 bits. Un oat que cumpla con la norma IEEE-754 debe tener 32 bits para simple precisi on y 64 bits para doble precisi on. El int generalmente se reere a que usa la palabra del sistema entera. Entonces es esperable que en un microcontrolador de 32 bits, el int ocupe 32 bits. Pero en uno de 8?

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

21 / 57

Variables y tipos de datos

Tama nos de los tipos de datos

Tama no de los tipos de datos

En general este problema no es tomado muy en cuenta cuando se dise na software para PC, pero en embebidos esto puede traer problemas de portabilidad. Los tama nos de las variables no son necesariamente respetadas por los compiladores, por eso surge en en el standard C99 el stdint.h

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

22 / 57

Variables y tipos de datos

Tama nos de los tipos de datos

stdint.h
En el archivo de cabecera stdint.h se declaran los siguientes tipos de datos de tama no exacto de bits y que son respetados por todos los compiladores C99:
Tipo int8 t uint8 t int16 t uint16 t int32 t uint32 t int64 t uint64 t Singado Signed Unsigned Signed Unsigned Signed Unsigned Signed Unsigned Bits 8 8 16 16 32 32 64 64 Bytes 1 1 2 2 4 4 8 8

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

23 / 57

Operadores

Generalidades

Operadores

Los operadores permiten operar, modicar y consultar el valor de las variables. Una manera de categorizarlos es por su funci on: aritm eticos de asignaci on l ogicos y relacionales operadores de bits de acceso pperadore de punteros

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

24 / 57

Operadores

Generalidades

Operadores aritm eticos

Estos son: +, -, *, /, %, ++ y - Por ejemplo:


int int int int m = 45; b = 8; x = 10; y;

y = m x + b ; b++; m;

Ver los operadores ++ y - - como post y pre incremento

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

25 / 57

Operadores

Generalidades

Operadores de asignaci on

Estos son: = , += , -= , *= , /=, %=


Por ejemplo:
a b d d = 10; = ca ; += 1 ; = 1 0 ;

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

26 / 57

Operadores

Generalidades

L ogicos y relacionales

Estos operadores se eval uan y pueden devolver solo verdadero o falso mediante un 1 o un 0 respectivamente.

Relacionales: >, >=, <, <= L ogicos: == , (iguales), != (distintos) Negado: !

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

27 / 57

Operadores

Generalidades

Operadores de bits

Los operadores de bit operan bit a bit de cada variable, sin importar su tipo. Estos son: & (AND), | (OR), (XOR), << (left shift), >> (right shift), (NOT)
int flags ;

f l a g s = f l a g s & 0 x05 ; f l a g s = f l a g s | 0 x01 ;

Tambi en son validos =, &=, etc.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

28 / 57

Operadores

Generalidades

Operadores de acceso

Los operadores punto (.) y llaves ([ ]) permiten acceder a miembros de una estructura y de un arreglo respectivamente. Por ejemplo:
user t user ; float coefs [10]; u s e r . age = 4 3 ; user . height = 1.89; c o e f [ 0 ] = u s e r . age u s e r . h e i g h t ;

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

29 / 57

Operadores

Generalidades

Operadores de punteros
Los operadores * y & son utilizados para punteros. *: lo apuntado por &: la direcci on de memoria de Por ejemplo:
int a = 10; i n t pa ; pa = &a ; pa = 2 0 ;

Cu anto vale a al nalizar la ejecuci on del c odigo?

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

30 / 57

Operadores

Precedencia de operadores

Precedencia de operadores

Cu anto vale la siguiente expresi on?

34+5 17 o 27?

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

31 / 57

Operadores

Precedencia de operadores

Precedencia de operadores

Todos sabemos que primero se eval ua lo que esta entre los operadores + y - y luego estos u ltimos. Pero, esta sintaxis Qu e pregunta?
i f ( x & MASK == 0 x55 )

Si no sabemos que orden de precedencia (evaluaci on) tienen los operadores, no podemos estar seguros de que se va a evaluar x&MASK y luego se preguntar a si es igual a 0x55 o primero se preguntara si la mascara MASK es 0x55 y luego se hace una AND con x.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

32 / 57

Operadores

Precedencia de operadores

Precedencia de operadores

La soluci on m as segura es utilizar siempre par entesis en las expresiones para evaluarlas. Esto no agrega ning un peso (overhead) adicional al c odigo, y permite estar seguros de la evaluaci on.
i f ( ( x & MASK) == 0 x55 )

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

33 / 57

Operadores

Precedencia de operadores

Precedencia de operadores
El estandar C tiene denida una tabla de precedencias:
Operators () [] > . ! ++ + - *(type)sizeof *, /, % +, <<, >> <, <=, >, >= == != & && || ?: = += -= *= /= %= &= = = <<= >>=
Alan Kharsansky (akharsa@gmail.com) () Conceptos b asicos del lenguaje C

Associativity left to right right to left left to right left to right left to right left to right left to right left to right left to right left to right left to right left to right right to left right to left
Octubre - 2011 34 / 57

Estructuras de control de ujo

Control de ujo

Mediante el control de ujo, el programador puede hacer que el c odigo ejecute de manera condicional o repetitiva diferente a una ejecuci on secuencial pura.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

35 / 57

Estructuras de control de ujo

Condicionales

Estructuras condicionales - If
La estructura IF permite evaluar la condici on de verdad de una expresi on (que devuelve verdadero (1) o falso (0)). Su sintaxis en su forma m as general es:
i f ( CONDICION1 ) { \\ B l o q u e a e j e c u t a r } else i f ( CONDICION2 ) { s i s e cumple l a c o n d i c i o n 2 s i s e cumple l a c o n d i c i o n 1

\\ B l o q u e a e j e c u t a r } else i f ( CONDICION3 ) {

\\ B l o q u e a e j e c u t a r } else { \\ B l o q u e a e j e c u t a r }
Alan Kharsansky (akharsa@gmail.com) ()

s i s e cumple l a c o n d i c i o n 2

s i no s e cumplen l a s c o n d i c i o n e s 1 , 2 n i 3

Conceptos b asicos del lenguaje C

Octubre - 2011

36 / 57

Estructuras de control de ujo

Condicionales

Estructuras condicionales - If
Por ejemplo:
i f ( ( a >= 6 5 ) && ( a <=90){ printf ( la } else l e t r a es mayuscula ) ;

i f ( ( a >= 9 7 ) && ( a < =122) { l e t r a es minuscula ) ;

printf ( la }

i f ( p u l s a d o r ( ) == TRUE) { prenderLed ( ) ; } else { apagarLed ( ) ; }

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

37 / 57

Estructuras de control de ujo

Condicionales

Estructuras condicionales - Switch

El comando Switch permite comparar una variable contra diferentes valores enteros de manera m as compacta. Su sintaxis es:
switch ( expression ) { case expr : statements case expr : statements default : statements }

Para terminar un bloque, se utilza el comando break pero est e puede ser omitido si se quiere que dos condiciones utilicen el mismo c odigo.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

38 / 57

Estructuras de control de ujo

Condicionales

Estructuras condicionales - Switch


Ejemplo:
s w i t c h ( lastCommand ) { case a : c a s e A : // H a c e r a l g o break ; case b : c a s e B : // H a c e r a l g o break ; default : // No e s n i n g u n comando r e c o n o c i d o }

Para terminar un bloque, se utiliza el comando break pero est e puede ser omitido si se quiere que dos condiciones utilicen el mismo c odigo.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

39 / 57

Estructuras de control de ujo

Repetitivas

Estructuras repetitivas - While

El While permite ejecutar un bloque de c odigo siempre que se cumpla una condici on. Su sintaxis es:
w h i l e ( CONDICION ) { // c o d i g o a e j e c u t a r }

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

40 / 57

Estructuras de control de ujo

Repetitivas

Estructuras repetitivas - While

Por ejemplo:
while (! pulsador ()){ prenderLed ( ) ; delay (100); apagarLed ( ) ; delay (100); }

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

41 / 57

Estructuras de control de ujo

Repetitivas

Estructuras repetitivas - For

La estructura for permite ejecutar un c odigo de manera similar al while, siempre que se cumpla una codici on pero agrega la posibilidad de incluir una inicializaci on que se realizar a una sola vez, y una operaci on luego de cada ciclo. Su sintaxis es:
f o r ( INIT ; CONDICION ; ACCION ) { // B l o q u e de c o d i g o a e j e c u t a r }

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

42 / 57

Estructuras de control de ujo

Repetitivas

Estructuras repetitivas - For

Por ejemplo:
for ( i = 0 ; i < 10 ; i++ ) { p r i n t f ( \% i \ r \ n , i ) ; }

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

43 / 57

Funciones

Forma general

Funciones

Las funciones permiten dividir tareas grandes en peque nas partes. Algunas caracter sticas de las mismas son: Permiten la modularizaci on Separan la implementaci on del uso

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

44 / 57

Funciones

Forma general

Funciones
En el lenguaje C, las funciones pueden y/o deben tener: un nombre u nico un tipo de valor de retorno par ametros Por ejemplo:
int value ; v a l u e = readAdcChannel ( 4 ) ;

readAdcChannel es el nombre de una funci on que recibe un solo par ametro (aparentemente entero) y devuelve por nombre un valor.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

45 / 57

Funciones

Forma general

Funciones
El prototipo de una funci on nos permite saber todos los datos necesarios para el usuario de la funci on. Para este caso podr a ser:
i n t readAdcChannel ( i n t ) ;

Y la implementaci on de la misma:
i n t r e a d A d c C h a n n e l ( i n t chan ) { ( ( chan >=0) \&\& ( chan <=9){ r e t u r n ADCVal ; } else { r e t u r n 1; } if }

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

46 / 57

Funciones

Retorno

Funciones - Retorno

El retorno es la salida de una funci on: Cuando una funci on se dice que devuelve un valor por nombre signica que su nombre (m as los par ametros) se eval uan tomando un valor. El tipo de dato de retorno puede ser cualquier tipo de dato valido en el sistema (nativos y/o denidos por el usuario). La funci on debe usar la instrucci on return para devolver un resultado.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

47 / 57

Funciones

Parametros

Funciones - Par ametros

Una funci on com unmente recibir a par ametros con los cuales operar. Estos par ametros pueden ser de cualquier tipo y una funci on puede tener la cantidad de par ametros que uno necesite. Conceptualmente existen dos maneras de pasarle un par ametro a una funci on: Por copia Por referencia (punteros)

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

48 / 57

Funciones

Parametros

Funciones - Par ametros por copia


Cuando se dice que el par ametro se pasa por copia, el compilador copia los valores que el usuario ingresa al llamar a la funci on dentro del stack de la misma. Por eso los par ametros dentro de la funci on son locales. Por ejemplo:
int a = 5 , b = 8; p r i n t f ( \% i , c a l c u l a r C o e f ( a , b ) ) ;

Donde la funci on ser a por ejemplo:


i n t c a l c u l a r C o e f ( i n t x , i n t y ){ r e t u r n ( x y ) / ( x x+y y ) ; }

la variable a se copia a x y la variable b se copia a y. x e y son variables locales de la funci on y modicarlas no afecta el valor de a y b.
Alan Kharsansky (akharsa@gmail.com) () Conceptos b asicos del lenguaje C Octubre - 2011 49 / 57

Funciones

Parametros

Funciones - Par ametros por puntero


Cuando se dice que el par ametro se pasa por puntero, la funci on recibe la direcci on de memoria del dato y no una copia del mismo. Este m etodo tiene algunas caracter sticas importantes: Si el dato es grande (una estructura por ejemplo) esta no se copia entero ahorrando memoria de stack y tiempo de ejecuci on Es posible modicar el contenido de la variable externa ya que trabajo sobre la ubicaci on de la misma Es la u nica manera de pasar el contenido de un array de forma sencilla como par ametro Nos permite tener m as de un valor de retorno El u ltimo punto introduce el concepto de par ametros de salida que puede resultar un poco confuso.

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

50 / 57

Funciones

Parametros

Funciones - Par ametros de salida


Si necesitamos que una funci on devuelva m as de un valor, entonces la u nica manera (sin devolver una estructura que contenga varios campos) es utilizar par ametros de salida. En el siguiente ejemplo se muestra como:
int sensorValue , sensorStatus ; c h a r sensorName [ 2 0 ] ; int retVal ; r e t V a l = g e t S e n s o r D a t a ( 8 , sensorName ,& s e n s o r V a l u e ,& s e n s o r S t a t u s ) ;

Y el prototipo de la misma ser a:


i n t g e t S e n s o r D a t a ( i n t num , c h a r name , i n t v a l , i n t s t a t ) ;

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

51 / 57

Funciones

Parametros

Funciones - Par ametros de salida


La implementaci on podr a ser algo similar a:
i n t g e t S e n s o r D a t a ( i n t num , c h a r name , i n t v a l , i n t s t a t ) { int valBuff , statBuff ; c h a r nameBuff [ 2 0 ] ; int ret ; // C o d i g o que l e e l o s d a t o s de un s e n s o r e x t e r n o y l o g u a r d a en v a r i f ( r e t > 0) { s t r c p y ( nameBuff , name ) ; val = valBuff ; stat = statBuff ; return ret ; } else { r e t u r n 1; } }

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

52 / 57

Punteros

Punteros y arrays

Punteros y arrays
Cuando se declara un arreglo de cualquier tipo, el nombre del arreglo es autom aticamente un puntero al primer elemento. Por ejemplo:
c h a r welcomeMsg [ ] = { System i s UARTSend ( welcomeMsg ) ; starting . . . };

Y la funci on UARTSend podr a tener esta forma:


v o i d UARTSend ( c h a r m) { i n t i =0; w h i l e ( (m+i )!= \ 0 ) { UARTputc ( (m+i ) ) ; i ++; } }

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

53 / 57

Punteros

Punteros a estructuras

Punteros a estructuras

Recordemos la estructura creada user t y supongamos una armemos una funci on que imprime sus campos con cierto formato:
typedef struct { c h a r name [ 1 0 0 ] ; u n s i g n e d i n t a ge ; float height ; f l o a t weight ; }user t ; u s e r t admin={ Pedro G o n z a l e s , 4 2 , 1 . 7 5 , 8 3 . 5 } ; p r i n t U s e r I n f o ( &admin ) ;

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

54 / 57

Punteros

Punteros a estructuras

Punteros a estructuras

La funci on printUserInfo podr a tener la siguiente forma:


p r i n t U s e r I n f o ( u s e r t u ){ UARTSend ( ( u ) . name ) ; }

O lo que es lo mismo:
p r i n t U s e r I n f o ( u s e r t u ){ UARTSend ( u>name ) ; }

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

55 / 57

Strings

Denici on

Strings
Los strings o cadenas de caracteres, como tipo de dato en si no existen. Pero si hay un convenci on en cuanto a su utilizaci on y decimos que: Un String en C es simplemente una cadena de caracteres (chars) terminadas en el car acter \0 (0 decimal). En C, al declarar un array de chars e inicializarlo, autom aticamente el compilador le agrega un 0 al nal. Es decir:
c h a r msg [ ] = { H o l a } ;

Es un arreglo de 5 elementos y el 5to es el 0. Al no ser un tipo nativo, se deben usar funciones para trabajar con strings ya sea para comparar, asignar, concatenar, etc. Estas funciones est an incluidas en la biblioteca string de C y su archivo de cabecera es el string.h.
Alan Kharsansky (akharsa@gmail.com) () Conceptos b asicos del lenguaje C Octubre - 2011 56 / 57

Strings

Denici on

FIN

Alan Kharsansky (akharsa@gmail.com) ()

Conceptos b asicos del lenguaje C

Octubre - 2011

57 / 57

También podría gustarte