|
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 - adocrates
1
« en: Jueves 14 de Octubre de 2004, 21:22 »
Lo resolvi !!! En vez de system(cmd), puse este codigo : signal(SIGCHLD, SIG_IGN); signal(SA_NOCLDWAIT, SIG_IGN); if( (ppid = fork()) == -1 ) { return(-1); } else if( ppid == 0 ) { status=execlp(cmd, cmd, NULL); sleep(1); exit(0); } do { wpid = wait(&status); } while( wpid != -1 && wpid != ppid ); signal(SIGCHLD, SIG_DFL); signal(SA_NOCLDWAIT, SIG_DFL);
2
« en: Martes 12 de Octubre de 2004, 18:55 »
Tengo un inconveniente, estoy desarrollando un demonio en Unix que ejecuta en background un programa administrador de colas de procesos, el cual ante algun cambio de estado en la BD ejecuta en background programas asociados que distribuyen y procesan los datos de la BD :
Para ello, utilizo system() y del shell nohup (para independizar del proceso padre) y & (para demonizar el proceso que se ejecuta) :
prg demonio() ... otras cosas system("nohup administradordecolas > administradordecolas.out 2>&1 &"); ... demas cosas
prg administradordecolas() ... if(estado == 1) system("nohup programaasociado > programaasociado.out 2>&1 &"); ...
PERO, quedan procesos defunct (zombies), que por lo que entiendo, quedan asi porque el proceso padre llamador se muere antes que el hijo.
Modifique el programa, cambie el system() por fork() y execvp() y mas encima agregue signal(SIGCLD, wait_on_child); que se supone que espera el proceso hijo y lo termina adecuadamente :
wait_on_child() { int status; while( wait3(&status, WNOHANG, (struct rusage *) 0) > 0 ) ; }
Lamentablemente, el problema persiste.
Agradeceria alguna informacion para resolver esto. Gracias.
3
« en: Viernes 19 de Diciembre de 2003, 03:44 »
Tengo algunos problemillas con rollback y procedimientos almacenados.
Existen EXCEPTION para ROLLBACK ?
Gracias.
4
« en: Lunes 14 de Julio de 2003, 17:29 »
Tengo que documentar un sistema en MSDOS y los pantallazos estan en archivos con formato de memoria de video texto, o sea son de 4000 bytes porque son 80 columnas * 25 filas * 2 bytes (atributo + caracter). Es el mismo que usa gettext() y puttext() de Turbo C.
Alguien conoce un utilitario que transforme esto a jpg u otro formato para ponerlo en el informe ?
Gracias
5
« en: Lunes 14 de Julio de 2003, 17:25 »
Tengo que documentar un sistema en MSDOS y los pantallazos estan en archivos con formato de memoria de video texto, o sea son de 4000 bytes porque son 80 columnas * 25 filas * 2 bytes (atributo + caracter). Es el mismo que usa gettext() y puttext() de Turbo C.
Alguien conoce un utilitario que transforme esto a jpg u otro formato para ponerlo en el informe ?
Gracias.
6
« en: Lunes 24 de Febrero de 2003, 21:41 »
divide para conquistar
7
« en: Lunes 24 de Febrero de 2003, 21:37 »
Hay 2 macros : __LINE__ /* %d */ __FILE__ /* %s */
y Linux incorporo :
8
« en: Lunes 24 de Febrero de 2003, 21:32 »
Vamos, y cual es la complejidad ?
9
« en: Miércoles 11 de Diciembre de 2002, 21:05 »
10
« en: Jueves 28 de Noviembre de 2002, 15:17 »
Puede que me quede corto con la explicacion, pero la idea es escribir una NUEVA funcion para input de datos, USANDO getch(), que captura codigos de teclas especiales y teclas normales... OK ? El nombre de la funcion la pones tu, (NO sabia que existia YA una funcion getstr), entonces pongamosle GetString(), que tiene 4 parametros : El buffer donde queda la data, un largo maximo, y para posicionamiento, una columna y una fila : int GetString(char *buf, int len, int col, int row)
Quise darte a entender, con los [...] que podias agregar mas parametros, como una mascara de input, para por ejemplo, solo aceptar numeros, eso lo dejo a tu criterio y necesidad. Ahora, para filtrar las teclas especiales, lease de funciones, flechas y control, declaramos un arreglo long con los codigos de dichas teclas, QUE ESTAN definidos en el .h, ejemplo, KEY_F(3) [yo le puse F3], KEY_ENTER, y todas las que quieras que interrumpan el input, o para que puedas controlar alguna accion asociada a esa tecla, entendebu? En el ciclo for, filtramos lo que leimos en la var c, si es tecla especial, retorna el codigo de la tecla, si no es, verificamos que sea una caracter alfanumerico (A-z,0-9), si es asi lo asignamos al buffer y aumentamos el indice y en la siguiente posicion asignamos 0 que es el caracter de fin de string. Entretanto controlamos que el indice no sobrepase el largo maximo. Te aconsejo que leas o traduzcas bien los mensajes de error y warnings. Agrega a la compilacion la opcion -Wall y -O3, elimina TODOS los warning y SIEMPRE estaras seguro que tu aplicacion esta Wendy... Salu2. PD: Este foro tiene un chat vacio, si quieres, avisame una hora y parlamentamos live... No estaria demas que publicaras el codigo para cachurearlo...
11
« en: Miércoles 27 de Noviembre de 2002, 18:40 »
Ariel, es mas simple de lo que piensas, tienes que substraer el codigo un nivel mas (esto es estilo de programacion bottom-up), o sea poner una funcion entremedio. Tienes que hacer una funcion que lea un string y retorne, por ejemplo, 0 ok, F3, etc... y luego controlar que hacer (en codigo pulento, que funca solo en teoria... ) : long EXITKEYS[9]={ F3, ESC, ENTER, ... , -1 }; ... int getstr(char *buf, int len, int col, int row, ...) { int ind=0,j, c; ... //me posiciono en la pantalla ... while(ind < len) { c=getch(); for(j=0;EXITKEYS[j]!=-1;j++) { if(EXITKEYS[j]==c) { return(c); } } if(isalpha(c) ) // etc { buf[ind++]=c; buf[ind]=0; } } return(0); } ... ret=getstr(str_nombre,len_nombre,10,15,...); if(ret==F3) { finish(); } ...
Tb le puedes agregar mascara para formateo, ej input de numero solamente, etc... Avisa kotejue... PD. Ta wendy el ejecutable... promete...
12
« en: Miércoles 27 de Noviembre de 2002, 05:17 »
CELESTE QUE LE CUESTE !!!
ÑO SEÑOR !!!
[Censurado]
[Editado por el Administrador del Foro]
El lenguaje que has utilizado es inaceptable en este foro.
Si no estás de acuerdo en algo siempre puedes dar tu opinión pero por favor, házlo con educación.
13
« en: Miércoles 27 de Noviembre de 2002, 05:13 »
Es un poco largo lo que pides, pero puedes mirar en http://www.totex.cl, ahi hay tareas de listas y cosas... Suerte:D
14
« en: Miércoles 27 de Noviembre de 2002, 04:25 »
Busco un formateador de HTML, que ordene, tabule y alinee los tags, etc... Tengo que revisar una pagina y es un lio, todo desordenado y entrecortado...!!! Encontre el web del Doctor HTML, pero es mucha parafernalia para lo simple que necesito. Gracias.
15
« en: Miércoles 27 de Noviembre de 2002, 03:22 »
Usa qsort : char **array_de_cadenas; ... int compare_array_de_cadenas( const void *arg1, const void *arg2 ) { return(strcmp( *( char** ) arg1, *( char** ) arg2 )); } ... qsort( (void *)array_de_cadenas, (size_t)numero_de_elementos, sizeof( char * ), compare_array_de_cadenas ); ...
Avisa kotejue...
16
« en: Miércoles 27 de Noviembre de 2002, 02:22 »
No sabia de ncurses, busque y encontre un manual que dice : Entrada (Input)
La función complementaria de addch() es getch() que, si el eco esta activo, llamara a addch() para sacar el carácter por pantalla. Por ello el terminal necesita saber que hay en el terminal a todas horas, si los caracteres están siendo sacados por pantalla, el tty debe estar en modo crudo o cocinado (cbreak). Por ello inicialmente el terminal ha activado el eco y esta en modo cocinado, uno o el otro ha sido cambiado antes de llamar a getch(); de otro modo, la salida del programa será impredecible
Cuando necesita aceptar una línea orientada a la entrada en una ventana, las funciones wgetstr() y semejantes están disponibles. Hay incluso una función wscanw() que puede hacer scanf()(3)- estilo de análisis multi-campo en la entrada de la ventana. Estas funciones pseudo-lineas-orientadas activan el eco mientras se ejecutan.
El código ejemplo anterior utiliza la llamada a keypad(stdscr, TRUE) para permitir el soporte de mapeado de teclas-funciones. Con esta característica, el código getch() ve el flujo de entrada como secuencias de caracteres que corresponden a flechas y teclas de funciones. Estas secuencias son devueltas como valores pseudo-carácter. Los valores de #define devueltos son escuchados en la curses.h. El mapeo de secuencias a valores #define es determinado mediante capacidades de teclas en la correspondiente entrada del terminal de información. Asi que mira el curses.h, revisa la funcion, hace un programita que testee las teclas, identifica la que quieres controlar y avisa como te fue...
17
« en: Martes 26 de Noviembre de 2002, 21:51 »
Me gusta contestar y ayudar a los demas, pero me molesta la ingratitud... quiero saber las notas que nos hemos sacado con las tareas que he ayudado a solucionar... !!! Seria interesante habilitar algun procedimiento para probar el verdadero interes en participar y... que exista feed back !!! Por ejemplo, contestar para ver la respuesta o posts con tips (que puede ser un atributo tipo insertar algo). Inscribirte para ver un tema popular y tener una cantidad prudente de posteos para participar (un poco extremo). Tambien que sea obligado ingresar un email valido y enviar la inscripcion al foro a dicho email, hay mucha gente sin email y entonces como funciona lo de ¿Recibir confirmación por e-mail de nuevas respuestas?... Estoy viendo que algunos pasteles pusieron un post y NUNCA sabran que se lo constestaron, Y ESO ES DEFRAUDANTE para quien se tomo el tiempo y molestia de contestar... NO HAY NADA MAS FUSTRANTE QUE HACER ALGO PARA NADA... Incluso podrias habilitar una opcion para que te lleguen por email todos los post entrantes del tema en el que estas inscrito... El chat no existe...!!! Seria interesante organizar en una fecha y hora, algun debate en vivo con los moderadores o algun sensei invitado... En fin NO todos tenemos tiempo para atender periodicamente el foro y algunas respuestas NUNCA seran respondidas, pero es entretenido ver que algunos problemas tienen solucion y puedes facilitar la vida a los demas. PD. Me acorde, se puede cambiar el tag para italica ? o Deshabilitarlo con el tag para codigo ? o que no sea una sola letra... ej. [italic] en vez de (es que si los usas como indice en un codigo... se ve italico)...
18
« en: Martes 26 de Noviembre de 2002, 20:58 »
Hice copy paste en el Dev 4.9.6.0 y compilo bien... Ejecutando g++.exe... g++.exe "C:pruebasPRUEBA2.CPP" -o "C:pruebasPRUEBA2.exe" -s -I"C:Dev-Cppinclude" -I"C:Dev-Cppincludeg++-3" -I"C:Dev-Cppinclude" -L"C:Dev-Cpplib" Ejecución Terminada Ejecución Terminada Sin Novedad
Ahora para ver la ejecucion tienes que ir a modo comando, en el dir donde quedo el ejecutable y ejecutarlo... C:PRUEBAS>prueba2.exe El valor de num1 es 4 El valor de num3 es 6 num1 + num3 = 10
Lo de los compiladores depende de que quieras desarrollar, te aconsejo el VC porque son de los mismos que crearon windows:D y es gratis si es para fines educativos. Tambien existe el gcc win32 de CYGWIN, el Borland C++ y otros mas que hay por ahi, buscalos en la red...
19
« en: Lunes 25 de Noviembre de 2002, 19:05 »
No entendi mucho que es lo que quieres... Quieres un administrador de archivos o de registros de archivos... ?
20
« en: Lunes 25 de Noviembre de 2002, 18:57 »
No conocia el Dev C++, lo instale y LO PRIMERO QUE NO ME GUSTO, ES QUE ESTA HECHO EN DELPHI !!! Yo uso Visual C (por lo amplio y amigable) y a veces uso el gcc de CYGWIN, use el Turbo C pero es de 16 bits y ahora este Devcecito es bonito pero... hay que probarlo... Quize ver el help y no estaba el hlp... Vi los include y encontre el conio.h y un conio.c (Mira el dir C:Dev-Cppinclude), entonces en esa libreria viene el fuente de gotoxy, clrscr y otros mas... [es como una API (Aplication Program Interface) que es como una traduccion de funciones, para usar la libreria conio de Turbo C, si la miras veras que llama a otras funciones] Para resolver el probelma agrege la linea marcada (copia el codigo completo) : #include <stdio.h> #include <conio.h> #include <conio.c> // ESTA LINEA int main() { gotoxy( 20, 10 ); printf( "Hola" ); }
Y listo... Avisa como te fue...
21
« en: Viernes 22 de Noviembre de 2002, 16:09 »
#include <stdio.h> #define N_CUADROS 8 #define N_SALTOS 8 #define CIERTO 1 #define FALSO 0 static int tablero_virtual[N_CUADROS+4][N_CUADROS+4]; static int dx[N_SALTOS]={ 2, 1,-1,-2,-2,-1, 1, 2}; static int dy[N_SALTOS]={ 1, 2, 2, 1,-1,-2,-2,-1}; static void inicia_tablero(void); void presenta_tablero(void); static int ensaya_movimiento(int n,int x,int y); int main(void) { inicia_tablero(); printf("ncalculando, espere por favorn"); if(ensaya_movimiento(1,2,2)) printf("Resultado:"); else printf("No hay soluci¢n"); presenta_tablero(); return 0; } static void inicia_tablero(void) { int i,j; for(i=0;i<N_CUADROS+4;i++) { for(j=0;j<N_CUADROS+4;j++) { if(i>1 && i<N_CUADROS+2 && j>1 && j<N_CUADROS+2 ) tablero_virtual[i][j]=0; else tablero_virtual[i][j]=-1; } } } void presenta_tablero(void) { int i,j; for(i=0;i<N_CUADROS+4;i++) { printf("n"); for(j=0;j<N_CUADROS+4;j++) { if(tablero_virtual[i][j]!=-1) printf("%4d",tablero_virtual[i][j]); } } return; } static int ensaya_movimiento(int n,int x,int y) { int i,u,v; tablero_virtual[x][y]=n; if(n==(N_CUADROS*N_CUADROS)) return CIERTO; else { for(i=0;i<N_SALTOS;i++) { u=x+dx[i]; v=y+dy[i]; if(tablero_virtual[u][v]==0) { if(ensaya_movimiento(n+1,u,v)) return CIERTO; } } } tablero_virtual[x][y]=0; return FALSO; }
22
« en: Viernes 22 de Noviembre de 2002, 16:06 »
Espero que te sirva... /* +-------------------+ | SALTO DEL CABALLO | +-------------------+ Este programa realiza lo siguiente: Se da un tablero de nxn con n*n cuadros. Un caballo -que puede moverse según las reglas del ajedrez- se sitúa en el cuadro de coordenadas (x0,y0). Se pide encontrar, si existe, un recubrimiento del tablero completo, o sea, calcular un circuito de n*n-1 movimientos de forma que cada cuadro del tablero sea visitado exactamente una vez. La solución a este problema está basado en el método de tanteo sistemático (intento y error). La función más importante es ensayar() cuyo pseudocódigo es el siguiente: <PRINCIPIO ensayar> REPETIR seleccionar el nuevo candidato de la lista de futuros movimientos SI aceptable ENTONCES SI tablero no lleno ENTONCES LLAMAR ensayar nuevo movimiento SI no acertado ENTONCES borrar la anotación anterior FINSI FINSI FINSI HASTA movimiento acertado O no hay más posibilidades <FIN> Observaciones sobre el código: 1) Estudiar la función ensayar() a partir de este pseudocódigo. 2) El método utilizado para obtener el movimiento del caballo de (x1,y1) hasta (x2,y2) es sumar a (x1,y1) los vectores de diferencias. Los vectores de diferencia dif_x y dif_y contienen la diferencia de la coordenada x e y respectivamente desde la posición actual del caballo. Veáse con el siguiente tablero: 0 6 0 7 0 5 0 0 0 8 0 0 C 0 0 4 0 0 0 1 0 3 0 2 0 C representa la posición del caballo; los números del 1 al 8 respresentan los 8 posibles movimientos. El primer movimiento se obtiene: x2 = x1 + 2; y2 = y1 + 1; 3) La macro tab() se utiliza para trabajar con los índices de 1 a n en la matriz del tablero en vez de con los índices reales 0 a n-1. 4) La condición ®tablero no lleno¯ se expresa mediante ®i < n*n¯ donde i es el número de movimiento del caballo actual y n la dimensión del tablero. 5) El significado de las asignaciones a los elementos de la matriz es: tab (x, y) = 0; /* el cuadro <x,y> no ha sido visitado */ tab (x, y) = i; /* el cuador <x,y> ha sido visitado en el movimiento i-ésimo (1 ó i ó n*n) */ NOTA: Con un dimensión de la matriz superior a 4, el proceso de encontrar la solución es muy lento. Por eso se ha puesto el límite en 8 aunque ya con este número el proceso es superlento (en términos de media, ya que puede dar la casualidad de que se encuentre la solución en los primeros intentos). */ /* Ficheros a incluir: */ #include <stdio.h> /* printf () */ #include <conio.h> /* getch () */ #include <stdlib.h> /* exit () */ /* Macros: */ #define NUM_MOVIMIENTOS_POSIBLES 8 #define NMAXIMO 8 #define BOOLEAN int #define TRUE 1 #define FALSE 0 #define ESC 27 #define en(x,x1,x2) ((x) >= (x1) && (x) <= (x2)) #define tab(i,j) tablero[(i)-1][(j)-1] /* tab(1,1) es en realidad tablero[0][0] */ /* Variables globales: */ int n, tablero[NMAXIMO][NMAXIMO]; BOOLEAN movimiento_acertado; int dif_x [NUM_MOVIMIENTOS_POSIBLES] = { 2, 1, -1, -2, -2, -1, 1, 2 }, dif_y [NUM_MOVIMIENTOS_POSIBLES] = { 1, 2, 2, 1, -1, -2, -2, -1 }; /* Prototipos de las funciones: */ void proceso (void); void ensayar (int i, int x, int y); /* Definiciones de las funciones: */ void main (void) { do { printf ("nnVUELTA DEL CABALLO:n "); proceso (); printf ("nPulsa cualquier tecla para repetir " "o ESC para salir. "); } while (getch () != ESC); } void proceso (void) { register int i, j; int x0, y0; for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) tab (i, j) = 0; printf ("nIntroduce dimensión del tablero (1 ó n ó %d, n > 4 es " "muy lento): ", NMAXIMO); do { n = getch () - '0'; } while (! en (n, 1, NMAXIMO)); putch (n + '0'); printf ("nFila inicial (1 ó x ó %d): ", n); do { x0 = getch () - '0'; } while (! en (x0, 1, n)); putch (x0 + '0'); printf ("nColumna inicial (1 ó y ó %d): ", n); do { y0 = getch () - '0'; } while (! en (y0, 1, n)); putch (y0 + '0'); tab (x0, y0) = 1; printf ("nn"); ensayar (2, x0, y0); if (movimiento_acertado) for (printf ("nnLA SOLUCION ES:n "), i = 1; i <= n; i++) { for (j = 1; j <= n; j++) printf ("%2d ", tab (i, j)); printf ("n "); } else printf ("nnNO HAY SOLUCION.n"); } void ensayar (int i, int x1, int y1) { int movimientos_realizados = 0; int x2, y2; const ncuadrado = n * n; static long unsigned num_movimientos_caballo = 0; do { movimiento_acertado = FALSE; x2 = x1 + dif_x[movimientos_realizados]; y2 = y1 + dif_y[movimientos_realizados]; movimientos_realizados++; if (kbhit ()) if (getch () == ESC) exit (1); printf ("Número de movimientos del caballo (ESC para salir): " "%ldr", ++num_movimientos_caballo); if (en (x2, 1, n) && en (y2, 1, n) && tab (x2, y2) == 0) { tab (x2, y2) = i; if (i < ncuadrado) { ensayar (i+1, x2, y2); if (! movimiento_acertado) tab (x2, y2) = 0; } else movimiento_acertado = TRUE; } } while (! movimiento_acertado && movimientos_realizados != NUM_MOVIMIENTOS_POSIBLES); }
23
« en: Viernes 22 de Noviembre de 2002, 02:31 »
int i,j, n=7; for(i=1,j=n-1; i< n && j > 0 && i<j; i++,j--) { if(i+j==n) { printf("%d=%d+%dn",n,i,j); } }
Ahora para hacer que los numero de las sumas se descompongan mas, tendria que ser recursiva y menejar de alguna manera la salida... Suerte...
24
« en: Viernes 22 de Noviembre de 2002, 02:18 »
struct diccionario { char *palabra; struct diccionario next; }; struct diccionario *Diccionario[26]; struct diccionario *pDic; ... //suponemos que la palabra ya esta parseada y en MAYUSCULAS letra=palabra_nueva[0]; if(Diccionario[letra-'A']==NULL) { Diccionario[letra-'A']=malloc(sizeof(struct diccionario)); Diccionario[letra-'A']->next=NULL; Diccionario[letra-'A']->palabra=strdup(palabra_nueva); } else { for(pDic=Diccionario[letra-'A'];pDic->next!=NULL;pDic=pDic->next); //llegamos al ultimo pDic=malloc(sizeof(struct diccionario)); pDic->next=NULL; pDic->palabra=strdup(palabra_nueva); }
Espero que te sirva... OjO No olvides hacer un ciclo final liberando palabra y diccionario.
25
« en: Jueves 21 de Noviembre de 2002, 14:25 »
En estos momentos no se me ocurre como generar un laberinto, pero si se me ocurre la estructura que podria soportarlo : struct laberinto { int yapase; int salida; struct laberinto *norte, *sur, *este, *oeste; }
Ahora hablas de arboles binarios, y esos tiene 2 direcciones, izquierda y derecha. Independiente de la estructura, la busqueda y/o recorrido es en forma recursiva. Lamento no poder asistirte mas, no tengo tiempo para desarrollar el problema...
|
|
|