Un puntero void* es un puntero genérico que se puede usar para hacer funciones que pueden recibir y/o devolver distintos tipos de datos según sea el caso. O sea que usando este tipo de puntero puedes hacer por ejemplo una función que trabaje con enteros si se le pasan punteros a enteros o con una estructura si se le pasan punteros a la estructura. En el siguiente ejemplo se hace un casting a otro tipo de puntero para que así el compilador sepa cuantos bytes debe sumar a la dirección base, en este caso el casting es a char* por lo tanto el compilador sumará tamElem*k*sizeof(char) bytes a la dirección base. Esta función recibe de argumento la función de comparación y busca en un arreglo el argumento llamado valor, en caso de hallarlo retorna el indice del elemento en el arreglo, si no encuentra al elemento en el arreglo retorna -1.
int busquedaLineal(void *valor, void *dirBase, int tamElem, int cantElem, int (*comparacion) (void*,void*)) { int k; for(k=0; k < cantElem; k++) { void *elemActual = (char*)dirBase + tamElem*k; if( comparacion(valor,elemActual) == 0 ) { return k; } } return -1; }
Octave es un software muy parecido a Matlab, pero libre.Trae consigo un sin fin de funciones matemáticas, sobre todo para trabajar con matrices. Una de las muchas cosas interesantes que se pueden hacer con este software es cargar un archivo de audio en una matriz y editarlo.
Un archivo de audio tiene tres propiedades :
Muestras por segundo (Hz) Número de bits por muestra Cantidad de canales.
Usando la función wavread se puede leer un archivo WAV. Un sonido monofónico se guardará en una matriz de una columna, un sonido stereo una matriz de dos columnas, etc.
Si tenemos una variable de tipo int por lo general ocupará 4 bytes de memoria, los que podremos usar literalmente a nuestro antojo. Por ejemplo podemos usar este espacio como un arreglo de 4 elementos de 1 byte cada uno.
Ejemplo uso de un entero como un arreglo de caracteres:
La variable num queda como 1026 porque: | 0000 0000 |0000 0000 | 0000 0100 | 0000 0010 | | 0 | 0 | 4 | 2 |
La idea de este ejemplo es comprender mejor cómo funciona el lenguaje porque en la práctica usar un entero como un arreglo de char no hace que el código sea más simple.
Vas por un camino en medio de la selva que luego se dividirá en dos caminos, uno lleva a una tribu amigable y el otro lleva a una tribu canibal. Te encuentras con dos aborígenes de los cuales uno es de la tribu canibal y el otro es de la tribu amigable. El canibal NUNCA dice la verdad y el amigable SIEMPRE dice la verdad, no sabes cual de los dos es el canibal y sólo puedes hacer una pregunta que será respondida por los dos aborígenes. ¿Qué pregunta debes hacer para saber cuál es el camino que te conviene seguir?
El verano del 2008 comencé a programar un motor de ajedrez en C, que probablemente será un chimpacé al lado de cualquier otro motor. Aún no lo termino, pues le dedico tiempo solo los veranos y unos escazos días. En los primeros programas de ajedrez el tablero se representaba usando un arreglo, luego se comenzó a usar una técnica que revolucionó el mundo del ajedrez, los bitboards. Un bitboard es una representación del tablero usando un entero de 8 bytes, dado que cada byte tiene 8 bits se pueden representar los 64 casilleros del tablero con un bitboard. La ventaja de esta representación es que los cálculos son mucho menos costosos en memoria y CPU porque un bitboard pesa mucho menos que un arreglo de 64 carácteres y se usan operaciones a nivel de bit como el AND,OR,XOR y shift para muchos de los cálculos.
Verificar si un casillero del tablero se encuentra ocupado por una pieza usando bitboards:
typedef uint64_t bitboard; ... /* square number 0-63 (a1-h8) */ int isOccuped(bitboard board, int square) {
Para revisar si una casilla del tablero esta ocupada usando un arreglo tendriamos que recorrer el arreglo e ir revisando casilla por casilla, lo cual resulta más costoso y menos elegante.
Estaba indeciso acerca de que escribir en mi descuidado blog y decidí que a partir de hoy comenzaré a postear algunos fragmentos de código. Sé que es muy fácil encontrar buenos ejemplos acerca del tema de hoy, pero más de alguno lo habrá olvidado y lo recordará por casualidad al llegar aquí. C permite sumar o restar números enteros a un puntero, desplazando la dirección a la que este apunta la cantidad de bytes que ocupa el tipo de dato del puntero multiplicada por el número entero que se le ha sumado o restado.
#include <stdio.h> #include <stdlib.h>
int main() {
int* intArray; /* (int *) indica al compilador que en la memoria reservada se almacenaran enteros malloc (memory allocate) reserva (sizeof(int)*3) bytes de memoria sizeof(int) retorna la cantidad de bytes que ocupa un int (en mi caso 4 bytes) inicialmente intArray apunta al primer byte de memoria reservada */ intArray = (int *) malloc(sizeof(int)*3); *intArray = 1; //equivalente a intArray[0] = 1 //desplazar direccion apuntada por intArray sizeof(int) bytes intArray = intArray + 1; *intArray = 2; intArray = intArray +1; *intArray = 3; printf("%i %i %i\n",*(intArray - 2),*(intArray - 1),*intArray); /* si llamamos inmediatamente a free(intArray) obtendremos un error en tiempo de ejecucion pues intArray ya no apunta al primer byte de memoria reservada*/
//intArray debe apuntar al 1er byte de la memoria reservada intArray = intArray - 2; free(intArray);
Estoy usando Joomla y el componente Morfeoshow para referenciar a un album de Flickr desde otro sitio web, lo cual me evita usar el ancho de banda y espacio de hosting para mostrar una galería de imagenes, además de darme la comodidad de administrar las fotos en flickr, que tiene una interfaz muy comoda. Me cree una cuenta en Flickr, cree un album, y llené un formulario para solicitar un application key que es una clave que tienes que poner en la aplicación que accederá a las fotos de un album flickr, el uso de la API de Flickr es gratuito cuando no es con fines comerciales. En cuanto al componente Morfeoshow, que sirve para hacer galerías fotográficas en Joomla, tuve un pequeño problema por un molesto boton "retroceder" que salía abajo de la galería. En mi caso no lo necesitaba asi que lo desactivé. Para desactivar el boton retroceder se debe cambiar la línea: if ($params_morfeo['back'] == 0) por if ($params_morfeo['back'] == 1) Que está en components/com_morfeoshow/morfeoshow.html.php en la línea 552 (versión 1.2.0 de morfeoshow).
Soy un amante del conocimiento, lo que más me gusta hacer es aprender cosas nuevas. La capacidad de crear e imaginar, es para mí lo más bello de existir, paradójicamente esta capacidad al parecer no es una elección, sino un requisito para entrar en la categoría de "existente".