|
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 - carmamezo
Páginas: 1 ... 6 7 [8] 9 10
176
« en: Lunes 11 de Abril de 2005, 13:47 »
Hola a todos, voy a poner un ejemplo de cómo manejar un fichero de forma aleatoria, algo sencillo como pedir al usuario que indique una posición y mostrársela, y permitir que cambie el registro. Unos consejos: No deberías llenar el archivo con espacios al inicio. Si quieres añadir archivos al final del fichero una vez creado, lo puedes hacer abriendo el archivo de la sigte manera: fopen("archivo","a"); de esta forma se abre el archivo para añadir cosas al final, el apuntador apuntará al final del fichero. El código de ejemplo es el sigte: #include <stdio.h> #include <stdlib.h> typedef struct { char nombre[100]; int telefono; }datos; void main() { int posicion; char op; FILE *pf; datos ficha; pf=fopen("c:\\archivo.txt","r+");//abrir el fichero para leer y escribir if(pf==NULL) { printf("\n\aError abriendo el archivo."); getchar(); return; } fseek(pf,0L,SEEK_END);//lleva el apuntador del fichero al final printf("\nTotal de registros: %d",(int)ftell(pf)/sizeof(ficha));//Muestra el nº total de registros en el fichero printf("\nRegistro a visualizar (1-%d): ",(int)ftell(pf)/sizeof(ficha)); scanf("%d",&posicion); rewind(pf);//corre el puntero del fichero al inicio no sería necesario...Para que se vean todas las fuciones fseek(pf,sizeof(ficha)*(posicion-1),SEEK_SET);//se mueve el puntero hasta la posición que se ha pedido fread(&ficha,sizeof(ficha),1,pf); printf("\n\n\tNombre: %s\n\tTelefono: %d",ficha.nombre,ficha.telefono); fflush(stdin); do { printf("\n\n\tDesea cambiar el registro? (s-n): "); scanf("%c",&op); fflush(stdin); op=tolower(op); }while(op!='s' && op!='n'); if(op=='s') { printf("\n\n\tIntroduce nuevo nombre: "); gets(ficha.nombre); printf("\n\tTelefono: "); scanf("%d",&ficha.telefono); fseek(pf,-(signed)sizeof(ficha),SEEK_CUR);//retroceder un registro a partir del que estamos pq al hacer fwrite nos hemos movido una posición hacia delante. fwrite(&ficha,sizeof(ficha),1,pf); } fclose(pf); }
Para inicializar el fichero y probar el programa ejecuta el sigte código: #include <stdio.h> #include <string.h> typedef struct { char nombre[100]; int telefono; }datos; void main() { FILE *pf; datos ficha; int i; pf=fopen("c:\\archivo.txt","w"); strcpy(ficha.nombre,"Jose"); for(i=0;i<20;i++) { ficha.telefono=i; fwrite(&ficha,sizeof(ficha),1,pf); } fclose (pf); }
Simplemente escribe 20 registros con el nombre de Jose y con un telefono que va de 0 a 19. En fin con esto ya puedes hacer casi cualquier cosa con ficheros... Creo. Un sludo.
177
« en: Domingo 10 de Abril de 2005, 11:57 »
en la librería time.h tienes varias funciones, te puede servir la función localtime() que te da la hora del SO, la del reloj de windows, la que tienes configurada GMT+-xx. La forma de usarla es la sigte: #include<stdio.h> #include<time.h> void main() { struct tm *tiempo; time_t t_tiempo; time(&t_tiempo); tiempo=localtime(&t_tiempo); printf("FECHA: %02d/%02d/%d\nHORA: %02d:%02d:%02d",tiempo->tm_mday,tiempo->tm_mon,\ tiempo->tm_year+1900,tiempo->tm_hour,tiempo->tm_min,tiempo->tm_sec); getchar(); }
Un saludo.
178
« en: Miércoles 6 de Abril de 2005, 20:43 »
Hola, Pues que yo sepa si se puede, por ejemplo se puede hacer lo sigte: printf("Hola " "a todos"); sin problemas. De todas formas el caracter \ permite separar elementos de tal forma que el código sea más legible: printf("Hola \ a todos"); Ambas funciones son admitidas y funcionan, se suele usar mucho con llamadas a funciones un poco complejas (como las de la API de windows) que reciben infinidad de parámetros. Un saludo.
179
« en: Martes 5 de Abril de 2005, 21:57 »
Hola a todos, no sé si te servirá de ayuda, pero voy a intentar explicarte el funcionamiento de un encoder óptico: Encoder incremental: consta normalmente de un disco unido al eje de giro,con una única pista con ranuras, la resolución del encoder la da el nº de ranuras que hay en el disco (la distancia etre ranuras se llama paso). Normalmte se usan dos diodos led y dos fototransistores colocados a ambos lados del disco y separados mediante un nº entero de pasos más 1/4 de paso. Lo que ocurre es que cuando hay una ranura, el haz de luz pasa del diodo led al fototransistor, esto produce un valor alto de salida, mientras que cuando no hay ranura, el haz se corta y el fototransisto no recibe nada, valor bajo de salida. Lo de que los dos fototransistores estén separados 1/4 se usa para saber el sentido de giro. Cuando gira en un sentido hay un desfase de 1/4 de periodo entre medidas y cuando gira en sentido contrario hay un desfase de 3/4 de periodo. Por tanto la salida es una onda cuadrada, cuya duración dependerá del paso y de la velocidad de giro del rotor. Esta salida suele ir a un contador de pulsos, que dependiendo del sentido de giro, se incrementará o decrementará, de aqui se envia al sistema-conttrolador. El inconveniente es que cuando se resetea o se apaga el sistema, se pierde la referencia y no se puede saber la posición en la que está, de ahí que normalmente se lleve a un fin de carrera y a partir de hay se resetee el contador y se empieze a contar (de ahí que muchas máquinas en el arranque vayan a una posición inicial, para reconfigurar los encoders incrementales). Encoder absoluto: Utiliza un disco con varias pistas con distintas muescas, cada muesca es un código binario gray, que identifica una única posición, de ahí que no pase nada al resetear, pues no hace falta referenciar la medida. Da en todo momento la posición en la que está. Se usan tantas pistas como bits tenga de resolución, y por tanto son necesarios tantas parejas de leds-fototransistores como pistas haya. El código gray tiene la particularidad de que en cada variación sólo cambia un bit del conjunto, lo cual evita posibles problemas de lectura por desalineamientos. Te añado una tabla para convertir de gray a binario y a decimal con 4bits: gray: binario: decimal: 0000 0000 0 0001 0001 1 0011 0010 2 0010 0011 3 0110 0100 4 0111 0101 5 0101 0110 6 0100 0111 7 1100 1000 8 1101 1001 9 1111 1010 10 1110 1011 11 1010 1100 12 1011 1101 13 1001 1110 14 1000 1111 15 En fin, espero que te sirva de algo lo explicado. Suerte
180
« en: Martes 5 de Abril de 2005, 20:45 »
Si quieres un fichero con tus caracteres ASCII puedes hacer lo siguiente: abrir un fichero y escribir en él todos los caracteres junto con su código decimal, luego lo imprimes y así ya lo tienes para la sigte vez: #include <stdio.h> void main() { FILE *pf; int i; if((pf=fopen("C:\\ascii.txt","w"))==NULL) { printf("\n\a\tNo se puede abrir el archivo."); exit(-1); } fprintf("Valor decimal:\tCaracter ASCII:"); for (i=0;i<256;i++) fprintf(pf,"\n%d\t%c",i,i); fclose(pf); }
Y ya está, ya tienes todos los códigos en c:\ascii.txt, para que lo imprimas y lo uses la próxima vez. Un saludo.
181
« en: Lunes 4 de Abril de 2005, 09:52 »
Hola, te respondo a la primera pregunta, si, el switch sólo te permite trabajar con constantes, por tanto la mejor solución para ese programa serían los if. Ahora bien, se puede implementar mediante switchs tu programa: void main() { int x; printf("\nIntroduce valor: "); scanf("%d",&x); switch(x<0) { case 1: printf("\ny=%d",x*x+5); break; case 0: switch(x<=2) { case 1: printf("\ny=%d",3*x-1); break; case 0: printf("\ny=%d",x*x-4*x+5); break; } } }
Un saludo.
182
« en: Viernes 1 de Abril de 2005, 13:41 »
Te recomiendo que si lo haces en Windows uses la API de este sistema operativo, toda la información la tienes en: msdn comunicación serieUn saludo.
183
« en: Viernes 1 de Abril de 2005, 10:44 »
Hola a todos, pues la verdad es que pasar de hexadecimal a decimal es mucho más fácil de lo que parece.... Tú único problema es el binario, recuerda que cualquier dato se guarda en tu PC en binario, por tanto lo único que necesitas es poder recoger y sacar los nºs en decimal, hexadecimal y binario. Muy bien, para poder recoger un nº en hexadecimal y convertirlo a decimal lo único que tienes que hacer es lo sigte: int a; printf("\nIntroduce un numero en hexadecimal: "); scanf("%x",&a);//lo recoges en hexadecimal printf("\nEl numero %x en decimal es: %d",a,a);
Pues ya ves que no tiene ningún misterio, ahora para pasar de decimal a hexadecimal, es igual pero al revés: int a; printf("\nIntroduce un numero en decimal: "); scanf("%d",&a); printf("\nEl numero %d en hexadecimal es: %x",a,a);
Si lo que quieres es printear los numeros hexadecimales en mayúsculas: A en vez de a. Lo que tienes que hacer es cambiar el %x por %X. Y ya está, tan fácil como eso. El binario es más complicado, pues no hay ningún %b que printee y escanee en binario.... Al menos eso creo. Por tanto deberías hacer la operación paso a paso por tus medios. Los operadores shift (>>,<<) que te permiten correr bits de una vble y los operadores AND (&) y OR (|) que te permiten hacer operaciones lógicas a nivel de bit dentro de una vble te serán de gran ayuda sin duda. El resto te lo dejo a ti. Un saludo.
184
« en: Miércoles 16 de Marzo de 2005, 09:18 »
Por lo que he entendido lo que quieres es recorrer la matriz en forma de espiral desde fuera hacia dentro y en el sentido de las agujas del reloj. Siguiendo con el ejemplo anterior (reducido a 3*3): 1 -> 2 -> 3 | 4 -> 5 6 | | 7 <- 8 <- 9
El problema es que los nºs finales tienen que mostrarse antes que los iniciales, para ello podrías usar la función gotoxy() que permitía printear en unas coordenadas de la pantalla, de tal forma que no tendrías problemas. Esta función se encuentra en dos.h (creo), mi compilador (Visual Studio) no la soporta y por ello yo no la tengo, pero creo recordar que cuando usaba el mítico Borland de pantalla azul estaba. En caso de que no puedas usar esta función deberías usar el truco de printear y borrar pantalla rapidamente para que el usuario crea que los nºs están saliendo uno tras otro, cuando lo que estás haciendo es sacar todos al mismo tiempo, una cosa como: borrar pantalla; printear el 1º; esperar unos ms; borrar pantalla; printear el 1º; esperar unos ms; printear el 2º; borrar pantalla; printear el 1º,2º; esperar; printear el 3º; .... No es la mejor solución pero es la única que se me ocurre. Un saludo y suerte
185
« en: Jueves 3 de Marzo de 2005, 13:48 »
Hola. según tengo entendido, el PIC16f876 cuenta con un conversor de 5 canales, si usas 3 patitas para el ctrol de la LCD aun te quedan 2 canales para conectar un par de sensores.... Si lo que quieres es conectar más sensores... te recomiendo que intentes programar el PIC en C, en la página de microsystem puedes encontrar la librería para controlar la LCD, tan sólo hay que cambiar los pines definidos, y seguro que haces el proyecto entero en un par de horas por muy complicado que sea. Yo he usado el PIC C compiler CCS y es una auténtica pasada las cosas que se pueden hacer en muy poco tiempo: sensor de temperatura + LCD + comunicacio serie -> programado en 2 horas... Seguro que los programadores de ensamblador me llamarán de todo, pero cuando el tiempo de trabajo del programador prima sobre el tiempo de ejecución del sistema.... Un saludo.
186
« en: Domingo 16 de Enero de 2005, 11:54 »
 Como bien dice iori2029 estas vbles son elementos del antiguo MS-DOS estrechamente relacionados con la línea de comandos. Como iori2029 ya explicó el significado de las vbles yo me limitaré a realizar un ejemplo: Supongamos que vamos a hacer una función muy simple, suma o resta de dos valores, nos interesa que el usuario pueda darnos los valores sin necesidad de usar funciones de entrada y salida. La solución sería bien fácil: #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[], char *envp[]) { if(argc<4) { printf("Este programa recibe tres parámetros:\n" "La operación a realizar (suma/resta)\n" "El primer operando y el segundo."); return (-1); } if(strcmp("suma",argv[1])==0) { printf("%d",( atoi(argv[2]) )+( atoi(argv[3]) ) ); return(0); } else if(strcmp("resta",argv[1])==0) { printf("%d",( atoi(argv[2]) )-( atoi(argv[3]) ) ); return(0); } else { printf("\nLos parametros no son correctos"); return(-1); } }
para ejecutar el programa , basta ir abrir una ventana de MS-DOS movernos hasta el directorio donde está el programa y ejecutarlo de la sigte manera: supongamos que el programa se llama prueba y está en c:\: c:\prueba suma 6 8 14 ----> nos devolvería la suma de ambos c:\prueba resta 9 3 6 -----> nos devolvería la resta de ambos Si observas bien argv[] contiene 4 elementos, esto se debe a que argv[0] siempre contiene la ruta al programa, en este caso contendría: argv[0]="C:\prueba.exe" por tanto aun cuando no se le pasan argumentos mediante la línea de comandos argc siempre contendrá 1 y argv[0] siempre contendrá la ruta al programa. Un saludo
187
« en: Viernes 10 de Diciembre de 2004, 22:15 »
Hola, telnet te proporciona una guia perfecta, intenta acceder a tu cuenta através de telnet (hay infinidad de manuales de telnet en la red para acceso a correo). Lo mismo debes hacer con tu programa en C, el servidor acepta comandos como: user xxxxx -> nombre de usuario pass xxxxx -> password de la cuenta list -> lista todos los mensajes (devuelve el nº de mensajes) top n,m -> muestra las m primeras lineas del mensaje nº n dele n -> elimina el mensaje n (no se elimina hasta que se sale) quit -> sale del servidor (borra los mensajes borrados mediante dele) ... Cada vez que envias un comando el servidor responde con +OK xxxxx si todo va bien y -ERR si ocurre un error. Por ejemplo: user nombre -> envias el nombre de usuario+OK password required for user nombre -> el servidor respondepass 12345 -> envias el password-ERR Password incorrect -> devuelve -ERR cuando hay un errorEn fin, lo mejor es que pruebes ejecutando desde inicio->ejecutar (bajo Windows): telnet "nombre_del_servidor" 110y hagas todas las pruebas para ver como responde el servidor a cada uno de los comandos. Es realmente fácil hacer un cliente de correo en C, incluso un antispam... si tienes ganas y tiempo... Un saludo.
188
« en: Viernes 10 de Diciembre de 2004, 21:44 »
Gracias Juank, me refería a las funciones citadas en mi mensaje, no a todas las funciones de la API de windows. Un saludo.
189
« en: Viernes 10 de Diciembre de 2004, 20:42 »
He mirado poco, pero quizás la función EndDialog() te resulte útil. Por lo que he leido se puede llamar incluso desde otro proceso. Necesitas pasarle el handle de la ventana.... intenta sacarlo mediante la funcion FindWindow(). Todas las funciones pertenecen a la API de windows y se incluyen en la librería windows.h. Un saludo
190
« en: Viernes 10 de Diciembre de 2004, 20:09 »
Hola, Tambien puedes probar a hacer un fflush(stdin) despues de cada scanf(), limpia el buffer de entrada estandar (teclado). De tal forma que aquellas teclas que devuelven dos chars te quedas con la primera y eliminas la segunda, de esta manera no te molesta no recibiéndose en la siguiente llamada a scanf(). Por cierto, creo que se encuentra en la libreria stdio.h Un saludo.
191
« en: Domingo 5 de Diciembre de 2004, 23:54 »
Hola a todos, hacia mucho tiempo que no posteaba...
Los hilos se gestionan en windows mediante MSVC/C++, a través de la librería process.h : _beginthreadex(): lanza un hilo: una funcion de tipo unsigned int __stdcall "nombre_hilo" () _endthreadex():finaliza el hilo
Una de las cosas mas interesante es que _beginthreadex recibe como parametro una opcion donde se le puede indicar que el proceso comenzará suspendido: CREATE_SUSPENDED, pudiendose activar luego con una llamada a la funcion ResumeThread(). Caben destacar muchas mas funciones como: CreateThread(), (windows.h)(que es igual al _beginthreadex de antes dando peores resultados en visual C). GetThreadPriority(), SetThreadPriority(), GetThreadPriorityBoost() y SetThreadPriorityBoost() que permiten ajustar la prioridad de nuestro hilo. SuspendThread(), suspende el hilo y lo deja "dormido" ResumeThread(), reanuda la ejecucion del hilo. ExitThread(), funcion a la que debe llamar todo hilo cuando termina para indicar que ha terminado.. TerminateThread(), mata a un hilo desde otro a lo bestia.... cuando no hay otra posibilidad. Para esperar a que un hilo finalice podemos llamar a la funcion WaitForSingleObject() pasandole el HANDLE del hilo creado y el tiempo a esperar.
Para comunicacion entre procesos lo mas sencillo es usar eventos: CreateEvent() , crea un evento con un nombre, puede crearse para que esté desactivado al principio o no y para que el reset sea manual o debido a algo. OpenEvent(), abre un evento ya creado (normalmente desde otra aplicacion a la que ha creado el evento). SetEvent(), activa un evento. ResetEvent(), desactiva un evento. PulseEvent(), activa un evento, activa todas las tareas que estaban a la espera y lo resetea de nuevo. Para esperar a un evento se usan las funciones: WaitForSingleObject(), espera a un solo evento WaitForMultipleObjects(), espera a varios eventos. Con estas dos funciones puedes detener uno de los hilos y dejarlo a la espera de que el otro active un evento.
Una funcion muy importante que siempre se me olvida: CloseHandle(), para cerrar todos los descriptores, ya sean de los hilos como de los eventos.
En fin con todo esto te debiera servir para la ejecución de hilos bajo windows, de todas formas para comunicar hilos no es necesario que uses eventos, pues todos comparten el mismo espacio de memoria (siempre que se lancen desde el mismo proceso) y por tanto podrías usar vbles globales o incluso direcciones de memoria para la comunicación entre hilos, no confundir con la pila dado que cada hilo tiene su propia pila y por tanto las vbles locales son locales al hilo, ahora bien se pueden pasar por referencia todas las vbles que se quieran.
Se puede, por ejemplo, usar una vble global iniciada a 0 y esperar a que uno de los hilos lo ponga a uno para seguir ejecutando. OJO, son hilos y se ejecutan en paralelo hay que tener cuidado pues un evento deja al hilo muerto esperando a que se active, NO CONSUME CPU, si se usan vbles globales no se deben hacer bucles a la espera de que una vble se active sin incluir dentro un Sleep() para no consumir recursos innecesarios.
En fin, esto es un poco de lo que sé sobre hilos bajo windows, yo programo con el Visual Studio de Microsoft, teoricamente las funciones debieran poderse usar bajo cualquier compilador, pero no lo sé, igual conociendo el nombre de las funciones puedes buscar algo en Borland....
Bueno espero que sirva de ayuda a alguien al menos...
Un saludo a todos!!
192
« en: Jueves 15 de Julio de 2004, 10:06 »
La última respuesta de Juank es la que más rápido te va a permitir usar funciones trigonométricas, en la programación de dispositivos PDS (procesamiento digital de señales) se usan una serie de tablas donde se guardan los valores de senos y cosenos. En C debieras de hacer lo mismo, cargar esta tabla en memoria a través de un malloc (un array con todos los valores de todos los ángulos, al menos del primer cuadrante... el resto salen por una serie de reglas trigonométricas sencillas) La búsqueda en este array se hace de manera muy rápida y por tanto satisface tus necesidades de velocidad... Ahora bien es un coñazo realizar el código. De todas formas te puedo asegurar que los algoritmos incluidos en las librerías de C han sido programados por gente bastante lista y normalmente es dificil mejorarlos... Suerte.
193
« en: Miércoles 7 de Julio de 2004, 11:40 »
Lo siento creo que cometí un error en el post, pues las funciones las declaré globales.... Compruebénlo por favor. Sorry (aún estoy dormido)
194
« en: Miércoles 7 de Julio de 2004, 11:36 »
Bueno en C teoricamente también es posible.... Como ejemplo un botón: La creación de hilos en C se hace mediante la función "_beginthreadex" (que permite cierta independencia con respecto al SO) y su estructura es la siguiente: unsigned long _beginthreadex(void *seguridad, unsigned int tamaño_pila, unsigned int (__stdcall *rutina)(void *), void *parametro, unsigned int opciones, unsigned int *id_hilo); Como se ve, la función acepta como parámetro una función de tipo: unsigned int __stdcall rutina_paralela() Por cierto, el (void*) como variables que acepta indica que no se sabe el número de parámetros que acepta. Ya sé que no es lo mismo, pero si al menos parecido. De todas formas no hay que olvidar que una función es direccionada mediante un apuntador a int, por tanto se debiera poder pasar como parámetro (... 5 minutos más tarde) Si que es posible: #include<stdio.h> int suma (int a, int b) { return (a+b); } int op(int a, int b, unsigned int (*funcion)(int,int)) { int c; c=funcion(a,b); return c; } void main() { int a,b,c; a=3; b=5; c=op(a,b,suma); printf("resultado: %d",c); }
Espero que sirva de algo... Un saludo a todos.
195
« en: Domingo 20 de Junio de 2004, 00:00 »
si quieres que aparezca en un display tendrás que usar ucontroladores, necesitas un CAD (convertidor analñogico digital) que suele venir incluido en el microcontrolador. Si lo que quieres es visualizarlo en el ordenador, se puede usar la tarjeta de sonido y la entrada del micrófono (al fin y al cabo es un CAD), pero tiene sus riesgos y complicaciones... Te recomiendo la primera solución que es la que usado yo para un proyecto similar.
196
« en: Sábado 19 de Junio de 2004, 23:51 »
Hola Jonathan, viejo amigo, la verdad es que me has pillao... No conozco ninguna función que permita tal cosa... La verdad es que tampoco sé muy bien qué es lo que quieres. Como mucho se puede saber el serial de un CD o cosas así... Sorry!!! un saludo!
197
« en: Sábado 19 de Junio de 2004, 23:44 »
Hola, Como bien han respondido anteriormente los compañeros debes realizar un free() después de cada llamada a malloc(), siempre que ya no necesites lo que hayas reservado. Ésta función te permite asignar espacios de memoria dinámicamente, cuando haces una llamada a malloc y asignas a un puntero esa direccion, esa memoria te pertenece y puedes hacer lo que quieras con ella, cargar datos... Ahora bien, cuando la liberas (free) deja de pertenecerte, y por tanto el OS puede entregar ese espacio a otro programa. En el mejor de los casos si intentas acceder a esa posición a través del puntero que tenías puede que te deje (en caso de que esa posición siga perteneciendo a tu programa pero la esté usando otra variable...) pero la información contenida podrá haber cambiado, y si la modificas puede que estés modificando sin saberlo datos de tu propio programa. En el caso más habitual windows te calzará un famoso "access violation" que no es más que un puntero que apunta a una dirección de memoria que no te pertenece, y no te dejará acceder a esa información. Por tanto, cuando reservas memoria es tuya, pero cuando la liberas deja de ser tuya. De ahí que te hayan dicho que el puntero debe apuntar a NULL después de hacer free(), pues la dirección a la que apuntaba ese puntero ha dejado de ser tuya y para evitar problemas como los que te he mencionado antes es mejor dejar de apuntar a una dirección que ya no es válida. Por último decirte que todo buen programador libera siempre los recursos que ya no necesita, y que se debe liberar antes de finalizar el programa todo aquello que has reservado. En fin espero que te haya quedado un poco más claro.... Un saludo!
198
« en: Sábado 19 de Junio de 2004, 22:49 »
Un saludo a todos pues hacía muxo ke no me pasaba!!!! Como bien ha dicho Juank hay una función de la API de windows que permite hacerlo: MEMORYSTATUS ke te indica la cantidad de memoria física y virtual disponible y total. Aki te dejo el código para realizarlo, SIEMPRE BAJO WINDOWS claro: char m_ram[300]; MEMORYSTATUS statex; statex.dwLength = sizeof (statex); GlobalMemoryStatus (&statex); sprintf(m_ram,"%7.0f MB de memoria física\n%7.0f MB libres\n" "%7.0fMB de memoria virtual\n%7.0f MB libres", (float)statex.dwTotalPhys/(div*1000),(float) statex.dwAvailPhys/(div*1000),(float)statex.dwTotalVirtual/(div*1000),(float)statex.dwAvailVirtual/(div*1000)); puts(m_ram);
Por si también te interesa hay también una función para saber el espacio de los discos: #include <windows.h> #include <stdio.h> #define div 1048576 void main() { __int64 libre_usuario,total,libre; if (GetDiskFreeSpaceEx("C:\\",(ULARGE_INTEGER *)&libre_usuario,(ULARGE_INTEGER *)&total, (ULARGE_INTEGER *)&libre)) { printf("\n\t\tUnidad c:\n"); printf("\n\tEspacio total = %5.5f MB\n", (float)total/div); printf("\n\tEspacio libre = %5.5f MB\n", (float)libre/div); printf("\n\tEspacio libre usuario = %5.5f MB\n", (float)libre_usuario/div); } if (GetDiskFreeSpaceEx("D:\\",(ULARGE_INTEGER *)&libre_usuario,(ULARGE_INTEGER *)&total, (ULARGE_INTEGER *)&libre)) { printf("\n\t*************************"); printf("\n\t\tUnidad d:\n"); printf("\n\tEspacio total = %5.5f MB\n", (float)total/div); printf("\n\tEspacio libre = %5.5f MB\n", (float)libre/div); printf("\n\tEspacio libre usuario = %5.3f MB\n", (float)libre_usuario/div); } getchar(); }
Fijate ke he mirado el espacio de dos unidades: C: y D:, tendrás ke poner las letras ke en tu caso se correspondan con las unidades de disco. En fin espero ke te sirva de ayuda, Un saludo!!!!
199
« en: Lunes 29 de Marzo de 2004, 18:52 »
En España joder también significa fastidiar, entre otras cosas...
200
« en: Martes 23 de Marzo de 2004, 21:03 »
El uso de la función exit() no es esa exactamente... te recomiendo que uses return; aunque la función sea de tipo void (no devuelva nada).
Páginas: 1 ... 6 7 [8] 9 10
|
|
|