|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - tonilope
26
« en: Viernes 30 de Junio de 2006, 01:02 »
Añadiendo -Wall -O a la compilación me da el warning. "Misterio" resuelto. Gracias a todos. Salu2
27
« en: Jueves 29 de Junio de 2006, 21:16 »
Tienes razón en lo que dices del puntero. Al declararlo no apunta a ningún sitio, pero ¿cómo es que funciona si quito la línea char caca[16];? Salu2
28
« en: Jueves 29 de Junio de 2006, 19:27 »
Me sale esto:  Salu2
29
« en: Jueves 29 de Junio de 2006, 19:12 »
Empezamos... Si compilo: #include <stdio.h> int main(int argc, char **argv) { int *a; char caca[16]; *a=456; printf("%d", *a); return 0; }
al ejecutar "casca". Pero si en vez de eso compilo: #include <stdio.h> int main(int argc, char **argv) { int *a; *a=456; printf("%d", *a); return 0; }
funciona perfectamente. Pero aún hay más, si en vez de lo anterior pruebo con: #include <stdio.h> int main(int argc, char **argv) { char caca[16]; return 0; }
funciona sin problemas. ¿Alguien me explica qué pasa? ¿Es cosa del Dev-c++ (4.9.8.0), de Win2k, o de mi CPU? Os rogaría que probárais a compilarlo con Dev-c++ (he probado con LCC-Win32 y no pasa) ¿Duendes  ? Salu2
30
« en: Jueves 29 de Junio de 2006, 03:04 »
Mejor que BigInteger te recomiendo la librería GMP. http://www.cs.nyu.edu/exact/core/gmp/gmp-s...ingw-4.1.tar.gz (Versión para Dev-C++) Para instalarla: 1) Descomprimes el zip. 2) Copias el contenido de la carpeta INCLUDE del zip en la carpeta include del directorio de instalación de Dev-C++ (Lo mismo con la carpeta LIB) Cuando quieras usarla creas un proyecto en Dev-C++: BLA BLA BLA... #include <gmp.h>//Hay que linkar libgmp.a desde opciones de proyecto. BLA BLA BLA...
http://www.swox.com/gmp/gmp-man-4.2.1.pdf -> Manual oficial (inglés) Salu2
31
« en: Jueves 29 de Junio de 2006, 00:06 »
Con la función malloc() y realloc(). Supongamos que vas a leer números enteros. #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int *vector, tamanio=0; //Reservas memoria para 1 entero vector = (int*)malloc( (tamanio+1)*sizeof(int) ); //Mientras no introduzca un cero do{ printf("\nIntroduce un entero: "); scanf("%d", &vector[tamanio]; //Ampliamos el vector para 1 elemento más tamanio++; vector=(int *)realloc(vector, (tamanio+1)); }while(entero!=0); //Liberamos la memoria free(vector); return 0; }
Salu2
32
« en: Martes 27 de Junio de 2006, 17:56 »
33
« en: Martes 27 de Junio de 2006, 17:56 »
La última versión con 2 "fallos" arreglados. ahora sí que ta "perfesta" xD --> http://personales.ya.com/tonilope/chateitor.cSalu2  PD: No la modifico aquí para no darles más el coñazoa los webmasters de solocodigo.com
34
« en: Lunes 26 de Junio de 2006, 11:45 »
He arreglado un bug y añadido fecha-hora del último mensaje recibido. Salu2
35
« en: Domingo 25 de Junio de 2006, 18:46 »
Aquí te dejo una posible implementación en C. Espero que te sirva de guía. #include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc, char **argv) { int conta_jugador, conta_carta, aux, repartidas[40], cartas[4][4]; char palos[4][20], figuras[3][20]; sprintf(palos[0], "Oros"); sprintf(palos[1], "Copas"); sprintf(palos[2], "Espadas"); sprintf(palos[3], "Bastos"); sprintf(figuras[0], "Sota"); sprintf(figuras[1], "Caballo"); sprintf(figuras[2], "Rey"); srand(time(NULL)); for(aux=0; aux<40; aux++) repartidas[aux]=0; //Repartimos las cartas "de una en una" (como se haría normalmente) for(conta_carta=0; conta_carta<4; conta_carta++) { for(conta_jugador=0; conta_jugador<4; conta_jugador++) { do{ aux=rand()%40; }while(repartidas[aux]); repartidas[aux]=1; cartas[conta_jugador][conta_carta]=aux; } } //Mostramos por pantalla las cartas de cada jugador for(conta_jugador=0; conta_jugador<4; conta_jugador++) { printf("\n\nJugador %d:", conta_jugador+1); for(conta_carta=0; conta_carta<4; conta_carta++) { aux=cartas[conta_jugador][conta_carta]%10; if(aux<7) printf("\n%d de %s", aux+1, palos[cartas[conta_jugador][conta_carta]/10]); else printf("\n%s de %s", figuras[aux-7], palos[cartas[conta_jugador][conta_carta]/10]); } } return 0; }
36
« en: Viernes 23 de Junio de 2006, 00:49 »
Te voy a dar unas pistillas: 1) En total hay 40 cartas (4 palos x 10 cartas/palo = 40 cartas) 2) La función Random(x) te devuelve un número aleatorio entre 0 y x. (Al principio del programa hay que llamar a la función Randomize para que "reinicie" la secuencia de números aleatorios). 3) Cada vez que llames a Random(39), te devolverá un numerito entre 0-39. Mirarás en un array booleano (0-1) llamado cartas[] (por ejemplo) si la carta elegida ya ha sido repartida. Si todavía no había salido, pones a 1 el registro del array. Si la carta elegida ya está repartida, tendrás que volver a llamar a la función . 4) Una vez obtenido el numerito, tienes que averiguar a qué carta corresponde. Para ello utilizas la operación MÓDULO (resto de la divisón entera) y la DIVISIÓN ENTERA. Ejemplo: Supongamos que has obtenido el número 23 de forma aleatoria. Compruebas que cartas[23] sea igual a 0. Si es así, pones cartas[23]=1 y haces 23 Mod 10 = 3 Eso te dice que se trata de un 4 (ten en cuenta que 0=AS, 1=2, 2=3, etc...) Para averiguar el palo haces 23 Div 10 = 2 Luego el palo es 2=ESPADAS (0=OROS 1=COPAS, etc...). La carta es el 4 de espadas. Salu2  y suerte que es muy sencillo.
37
« en: Miércoles 14 de Junio de 2006, 19:05 »
Yo me hice este en C (posiblemente el mejor lenguaje de la historia  ) hace ya bastante: int compruebaIP(char *ip){ char octeto[4]; int contador, j, valida, num; contador=0; valida=1; num=0; while(contador<=strlen(ip) && valida) { j=0; while(ip[contador]!='.' && j<3 && ip[contador]!='\0' && valida) { if(ip[contador]>=48 && ip[contador]<=57 ) octeto[j++]=ip[contador++]; else valida=0; } octeto[j]='\0'; if(j>0 && (ip[contador]=='.' || ip[contador]=='\0') && atoi(octeto)<=255 && atoi(octeto)>=0) num++; else valida=0; contador++; } if(num!=4) valida=0; return(valida); }
1º) Comprueba que sólo haya cifras en cada octeto (como máximo 3 cifras por octeto). 2º) Comprueba que el octeto esté entre 0 y 255. 3º) Comprueba que la Ip tenga exactamente 4 octetos. Si pasa los 3 filtros, la IP es válida. Salu2
38
« en: Miércoles 14 de Junio de 2006, 18:48 »
He hecho un par de correciones rápidas muy POR ENCIMA y funciona. Aquí te lo dejo: #include <stdio.h> #include <stdlib.h> #include <string.h> struct stRegistro { char valido; //campo que indica si el registro es valido S->Valido, N->Invalido char nombre[34]; int dato[4]; }; int comparar(const void *, const void *); int Menu(); void Leer(struct stRegistro *reg); void Mostrar(struct stRegistro *reg); void Listar(long n,struct stRegistro *reg); long LeeNumero(); void Empaquetar(FILE **fa); int main() { struct stRegistro reg; struct stRegistro *array; FILE *fa; int opcion, total_registros; long numero, conta; fa=fopen("alea.dat","r+b"); //este modo permite leer y escribir if(!fa)fa=fopen("alea.dat","w+b"); //si el fichero no existe, lo crea do { opcion=Menu(); switch(opcion) { case'1': //añadir registro Leer(®); //insertar al final; fseek(fa,0,SEEK_END); fwrite(®,1,sizeof(struct stRegistro),fa); break; case'2': //mostrar registro system("cls");//system("cls"); printf("Mostrar registro:"); numero=LeeNumero(); fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET); fread(®,1,sizeof(struct stRegistro),fa); Mostrar(®); break; case'3': // eliminar registro system("cls");//system("cls"); rewind(fa); total_registros=0; system("cls"); printf("Nombre Calificacion\n"); while(fread(®,1, sizeof(struct stRegistro), fa)>0) { total_registros++; } array=(struct stRegistro*)malloc(total_registros*sizeof(struct stRegistro)); rewind(fa); conta=0; while(fread(&array[conta++],1, sizeof(struct stRegistro), fa)>0); for(conta=0; conta<total_registros; conta++) Listar(conta, &array[conta]); free(array); printf("Eliminar registro:"); numero=LeeNumero(); fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET); fread(®,1,sizeof(struct stRegistro),fa); reg.valido='N'; fseek(fa,numero*sizeof(struct stRegistro),SEEK_SET); fwrite(®,1,sizeof(struct stRegistro),fa); break; case'4': //mostrar todo rewind(fa); total_registros=0; system("cls"); printf("Nombre Calificacion\n"); while(fread(®,1, sizeof(struct stRegistro), fa)>0) { total_registros++; } array=(struct stRegistro*)malloc(total_registros*sizeof(struct stRegistro)); rewind(fa); conta=0; while(fread(&array[conta++],1, sizeof(struct stRegistro), fa)>0); qsort((void*)array, total_registros, sizeof(struct stRegistro), comparar); for(conta=0; conta<total_registros; conta++) Listar(conta, &array[conta]); getch(); free(array); break; case'5': // eliminar marcados Empaquetar(&fa); break; //NO entiendo para qué vale este case /* case'6': rewind(fa); numero=0; system("cls");//system("cls"); printf("Nombre Datos\n"); while(fread(®,sizeof(struct stRegistro),1,fa)); Listar(numero++,®); getch(); //system("PAUSE"); break; */ } }while(opcion!='0'); fclose(fa); return 0; } // Muestra un menu con las opciones disponibles y captura una opcion del usuario int Menu() { char resp[20]; do { system("cls");//system("cls"); printf("MENU PRINCIPAL\n"); printf("--------\n\n"); printf("1-Insertar registro\n"); printf("2-Mostrar registro\n"); printf("3-Eliminar registro\n"); printf("4-Mostrar todo\n"); printf("5-Eliminar registro marcados\n"); printf("6-Mostrar lista de disponibles\n"); printf("0-Salir\n"); resp[0]=getch(); } while(resp[0]<'0'&&resp[0]>'6'); return resp[0]; } // permite que el usuario introduzca un registro por pantalla void Leer(struct stRegistro *reg) { int i; char numero[6]; system("cls");// system("cls"); printf("Leer registro:\n\n"); reg->valido='S'; printf("Nombre:"); fgets(reg->nombre,34,stdin); // la funcion fgets captura el retorno de linea, hay que eliminarlo: for(i=strlen(reg->nombre)-1;i&®->nombre[i] <' ';i--) reg->nombre[i]=0; for(i=0;i<4;i++) { printf("Calificacion[%1d]:",i); fgets(numero,6,stdin); reg->dato[i]=atoi(numero); } } // muestra un registro en pantalla, si no esta marcado como borrado void Mostrar(struct stRegistro *reg) { int i; system("cls");//system("cls"); if(reg->valido=='S') { printf("Nombre: %s\n",reg->nombre); for(i=0;i<4;i++) printf("Calificacion[%1d]:%d\n",i,reg->dato[i]); } i++; getch();//system("PAUSE"); } void Listar(long n, struct stRegistro *reg) { int i; if(reg->valido=='S') { printf("[%6ld]%-34s",n,reg->nombre); for(i=0;i<4;i++) printf(",%4d",reg->dato[i]); printf("\n"); } } // lee un numero suministrado por el usuario long LeeNumero() { char numero[6]; fgets(numero,6,stdin); return atoi(numero); } // elimina los registros marcados como borrados void Empaquetar(FILE**fa) { FILE *ftemp; struct stRegistro reg; ftemp=fopen("alea.tmp","wb"); rewind(*fa); while(fread(®,1,sizeof(struct stRegistro),*fa)>0) { if(reg.valido=='S') fwrite(®,sizeof(struct stRegistro),1,ftemp); } fclose(ftemp); fclose(*fa); remove("alea.bak"); rename("alea.dat","alea.bak"); rename("alea.tmp","alea.dat"); *fa=fopen("alea.dat","r+b"); } int comparar(const void *arg1, const void *arg2) { return strcmp(((struct stRegistro*)arg1)->nombre, ((struct stRegistro*)arg2)->nombre); }
Salu2
39
« en: Miércoles 14 de Junio de 2006, 02:43 »
Pon aquí el problema que tengas. Salu2
40
« en: Miércoles 14 de Junio de 2006, 01:28 »
Hola. Por lo que puedo entender tienes un fichero con registros del tipo struct stRegistro y leyendo el código (incompleto) que has puesto intuyo que tienes definida una estructura así: struct stRegistro { char nombre[50]; int digito; };
Si esto es correcto y lo que pretendes es MOSTRAR por PANTALLA una lista del tipo: Juan 1 Antonio 34 Rosa 7 Marcos 23 ETC...ORDENADA alfabéticamente por el nombre: Antonio 34 Juan 1 Marcos 23 Rosa 7 ETC...TIENES que: 1) Declarar un array de tipo struct stRegistro para 10 (o los que necesites) elementos: struct stRegistro array[10];
2) Leer TODOS los registros del fichero y cargarlos en el array conta=0; while (fread(&array[conta], 1, sizeof(struct stRegistro), puntero_fichero) > 0) { conta++; }
3) Una vez tienes la lista cargada en el array, la ordenas: qsort((void*)array, 10, sizeof(struct stRegistro), comparar);
4) Finalmente la muestras ordenada por pantalla: for(conta=0; conta<10; conta++) printf("\n%s\t%d", array[conta].nombre, array[conta].digito);
Ejemplo completo: #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM_ELEMENTOS 10 struct stRegistro { char nombre[50]; int digito; }; int comparar(const void *, const void *); int main(int argc, char **argv) { struct stRegistro array[NUM_ELEMENTOS]; int conta; FILE *puntero_fichero; puntero_fichero=fopen("fichero.dat", "rb"); conta=0; while (fread(&array[conta], 1, sizeof(struct stRegistro), puntero_fichero) > 0) { conta++; } fclose(puntero_fichero); printf("\n\nLa lista original:\n"); for(conta=0; conta<NUM_ELEMENTOS; conta++) printf("\n%s\t%d", array[conta].nombre, array[conta].digito); qsort((void*)array, NUM_ELEMENTOS, sizeof(struct stRegistro), comparar); printf("\n\nLa lista ordenada:\n"); for(conta=0; conta<NUM_ELEMENTOS; conta++) printf("\n%s\t%d", array[conta].nombre, array[conta].digito); return 0; } int comparar(const void *arg1, const void *arg2) { return strcmp(((struct stRegistro*)arg1)->nombre, ((struct stRegistro*)arg2)->nombre); }
Adjunto un fichero que he creado con 10 registros para probar este código. Salu2
41
« en: Martes 13 de Junio de 2006, 21:55 »
Si te lías con ese ejemplo: Salu2
42
« en: Martes 13 de Junio de 2006, 21:28 »
43
« en: Martes 13 de Junio de 2006, 16:46 »
Puedes crear tantos hilos como necesites en tu programa. Aunque lo tienes todo explicado en la MSDN te lo explico por encima: #include <windows.h> /* Pones el resto de includes, defines, etc... . . . ETC...*/ DWORD WINAPI funcion_hilo_secundario(void *); int main(int argc, char **argv) { HANDLE h_HandleHilo; DWORD identificador_hilo; int numero; //Creamos el hilo secundario h_HandleHilo=CreateThread(NULL,0,funcion_hilo_secundario,(void*)&numero,0,&identificador_hilo); printf("\n\nEstoy en el hilo principal y el secundario me ha mandado un %d", numero); /*Continuamos con el hilo principal . . . ETC...*/ return 0; } DWORD WINAPI funcion_hilo_secundario(void *parametro) { //Aqui pones lo que quieres que se ejecute en el hilo secundario int *numero; numero=(int*)parametro; printf("\n\nEstoy en el hilo secundario y el hilo principal me ha mandando un: %d", *numero); *numero=8; return 0; }
El CUARTO parámetro de la función CreateThread puede ser NULL si NO le mandas ningún parámetro al hilo que creas. (Si necesitas mandarle más de un parámetro al hilo secundario, mándale UNA estructura). El parámetro que le envías al hilo secndario es por referencia para poder comunicar el hilo principal con él. Cuando termina funcion_hilo_secundario() se destruye el hilo secundario (aunque hay formas de destruir un hilo antes de que termine de forma "natural"). El hilo principal TIENE que ser el último en terminar. MUCHA más información en -> http://msdn.microsoft.com/library/default....ing_threads.aspSalu2
44
« en: Martes 13 de Junio de 2006, 03:43 »
¿Alguien sabe como puede crearse un menú que tenga una imagen vertical en el lateral al estilo de éste?:  Salu2
45
« en: Domingo 11 de Junio de 2006, 18:55 »
Prueba con: system("start documento.txt");
Salu2
46
« en: Sábado 10 de Junio de 2006, 18:47 »
Probad con: system("call documento.txt");
Salu2
47
« en: Sábado 10 de Junio de 2006, 16:11 »
Para lanzar un ejecutable externo: system("eso.exe");
Para abrir un archivo con su programa asociado: system("call cancion.mp3");
Salu2
48
« en: Jueves 8 de Junio de 2006, 17:47 »
si es como poner controles por codigo usa CreateWindowEx Jejeje, no había caído que con CreateWindowEx() se pueden crear controles. Gracias por el soplo  Salu2
49
« en: Miércoles 7 de Junio de 2006, 21:55 »
¿Alguien sabe? Salu2
50
« en: Martes 6 de Junio de 2006, 04:59 »
#include <stdio.h> #include <stdlib.h> #include <windows.h> char lee_caracter(); int main(int argc, char **argv) { char opcion; printf("\nPulsa una tecla:\n\n"); while(opcion!=13) { opcion=lee_caracter(); printf("\nHas pulsado -> %c \n", opcion); } return 0; } char lee_caracter() { int car; DWORD leidos, modo; GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &modo); SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), modo & !ENABLE_ECHO_INPUT & !ENABLE_PROCESSED_INPUT); ReadConsole(GetStdHandle(STD_INPUT_HANDLE), &car, 1, &leidos, NULL); SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), modo); return (char)car; }
Salu2
|
|
|