|
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 - CiRRuS
Páginas: 1 2 3 [4] 5 6 ... 9
76
« en: Martes 28 de Diciembre de 2004, 19:56 »
Muy buena la referencia. Gracias RadicalEd! Nos vemos
77
« en: Martes 28 de Diciembre de 2004, 19:54 »
Ok, si no quieres urgar en el fichero, puedes usar sscanf, que forma parte de la familia y en vez de necesitar un puntero a FILE necesita un puntero a char. ¿Quieres leer la cabecera y 5 lineas del mensaje? Prueba esto: sscanf(cadena, "FROM:%s\n\n%s\n%s\n%s\n%s\n%s\n", cabecera, linea1, linea2, linea3, linea4);
No se si irá, ahora mismo no puedo probarlo, pero es lo primero que se me ha ocurrido y creo que es ilustrativo. Ya nos cuentas. Nos vemos
78
« en: Lunes 27 de Diciembre de 2004, 22:13 »
He estado probando tu código. La función feof la estas usando al revés, debes poner: Con eso entrarás en el bucle while (si el fichero existe). Pon atención a tu fread, puesto que sizeof(cad) te devuelve 256, y estas pidiendo 20 bloques de 256 bytes. Si es lo quieres, todo correcto (a mi me dio problemas  ) Espero haberte ayudado. Nos vemos!
79
« en: Lunes 27 de Diciembre de 2004, 00:29 »
¿Has probado a usar las funciones fscanf, fprintf y compañía? Si no recuerdo mal, son muy útiles para leer buferes establaciendo un determinado formado. Por ejemplo: char cabecera[200]; FILE *f f = open... fscanf(f, "FROM: %s\n", cabecera);
Te leería la cabecera del primer mensaje. Prueba a ver si te resulta útil. Nos vemos
80
« en: Lunes 27 de Diciembre de 2004, 00:24 »
Buenas de nuevo. Como dije, parece mentira pero en vacaciones (y mas en navidad) es cuando menos encuentra uno tiempo para dedicarse a sus cosas  . Ya he modificado la ultima implementación, en lo relativo a la creación y modificacion de las pilas. Ahora cada pila es representada como un nodo dentro de una lista enlazada. Cada uno de esos nodos contiene un puntero a la pila en sí, además de un identificador para poder ser localizada. Bueno, creo que la cosa esta casi lista. Espero posibles correcciones. Nos vemos
81
« en: Sábado 25 de Diciembre de 2004, 15:41 »
En que plataforma estas trabajando? Linux? Windows? ¿que compilador usas? ¿En C o C++? Especifica un poco pa poder concretarte con certeza la respuesta. Nos vemos
82
« en: Jueves 23 de Diciembre de 2004, 16:03 »
Aunque este post esté en un foro en concreto, me gustaria también expresar mi agradecimiento a todos los componentes del foro por su ayuda y por estar siempre ahi, este foro es el mejor de todos!!!! No tiene ni punto de comparacion con ningun otro, este es punto de referencia. Espero que aprovechemos todos muy bien las fiestas y disfrutemos en familia de la Navidad. Sed bueno para recibir muuuchos regalos  Feliz Navidad a todos!!! Nos vemos
83
« en: Miércoles 22 de Diciembre de 2004, 17:18 »
Ya estoy de nuevo. Con esto de las fiestas, uno tiene menos tiempo para entretenerse, aunque deberia ser al reves  . Para el problema que tenia acerca de qué ocupaba cada nodo de la pila (realmente es cuánto ocupaba a lo que apuntaba cada nodo de la pila) he incluido un campo en los nodos que especifica el tamaño (en bytes) de los datos que son apuntados por el campo elem. Así cuando duplico una pila, se cuanta memoria debo reservar y por consiguiente cuánta debo duplicar para cada nodo. La función afectada ha sido apilar, que contiene un parámetro más indicando el número de bytes que ocupan los datos que se apilan. El usuario deberá tener cuidado especialmente con los datos de tipo cadena, pues si usa la función strlen para establecer el contenido, estará pasando por alto el '\0' de fin de cadena, y al duplicar (como uso la funcion memcpy) solo copiaré exactamente la longitud de la cadena, sin incluir el '\0'. Asi que ya he implementado las funciones de duplicarPila y concatenaPila (la segunda usa a la primera). Tambien he modificado lo del control de errores. Como me has comentado JuanK, he creado una variable global (grrrr, tantas globales...) que se llama errorPila que contiene el error que se ha producido, y las funciones que provocan el error devuelven -1 en caso de haber pasado algo. Si el usuario de la librería quiere comprobar el error, puede acudir a la variable errorPila para ver que ha pasado. En la función crearPila he desestructurado un poco la implementación para el control de errores, creo que se ve mas claro poner en medio un return -1, porque si empiezo a poner if...else y tabulo, me quedo sin pantalla  . De hecho, como comente, mi costumbre era esa, hacer el return cuando quisiera, pero pensandolo estructuradamente, y ya que intento hacer una implementación para el "mundo en general" mejor hacerlo "bien", como he tenido que hacer en funciones como duplicaPila y demás. Sigo pensando que el modo que tengo de crearPilas es ineficiente, y tendre que modificarlo para optimizarlo. Por ahora uso un array, pero esta claro que debo controlar mejor los "huecos" de ese array cuando se liberen. He estado pensando en las funciones de ordenar el contenido de las pilas, me parece que no terminan de ser muy útiles y pueden ser bastante complicadas. La finalidad de usar una pila es para usar el concepto de LIFO (last input first output), ¿quien va a querer ordenarlas? Para eso, que use una lista enlazada (que tambien me he propuesto implementar, en cuanto acabe esto  ). Además, en algún momento tendre que echar el freno, si no, no termino de implementar nunca la librería. ¿Qué opinais? Así que centrémonos en lo que llevo hecho. ¿Alguna función más que sea realmente útil para el manejo de pilas? Por ahora, lo que pretendo modificar es la administración de las pilas (creación y demás). Estoy abierto a cualquier opinion para refinar esto. Adjunto un ZIP con el fichero .h y el fichero .c que si no voy a saturar este post con tado XCODE. Muchas gracias a todos!!! Nos vemos
84
« en: Martes 21 de Diciembre de 2004, 21:18 »
Eugenienko, no es una hoja de arbol  , si te fijas bien, es un tio con un disquete en sus manos por encima de la cabeza, lo puedes ver mejor en el logotipo de solocodigo, al lado del adorno navideño. Admin, atento a la pregunta de RadicalEd: PERO NO TODAS LAS VECES SALE POR QUE ADMIN? Nos vemos
85
« en: Martes 21 de Diciembre de 2004, 00:09 »
Es una pijadilla, pero opino como Soultaker, quedaría mas "guapo", jejeje Nos vemos
86
« en: Martes 21 de Diciembre de 2004, 00:06 »
Bueno, ya estamos de nuevo por aqui. Bienvenido rir3760!  gracias por tu ayuda. He implementado las funciones destruyePila e inviertePila. La variable num_pilas la he convertido en global segun vuestras recomendaciones, además es static pq conviene que solo tenga alcance dentro del codigo de pila.c. Toda llamada a malloc esta comprobada para impedir posibles fallos. Veamos algunas puntualizaciones que estoy encontrando y creo que puede provocar reestructurar y alterar el codigo: - Dado que los nodos de las pilas almacenan un puntero a los datos (y dicho puntero es void para intentar un poco de genericidad) el hecho de duplicar una pila me resulta un poco confuso  . ¿Como duplico los nodos de una pila si no se cuanto espacio debo reservar para los nuevos nodos? ¿Puedo usar un malloc con el tipo de datos void?. Por ejemplo, tengo una pila con dos enteros, dichos enteros en la pila realmente son apuntadores a void hacia la zona de memoria donde estan estos valores. Si ahora duplico la pila, duplico los nodos y con ello los apuntadores, pero sigo apuntando a la misma zona de memoria!!! los datos son los mismos!. ¿Como puedo saber cuanta memoria ocupa ese puntero a void (que realmente apunta a int) para poder reservar memoria nueva y duplicar su contenido? Creo que una buena solución sería saber que tipo de datos se almacena en los nodos, como anteriormente comentaste JuanK, eso ayudaría a reservar memoria y a duplicar su información. ¿Que opinais? - El problema anterior tambien me ha surgido al intentar implementar la funcion de concatenar pilas. Dado que aunque concatene pilas, la pila resultante tendra nuevos nodos, vale, pero sin embargo dichos nodos tendran apuntadores a los datos que tambien estan siendo apuntados por las pilas que han sido concatenadas. - Me parece que voy a tener que cambiar el concepto de la variable global pilas. Actualmente es un array a las pilas que estan siendo usadas, y para acceder a una determinada pila el usuario hace uso de su indice (que recibe al llamar a crearPila) y trabajar con la pila. Sin embargo, si por ejemplo tengo tres pilas (la 0, la 1 y la 2) y ahora borro la 1. El numero de pilas usandose es 2, y tendria un hueco en el array en la posicion 1 que podria reutilizarse. Sin embargo, tal y como esta orientado el programa, la variable num_pilas siempre se incrementa para dar nuevas pilas (peligro de desbordamiento en un futuro!!). Estoy pensando en mantener una lista enlazada que crezca por cada pila que se solicite y que contenga un identificador entero para identificar la pila dentro de la lista. Esto permitiría hacer más llevadero el control de las pilas y su borrado. ¿Se os ocurre algo mejor? ¿Creeis que debería refinar el control de los huecos en el array? El codigo por ahora queda así: Archivo pila.h <!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td> XCODE </td></tr><tr><td id='XCODE'><!--exc1--> /* IMPLEMENTACION DE UNA PILA "GENERICA" * -------------------------------------------------------- * La siguiente implementacion permite el uso de una pila lo mas generica * posible. Existe una estructra nodo que almacena un puntero a la * informacion que desea introducirse a la pila. La varaible **pilas almacena * las pilas que estan siendo usadas. * La funcion creaPila() devuelve un entero para el acceso a la pila creada * que sera usado en las demas funciones. El uso del entero puede asemejarse a * un descriptor de archivos. */ #include <stdio.h>/* Estructura que actuara como NODO */struct nodo { /* Elemento a almacenar */ void *elem; /* Puntero al elemento siguiente */ struct nodo *sig; }; /* Puntero a las pilas que estan siendo utilizadas */struct nodo **pilas; /* Variable que mantiene el numero de pilas usadas */static int num_pilas = 0; /* Crea una pila. Devuelve el entero para controlarla */int creaPila(); /* Introduce un elemento en la pila especificada */void apila( int pila, void *elemento); /* Desapila un elemento de la pila especificada */void *desapila( int pila); /* Recupera el primer elemento de una pila, sin desapilarlo */void *recupera( int pila); /* Destruye la pila que se la pasa como parametro */void destruyePila( int pila); /* Invierte la pila que se le pasa como parametro */void inviertePila( int pila); <!--xc2--></td></tr></table><div class='postcolor'><!--exc2--> Archivo pila.c <!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td> XCODE </td></tr><tr><td id='XCODE'><!--exc1--> /* Implementacion de una pila generica */#include "pila.h"/* Crea una pila. Devuelve el entero para controlarla */int creaPila(){ struct nodo **aux; int i; if((aux = ( struct nodo **) malloc( sizeof( struct nodo *)*num_pilas)) == NULL) { perror( "Error al crear la pila"); exit( 1); } for(i = 0; i < num_pilas; i++) aux[i] = pilas[i]; if((pilas = ( struct nodo **) malloc( sizeof( struct nodo *)*(num_pilas + 1))) == NULL) { perror( "Error al crear la pila"); exit( 1); } num_pilas++; for(i = 0; i < num_pilas - 1; i++) pilas[i] = aux[i]; pilas[num_pilas- 1] = NULL; return num_pilas- 1; } /* Introduce un elemento en la pila especificada */void apila( int pila, void *elemento) { struct nodo *aux; if((aux = ( struct nodo *) malloc( sizeof( struct nodo))) == NULL) { perror( "Error al apilar"); exit( 1); } aux->elem = elemento; aux->sig = pilas[pila]; pilas[pila] = aux; } /* Desapila un elemento de la pila especificada */void *desapila( int pila) { void *aux; struct nodo *act; if(pilas[pila] != NULL) { aux = pilas[pila]->elem; act = pilas[pila]; pilas[pila] = pilas[pila]->sig; free(act); return aux; } else return NULL; } /* Recupera el primer elemento de una pila, sin desapilarlo */void *recupera( int pila) { return pilas[pila]->elem; } /* Destruye la pila que se la pasa como parametro */void destruyePila( int pila) { struct nodo *aux, *aux1; aux = pilas[pila]; while(aux != NULL) { aux1 = aux->sig; free(aux); aux = aux1; } pilas[pila] = NULL; } /* Invierte la pila que se le pasa como parametro */void inviertePila( int pila) { int pilaAux; struct nodo *aux, *aux1; aux = pilas[pila]; pilas[pila] = NULL; while(aux != NULL) { apila(pila, aux->elem); aux1 = aux->sig; free(aux); aux = aux1; } } <!--xc2--></td></tr></table><div class='postcolor'><!--exc2--> La cuestion de ordenar los valores de las pilas lo dejo para un poco más adelante, pues ahora ya me estoy planteando bastante cosas y prefiero perfilar bien esto. Empece con la implementación de una pila porque pensaba que sería lo más fácil, ya estoy viendo que tiene su intrigulis, jejeje. Veremos cuando pase a la implementacion "generica" de listas simples enlazadas, doblemente enlazadas y demás... Bueno todo se andará. De nuevo, muchas gracias, pretendo contruir una implementación que nos ayude a todos a usar estas estructuras de datos en cualquier situación sin tener que implementarlas cada vez que las necesitemos. Gracias! Nos vemos
87
« en: Lunes 20 de Diciembre de 2004, 11:32 »
Uff uff, vayamos por partes  . Antes que nada gracias por centrarte y haber analizado mi codigo. Vayamos al lio. Como ves, la implementacion necesitaba de opiniones acerca de posibles mejoras y correcciones, y agradezco mucho tus opiniones. Las funciones destruyePila, copiaPila, concatenaPila e inviertePila las veo realmente útiles para una libreria de pilas, asi que me propongo implementarlas. Las funciones que comentas para ordenar numericamente/alfabeticamente solo serían posibles si se conociera el tipo del contenido de los nodos de la pila. Cosa que se puede subsanar con la idea que has propuesto de incluir un campo en los Nodos para indicar el tipo del dato que se incluye. Esto dara mucho juego porque así también se podrán asegurar que los elementos de una pila son del mismo tipo, por ejemplo.Tambien lo veo muy útil, lo implementaré. En cuanto a tu segundo post y las anotaciones acerca del codigo: - Sobre el punto 1: He estado revisando algunas fuentes y creo que la palabra reservada static si que esta contemplada en el lenguaje C. Hice ese "trapicheo" para evitar introducir variables globales, con una (que apunta a la estructura de listas) creo que es suficiente. - Sobre el punto 2: Ves mas correcto hacer: pilas = (struct nodo **) malloc(sizeof(struct nodo *)*(num_pilas+1)); num_pilas++;
El resultado es el mismo, quizas es mas elegante? ¿Te referias a eso?. Ok, comprendo la idea, la variable representativa del numero de pilas debe estar en consonancia con el numero de pilas reservadas en memoria, en mi codigo, el programa podría fallar el malloc y no tener la memoria reservada, entonces el valor de num_pilas sería incorrecto. ¿Van por ahi los tiros? - Sobre el punto 3: Es verdad, debo controlar en todo momento si los malloc y free estan actuando convenientemente. Quizas esto sea un vicio de hacer practicas en la universidad con prisa. Lo tendre que revisar y corregir. - Sobre el punto 4: Jejeje, tienes razon, si estamos en programacion estructurada, que nuestros procedimientos sigan esa filosofia. Ok, de acuerdo. (Esto me ha recordado a uno de mis profesores  ). Bueno, me pongo al lio en cuanto pueda y comento mis evoluciones. Muchas gracias JuanK!!!! Eres un genio! Nos vemos
88
« en: Domingo 19 de Diciembre de 2004, 23:14 »
Hola, dado que la mayoria de los programadores trabajamos mucho con estructuras de datos dinámicas (sobre todo para las practicas de la universidad), me he propuesto crear una serie de implementaciones "genericas" para las estructura de datos dinamicas mas comunes. He empezado por la implementación de una pila, pues es la más facil en cuanto a funciones a utilizar. El siguiente código administra el uso de una serie de pilas que el usuario puede crear. El codigo funciona, al menos en las pruebas que he realizado, os invito a probarlo si quereis. Pero sobre todo, me gustaria que le echarais un vistazo, no solo a la implementación, sino tambien a las funciones principales que facilita esta "mini-libreria". ¿Os resultan suficientes? Si fuerais vosotros los que usarais esta implementación, ¿añadiriais alguna función mas?. Aqui os lo pongo: Archivo pila.h <!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td> XCODE </td></tr><tr><td id='XCODE'><!--exc1--> /* IMPLEMENTACION DE UNA PILA "GENERICA" * -------------------------------------------------------- * * La siguiente implementacion permite el uso de una pila lo mas generica * posible. Existe una estructra nodo que almacena un puntero a la * informacion que desea introducirse a la pila. La varaible **pilas almacena * las pilas que estan siendo usadas. * La funcion creaPila() devuelve un entero para el acceso a la pila creada * que sera usado en las demas funciones. El uso del entero puede asemejarse a * un descriptor de archivos. */ #include <stdio.h>/* Estructura que actuara como NODO */struct nodo { /* Elemento a almacenar */ void *elem; /* Puntero al elemento siguiente */ struct nodo *sig; }; /* Puntero a las pilas que estan siendo utilizadas */struct nodo **pilas; /* Crea una pila. Devuelve el entero para controlarla */int creaPila(); /* Introduce un elemento en la pila especificada */void apila( int pila, void *elemento); /* Desapila un elemento de la pila especificada */void *desapila( int pila); /* Recupera el primer elemento de una pila, sin desapilarlo */void *recupera( int pila); <!--xc2--></td></tr></table><div class='postcolor'><!--exc2--> Archivo pila.c <!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td> XCODE </td></tr><tr><td id='XCODE'><!--exc1--> /* Implementacion de una pila generica */#include "pila.h"/* Crea una pila. Devuelve el entero para controlarla */int creaPila(){ static int num_pilas = 0; struct nodo **aux; int i; aux = ( struct nodo **) malloc( sizeof( struct nodo *)*num_pilas); for(i = 0; i < num_pilas; i++) aux[i] = pilas[i]; num_pilas++; pilas = ( struct nodo **) malloc( sizeof( struct nodo *)*num_pilas); for(i = 0; i < num_pilas - 1; i++) pilas[i] = aux[i]; pilas[num_pilas- 1] = NULL; return num_pilas- 1; } /* Introduce un elemento en la pila especificada */void apila( int pila, void *elemento) { struct nodo *aux; aux = ( struct nodo *) malloc( sizeof( struct nodo)); aux->elem = elemento; aux->sig = pilas[pila]; pilas[pila] = aux; } /* Desapila un elemento de la pila especificada */void *desapila( int pila) { void *aux; struct nodo *act; if(pilas[pila] == NULL) return NULL; aux = pilas[pila]->elem; act = pilas[pila]; pilas[pila] = pilas[pila]->sig; free(act); return aux; } /* Recupera el primer elemento de una pila, sin desapilarlo */void *recupera( int pila) { return pilas[pila]->elem; } <!--xc2--></td></tr></table><div class='postcolor'><!--exc2--> Como veis, la implementación intento que sea genérica utilizando punteros a void. Pero usando C, esa "genericidad" es un poco superficial, pues además acarrea otros problemas como es la uniformidad de los datos que contiene la pila. Esto podría llevarnos a largas disertaciones acerca de la reutilización, modularidad y demás del lenguaje C y de mi implementación, pero no pretendo ir por esos derroteros (aunque si alguno se presta, que no dude en comunicarmelo  ). La implementacion es sencilla y corta, y solo quiero saber vuestra opinion acerca de su utilidad y cosas que podrían faltar y demás. Por supuesto, si detectais algun error, no dudeis en comunicarmelo. Muchas gracias! Nos vemos
89
« en: Domingo 19 de Diciembre de 2004, 11:17 »
Soy de la opinion de mgitano: "Windows es poco serio". Muchas veces parece mentira que detras de una enorme empresa se hagan cosas estramboticas y sin embargo con Linux las cosas se hagan mas con la cabeza. Aunque todo tiene su excusa: A windows se le ponen plazos de entrega, y a Linux... no. Para el escritorio y el usuario de a pie, por supuesto, Windows. A Linux le queda todavia para adecuarse a las facilidades de Windows, y ponerte a configurar el sistema para hacer funcionar una simple webcam en Linux puede resultar imposible para un usuario novato. Para servidores, probablemente (como dice vradok) Linux sea mas utilizado, pero creo que esto se aplica sobre todo a servidores de Internet en empresas de servicios de informacion. En las grandes empresas, los empleados siguen batallando con Windows, sus dominios, sus bosques y arboles de dominios y demas. Como dice JuanK, Linux puede ser muy seguro, pero cuando sea mucho mas utilizado (llegara ese dia?) la gente "mala" se volcara a buscarle fallos. La cuestion es si los podra encontrar o no, eso ya es cuestionable. Cada dia que pasa Linux es mas seguro, al menos esta mas depurado y mejorado, asi que tambien es un arma de doble filo el que la gente tarde en conocer Linux. Cuando se conozca, quizas sea el sistema operativo mas probado y depurado (mas que windows seguro). Y una cosa, actualizar un Windows es cosas de crios, hasta uno de 5 años puede darle al Windows Update. Ahora, dile al crio que te actualice Linux!!! En fin, estas son la tipicas discusiones de nunca acabar: Linux vs Windows. Personalmente, me encanta Linux, y siempre que puedo uso Linux, para "abrir mi mente"  . Sin embargo, Windows sigue formando parte de mis ratos de ocio y de rutina informatica. Nos vemos
90
« en: Sábado 18 de Diciembre de 2004, 22:32 »
La funcion strtok devuelve un puntero al siguiente token y modifica la cadena que recibe como parametro (cuidado con eso), creo que no reserva memoria nueva para el puntero que devuelve. ¿Por qué no intentas probar con la función strdup para duplicar las cadenas que te devuelve strtok? Quiza eso te solucione el problema. Espero haberte ayudado, si no es asi, no dudes en contarnos que te pasa. Nos vemos
91
« en: Sábado 18 de Diciembre de 2004, 22:23 »
Vale, ya vi el nuevo post... Nos vemos
92
« en: Sábado 18 de Diciembre de 2004, 22:20 »
¿Y como es esa otra forma que lo has hecho para que vaya bien al imprimir pero que no vaya bien al guardar las variables?
93
« en: Sábado 18 de Diciembre de 2004, 22:18 »
Pascal?? Pero ahi tiene que ver algo el lenguaje de programacion C?? Estamos en el foro de C/C++... Nos vemos
94
« en: Sábado 18 de Diciembre de 2004, 22:16 »
Es cierto JuanK, eso me recuerda a unas conferencias que estuvieron haciendo los de Microsoft por mi universidad. La plataforma .NET pretende llegar a cualquier electrodomestico o dispositivo que sea capaz que computar algo, pero asi, cualquier cosa. Segun lo que estuvieron contando, "solo" hace falta instalar el conjunto de herramientas de .NET framework y a partir de ahi la cosa es de color de rosa  .. Estuvo genial, tendriais que ver como vendían la plataforma .NET y demás, el conferenciante venia con su movil con Windows, pda con Pocket PC... Nos hizo demostracion de todo, jejejeje, resulto curioso lo "facil" que parece todo, se parecen a los magos, pq lo hacen todo rapido y corriendo como si no quisieran que los asistentes al evento vieran las complicaciones que tiene eso y observaran directamente el resultado final. La verdad es que la idea es muy buena, solo falta que se adecúe al mercado y a la situacion. Lo contaba como anecdota  Nos vemos  EDITO: Por cierto JuanK, ta guapo el avatar!!!
95
« en: Sábado 18 de Diciembre de 2004, 22:11 »
Necesito que alguien me deje un programa echo con ficheros y con estructuras en C Que quieres que interpretemos con esa frase? Creo que seria mejor que preguntes las dudas que te surjan, por muy generales o chorras que te parezcan, aqui nadie te come. Nos vemos
96
« en: Viernes 17 de Diciembre de 2004, 22:01 »
No conozco mucho del tema, pero lo poco que he oido hablar y leido por ahi, tampoco se puede decir que exista un lenguaje estandar para la programacion de los dispositivos, y en algunos, simplemente no se si existira. Conozco electrodomesticos que disponen de una maquina virtual java para poder ejecutar un mini-sistema operativo en java. Otros que llevan linux incrustado (lenguaje C de por medio seguro). Algunos moviles llevan el sistema operativo simbian (se escribe asi?), pero desconozco en que lenguaje esta programado. Las palmOne se construyen basicamente sobre C y C++ creo. Pero creo que para algunos aparatos, como los mandos de la television, simplemente son circuitos que responden a unos determinados eventos. En lo que respecta al diseño de los circuitos y demas, supongo que usaran algun programa como PSpice o algo asi. No se, a mi tambien me pica la curiosidad ahora que lo dices, alguien sabe algo mas concreto? Nos vemos
97
« en: Viernes 17 de Diciembre de 2004, 21:56 »
Supongo que con esas funciones estaras cronometrando el numero de segundos que han transcurridos (y de paso, puedes precisar tambien centesimas si quieres). Para conseguir minutos y horas a partir de estos segundos, simplemente debes dividir  . No se si existe alguna funcion estandar q a partir de los segundos te de minutos y horas, nunca la he usado, quiza alguien la conozca. Nos vemos
98
« en: Viernes 17 de Diciembre de 2004, 21:52 »
Si al hacer el printf no te imprime nada en el servidor y es como si no lo leyera, es que la funcion recv es no bloqueante, y si no hay datos que leer no se espera a que lleguen. Para hacerlo bloqueante o no puedes usar la funcion fcntl, o utilizar la funcion select para comprobar si hay datos para leer durante un determinado periodo de tiempo. Espero haberte ayudado Nos vemos
99
« en: Viernes 17 de Diciembre de 2004, 18:09 »
Para programar un servidot web BASICO deberas construir una aplicacion que cumpla con el estandar HTTP1.0 o HTTP1.1. No te asustes, simplemente deberas escuchar las peticiones que te lleguen por el puerto 80 y atenderlas. Las peticiones te llegan en modo texto, y tienen el siguiente formato general: GET <pagina web que te piden> seguido de unos campos comunes que son: - User-Agent: Informa del tipo de navegador que emplea el cliente - Referer: URL del documento desde el que se accedió al actual - If-Modified_Since: Sólo se quiere el documento si se ha modificado - Accept: Lenguajes aceptados por el navegador - Host: Servidor al que el cliente envía la petición - Connection: Se emplea para mantener la conexión - Accept: Tipos de datos aceptados por el cliente Debes prestar atencion a la pagina que se te solicita despues del GET. La buscas, la abres y la vuelcas para enviarsela al cliente. Previamente debes establecer la cabecera: HTTP/1.1 200 OK el 200 es el codigo de que todo funciona correctamente, hay un conjunto de codigos que especifican el error (te suena el 404 de page not found? pues el servidor web lo dice en ese campo) Otros campos de la cabecera de respuesta son: - Location: Nueva localización del documento solicitado - Server: Nombre y versión del software servidor - Date: Día y hora en la que se transmite el documento - MIME-version: Versión del protocolo MIME usada en el servidor - Content-Length: Longitud en bytes del cuerpo de la respuesta - Content-Type: Tipo MIME que identifica el tipo de dato de la respuesta - Last-modified: Fecha y hora en la que se modificó por ultima vez Si todo esta bien (los sockets o streams cerrados, segun el lenguaje que uses), el cliente recibirá la pagina web y la mostrara al cliente. Como ves, esto sirve para implementar un servidor muy basico, detalles de permanencia de sesiones, cookies y demas van a parte (Aunque tendrias que ver la facilidad con la que se pueden crear cookies). Bueno, ya nos cuentas, vaya rollo te he metido  Nos vemos
100
« en: Viernes 17 de Diciembre de 2004, 17:54 »
Si mira, visita C con clase y ahi podras consultar las funciones que hemos comentado y algunos ejemplos. Si tienes algun problema o duda no dudes en decirlo Nos vemos
Páginas: 1 2 3 [4] 5 6 ... 9
|
|
|