September 10th, 2008Headers and Structs
Antes de entrar por completo a programación orientada a objetos seria bueno recordar algo de “headers” y “structs”.
Es común usar estructuras para englobar ciertos datos en una sola variable, ya que seria un completo desastre almacenarlos en variables separadas, por lo que una estructura es la agrupación de variables.
Los Headers son archivos que se usan para agrupar la declaración de funciones, variables y tipos de datos, esto para poder administrarlos en un diferente lugar al programa principal, ya que al tener proyectos grandes nos da la posibilidad de ver una sobrevista de nuestras líneas de código.
Primero creamos un nuevo proyecto Foundation Tool, dentro de la carpeta Source creamos un archivo nuevo pero esta vez será uno de C File que se encuentra en C and C++, como nombre le podremos lifo, cada archivo de C que se crea viene acompañado de su archivo de cabecera, en este caso lifo.h, aquí solo declararemos la estructura a usar y la de nuestras funciones.
Por lo tanto nuestro archivo lifo.h va a tener la declaración de la estructura pila que la llamamos Lifo y de sus operaciones, quedando así:
-
typedef struct {
-
int *pila;
-
int *topePila;
-
int currentIndex;
-
int maxValues;
-
} LiFo;
-
-
void initLiFo(LiFo *pila, int numValues);
-
void statusLiFo(LiFo *pila);
-
void pushLiFo(LiFo *pila, int value);
-
int popLiFo(LiFo *pila);
Ahora abriremos nuestro archivo lifo.c, aquí pondremos nuestras funciones que usaremos, estas representan las operaciones básicas de nuestra pila, nota: en C solo se pone la serie de funciones a usar, aquí tenemos que agregar la instrucción de #import "lifo.h"
-
#import "lifo.h";
-
-
void initLiFo(LiFo *pila, int numValues){
-
pila->pila = calloc(numValues, sizeof(int));
-
pila->topePila = pila->pila;
-
pila->currentIndex = 0;
-
pila->maxValues = numValues;
-
}
-
-
void statusLiFo(LiFo *pila){
-
int i=0;
-
pila->pila--;
-
for (i=pila->currentIndex; i>0; i--){
-
pila->pila--;
-
}
-
pila->pila = pila->topePila;
-
}
-
-
void pushLiFo(LiFo *pila, int value){
-
if (pila->currentIndex<pila->maxValues){
-
*pila->pila = value;
-
pila->pila++;
-
pila->topePila = pila->pila;
-
pila->currentIndex++;
-
}else{
-
}
-
}
-
-
int popLiFo(LiFo *pila){
-
if (pila->currentIndex!=0){
-
pila->pila--;
-
int value = *pila->pila;
-
pila->topePila = pila->pila;
-
pila->currentIndex--;
-
return value;
-
}else{
-
return -1;
-
}
-
}
Y por ultimo editaremos el archivo Pila.m, primero incluiremos el archivo lifo.h, ahora si podemos hacer uso de nuestra estructura y funciones, por lo que declaramos una pila de tipo Lifo, y hacemos las respectivas llamadas a funciones para manejar nuestra pila, un detalle es que pasamos nuestra pila por referencia a nuestra función, esto es que no enviamos los datos sino que enviamos la dirección de memoria de la pila:
-
#import <Foundation/Foundation.h>
-
#import <stdio.h>
-
#import "lifo.h"
-
-
int main (int argc, const char * argv[]) {
-
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-
-
LiFo pila;
-
initLiFo(&pila,2);
-
statusLiFo(&pila);
-
pushLiFo(&pila, 10);
-
pushLiFo(&pila, 12);
-
pushLiFo(&pila, 20);
-
statusLiFo(&pila);
-
pushLiFo(&pila, 13);
-
statusLiFo(&pila);
-
-
[pool drain];
-
return 0;
-
}
Listo ahora ya podemos dar un Build & Go, para ver el resultado de nuestro proyecto, por lo que podríamos ver algo así.

