18 junio 2009

Array de funciones

Hola, vamos a ver algo muy loco, algo que nose si en otros lenguajes se pueda, pero en C obiamente SI Lengua

hace un tiempo descubri q se podia hacer esto y me quede xD :S :'( :P :O :O :O :Sonrisa :Sonrisa Huh? Huh? Impresionado Impresionado Impresionado Impresionado xDDD

/**********************************************************/


#include "stdio.h"

typedef int (*_func)(char *, ...);
_func func[10];

int main(void)
{
func[5] = (_func)printf;
func[5]("hola mundo!\n");
getchar();
return 0;
}
/**********************************************************/


utilize func[5] solo para demostrar que estoy trabajando con el array Lengua

no puse getchar dentro del array porque getchar esta declarado diferente que printf...
veamos una utilidad buena para esto del array de funciones:

/**********************************************************/
#include "stdio.h"

typedef float (*_func)(float, float);

float add(float a, float b)
{
return a + b;
}

float sub(float a, float b)
{
return a - b;
}

float mul(float a, float b)
{
return a * b;
}

float div(float a, float b)
{
if(b == 0)
return 0;
return a / b;
}

/*cargamos nuestro vector de funciones...*/
_func func[4] = {add, sub, mul, div};

int main(void)
{
int num = 0;
float a,b;
printf("Ingrese 2 numeros\n");
scanf("%f %f", &a, &b);
while(num > 4 || num < 1){
printf("1 - Sumar\n2 - Restar\n3 - Multiplicar\n4 - Dividir\n");
scanf("%d", &num); /*gracias Anibal xD*/
}
num--;
/*por el metodo "tradicional" tendria que venir un switch o varios ifs...*/
printf("Resultado: %f\n", func[num](a, b));
while(getchar() != '\n'); /*la forma que utiliza Ramc para vaciar el buffer xD*/
getchar();
}



/**********************************************************/

bueno, eso es todo, creo q es facil de entender

salu2!

P.D: pufff hace cuanto q no posteaba en C!! xD

21 mayo 2009

Puntos de un circulo

Hola, volviendo a los codigos en C
aca una funcion "matematica", te devuelve en un array todos (la cantidad pedida) los puntos que pertenecen a un circulo de radio X. Si quieren dibujar un circulo en la pantalla es recomendable usar una funcion especifica para eso, pero si quieren saber los puntos en coordenadas X,Y pueden usar mi funcion Lengua

/***********************************/

#include "math.h"
#ifndef PI
#define PI 3.14159265358979323846
#endif

typedef struct {
double x;
double y;
}pxy;

void circulito(double rad, double x, double y, int p, pxy *v)
/*
rad = radio
x,y = centro del circulo
p = puntos a copiar
v = vector donde colocar los puntos
*/

{
double radp = 0, m = 0;
int i;
m = 2 * PI / p;
for(i = 0; p > i; i++){
v[i].x = cos(radp) * rad + x;
v[i].y = sin(radp) * rad + y;
radp += m;
}
}
/*****************************************/

un ejemplo usando la funcion circulito:

/*****************************************/
#include "stdio.h"
/*
suponiendo que tienen la funcion circulito aca arriba
o que la pusieron en un archivo .h e incluyero ese archivo..
*/

int main(void)
{
pxy asd[4];
int i;
circulito(10,5,5,4,asd);
for(i = 0; i != 4; i++)
printf("%.5f %.5f\n", (float)asd[i].x, (float)asd[i].y);
/*leer aclaracion abajo*/

getchar();
return 0;
}
/********************************************/
ese programita les muestra puntos 4 puntos de un circulo de radio 10 y con centro en las coordenadas 5;5 si hacen las cuentas van a ver quer son correctos, dsp pueden probar con 10 puntos o 100 puntos.
en el printf tengo que hacer (float)asd[ i ].x porque sino me muestra muchos decimales o cosas raras, parece que printf trabaja con float

salu2!

01 mayo 2009

Crysis, el mejor juego de la historia

Hola, tengo que hacerle un post a este juegazo, se lo merece.

Crysis, de la empresa Crytek








es EL MEJOR JUEGO QUE JUGE EN MI VIDA!!! exelentes graficos, demaciados buenos, la historia buenisima, estas en una isla japonesa con alienijenas, el final esta muuuyyy buenooo. Una de las cosas que me gusto es que tenes el mapa para vos, no es onda el Gears Of War que tenes que seguir siempre el mismo camino, aparte de que podes resolverlas misiones a lo rambo o a lo hitman o como se te antoje.
tenes un traje especial con un par de poderes, como velocidad, escudo, fuerza e invisibilidad, caes en la isla y te enfrentas a japoneses, y pasando la mitad del juego luchas contra aliens.
los efectos especiales muy buenos, cuando llegen al final aprecien los efectos que tiene!

es uno de los pocos juegos por el que pagaría el doble!!

bueno, le tenia que dedicar un post al juego xD

salu2!

17 abril 2009

Importar funciones de windows en FASM "manualmente"

Hola,
todos seguramente para llamar a una API (como puede ser MessageBox() ) utilizan

Código:
invoke MessageBox,0,"hola","hola",0
y listo, pero hay otra forma mas compleja y que sirve "en casos de emergencia" que esta buena conocer, aparte de que se entiende un poco mejor la forma de trabajar windows con sus .exe
y si ya se piensan que voy a salir con "LoadLibrary" y "GetProcAddress" lamento decirles que no xD es mas complejo que eso.

lo que yo hize y averigue es para el FASM, pero debe de ser muuy parecido para otros compiladores

lo que vamos a hacer es crear una nueva seccion dentro del ejecutable donde vamos a poner determinada informacion para que cuando ejecutamos el .exe el windows automaticamente carge las DLLs y las direcciones de memoria de las funciones..

este es un ejemplo, creo que bastante claro, crea una ventanita con MessageBox() y llama a ExitProcess()
lo importante de todo esta al final, donde empieza la seccion .idata

;------------------------------------------------------------------;
format PE gui

entry main

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section '.text' code readable executable

main:
;aca empiezan los argumentos de MessageBox
;(se empieza por el ultimo argumento)
push 0 ;MB_OK
push hi ;texto
push hi ;texto
push 0 ;HWND_DESKTOP
call [MessageBox]
;fijense que uso [nombre], no como el invoke que no utiliza []

push eax ;salimos con lo que retorno MessageBox
call [ExitProcess]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section '.data' data readable writeable

hi db 'hola mundo!',0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;aca viene lo interesante!
section '.idata' import data readable writeable

dd 0,0,0, rva kernel_name, rva kernel_table
dd 0,0,0, rva user_name, rva user_table
;dd 0,0,0, rva dll_name, rva dll_table
;etc.
dd 0,0,0,0,0

;aca es donde se va a cargar
;la direccion de memoria de la funcion
kernel_table:
ExitProcess dd rva _ExitProcess
;LoadLibrary dd rva _LoadLibrary
;etc.
dd 0 ;para terminar la tabla

kernel_name db 'kernel32.dll',0

;aca le indicamos el nombre
;de las funciones que aparecen en la tabla
_ExitProcess dw 0
db 'ExitProcess',0
;_LoadLibrary dw 0
;db 'LoadLibraryA',0

;lo mismo pero para user32
user_table:
MessageBox dd rva _MessageBox
dd 0

user_name db 'user32.dll',0

_MessageBox dw 0
db 'MessageBoxA',0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;------------------------------------------------------------------;

fijense que lo que hacemos es crear manualmente la seccion de importacion, estamos indicandole byte por byte que es lo que tiene que escribir en esa seccion, por lo que se puede hacer con cualquier compilador (con sus respectivas nomenclaturas obiamente)

section '.idata' import data readable writeable
esas son las características de la sección
dentro de esa seccion primero colocamos el nombre de la DLL (la direccion donde esta el nombre) y donde esta la tabla, fijense que uso "rva", eso indica que en vez de colocar la direccion en memoria, coloque la direccion dentro del archivo.

creo que la estructura de la seccion es facil de entender con ese ejemplo, puse entre comentarios como agregar mas funciones o mas dlls.


no es muy practico si podemos hacerlo de la forma facil, pero creo que es interesante (por lo menos para mi lo fue), se tiene mas control sobre el archivo y se aprende mas sobre el formato PE de los .exe

salu2! Cheesy

31 marzo 2009

mi filosofia

bueno, creo que este blog se esta llendo para cualquier lado, pero esto es muy bueno y es justamente como es que yo pienzo, gracias seth por el link!

http://www.isil.org/resources/philosophy-of-liberty-spanish.swf

es un poco largo, pero me gusto :D es la primera vez que encuentro algo que es exactamente como pienzo yo...

no me quedo claro si es anarquia, capitalismo, o ambos...

salu2!