• Martes 16 de Abril de 2024, 13:46

Mostrar Mensajes

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 - Amilius

Páginas: 1 2 [3] 4 5 ... 27
51
C/C++ / Re: Leer una fecha con getline() y cin.ignore()
« en: Miércoles 10 de Noviembre de 2010, 20:24 »
1. Define CHECK_OUTPUT
2. Puede ser el fin de línea extra en tu cout. No deberías incluir ese fin de línea por que haces que la función no pueda usarse en otros contextos, por ejemplo si es necesario mostrar una fecha en medio de una oración.
3. Como estás usando C++ deberías definir un constructor en tu struct en lugar de usar una función de inicialización :
Código: C++
  1.  
  2. struct TFecha
  3. {
  4.     TFecha(int dia = 1, int mes = 1, int año = 1970) : dia(dia), mes(mes), año(año)
  5.     {
  6.     }
  7.  
  8.     void mostrar()
  9.     {
  10.         std::cout << dia << "/" << mes << "/" << año;
  11.     }
  12.  
  13.     int dia;
  14.     int mes;
  15.     int año;
  16. };
  17.  
  18.  
  19.  

52
C++ Builder / Re: como poner un programa en background
« en: Martes 2 de Noviembre de 2010, 19:42 »
Usar directamente la API de windows comenzando desde cero sin un ejemplo básico no es sencillo. Hay un montón de funciones que tienes que conocer y entender cómo funcionan. Sería mejor que uses Visual C++. Tiene templates para crear el esqueleto de todo tipo de aplicaciones básicas, incluyendo un servicio de windows.

Tal vez c++ builder tenga algo parecido. En Delphi es bastante más fácil todo esto por que posee una capa de abstracción excelente que simplifica muchísimo el desarrollo de aplicaciones, digo esto por que siendo c++ builder y delphi de Borland deberían tener una capa de abstracción similar. Si es así bastaría con ocultar la ventana principal y tener un bucle con un sleep, un timer, un hilo o lo que veas conveniente.

De todas formas la idea básica es tener un bucle esperando por mensajes de windows, sin consumir 100% de cpu, para poder saber cuando hay que cerrar la aplicación. De esta forma no es necesario mostrar una ventana y simplemente la puedes ocultar. Generalmente además hay que agregar un ícono pequeño en la barra de tareas para que el usuario pueda cerrar o configurar la aplicación.

Otra alternativa más avanzada es implementar la aplicación como servicio para que desde el administrador de servicios pueda ser iniciado, cerrado, pausado, etc.

53
C/C++ / Re: c++ y sql problemas de coneccion en Windows 7
« en: Miércoles 27 de Octubre de 2010, 22:38 »
Deberías incluir el error que te sale y ver si el "application event log" de windows registra algo relacionado para tener más detalles.
Eso si: no puedes mezclar DLLs de 32 y 64 bits. Puede ser que libmysql.dll está tratando de usar otra dll y la única que encuentra es una de 64 bits. Al final tal vez tengas que compilar para 64bits (en el caso hipotético que tu compilador pueda generar código para 64 bits) y usar libmysql de 64 bits.

54
C/C++ / Re: [C++]Poblema con constructor
« en: Miércoles 27 de Octubre de 2010, 22:11 »
Claro que existe, y si no quieres que sea llamado pues pasa el objeto por referencia y no por valor.

Código: C++
  1.  
  2.     Nodo(const T& dato) : dato(dato), siguiente(0), anterior(0)
  3.     {
  4.     }
  5.  
  6.  

Además tienes que definir tu propio constructor copia y el operador de asignación para la clase Usuario. Siempre debes hacer esto cuando asignas/reservas memoria en tu constructor, o bien declararlos como privados sin definirlos para que el compilador te de error si tratas de usarlos por accidente.

55
Visual C++ / Re: VALIDAR double
« en: Miércoles 13 de Octubre de 2010, 19:44 »
Intenta usando scanf_s, "%lf" indica que esperamos un double, el fflshd(stdin) es para limpiar la entrada de datos si es que el usuario ingreso basura en lugar de lo esperado.

Código: C++
  1.  
  2. #include <stdio.h>
  3. ....
  4.         double xp = 0.0;
  5.         double yp = 0.0;
  6.         scanf_s("%lf", &xp);
  7.         fflush(stdin);
  8.         printf("%fn", xp);
  9.         scanf_s("%lf", &yp);
  10.         fflush(stdin);
  11.         printf("%fn", yp);
  12.  
  13.  

56
Visual C++ / Re: Problema principiante cargar modulo
« en: Miércoles 13 de Octubre de 2010, 19:07 »
El problema es que te falta un punto y coma en tu .h y las definiciones en el .cpp no tienen la sintaxis correcta.

Esto debería funcionar con Visual C++:

1. Creas un proyecto vacío.
2. Agregas los siguientes archivos:

Clase1.h:
(Incluye en el ".h" todas las declaraciones y definiciones que deseas que sean visibles al resto del código. Es recomendable evitar agregar "#include" innecesarios en los ".h". Sólo es necesario incluir los encabezados que definan ancestros o miembros de clases definidas en el ".h", para el resto declara las clases indicando al compilador que serán definidas más adelante, ej.: "class Clase2;". )
Código: C++
  1.  
  2. // Este código evita que el precompilador agregue este encabezado más de una vez
  3. #ifndef _CLASE1_H_
  4. #define _CLASE1_H_
  5.  
  6. class Clase1
  7. {
  8. public:
  9.     Clase1(int dato);
  10.     void función();
  11.  
  12.     static Clase1 objetoEstático;
  13. private:
  14.     int _dato;
  15. };
  16.  
  17. #endif
  18.  
  19.  

Clase1.cpp:
(Incluye en el cpp todas las declaraciones y definiciones que NO deseas que sean visibles al resto del código. Si declaras una función o variable que no es miembro de una clase y no deseas que sea visible para otros archivos declárala como "static". Si tu clase utiliza otras clases, variables, tipos, "includes", etc cuya existencia no deseas que sea conocida por el resto del código entonces decláralos dentro del .cpp.)
Código: C++
  1.  
  2. #include <stdio.h>
  3. #include "Clase1.h"
  4.  
  5. Clase1 Clase1::objetoEstático(2);
  6.  
  7. Clase1::Clase1(int dato): _dato(dato)
  8. {
  9. }
  10.  
  11. void Clase1::función()
  12. {
  13.     printf("Dato: %in", _dato);
  14. }
  15.  
  16.  

main.cpp:
Código: C++
  1.  
  2. #include "clase1.h"
  3.  
  4. int main()
  5. {
  6.     Clase1::objetoEstático.función();
  7.     return 0;
  8. }
  9.  
  10.  

57
C/C++ / Re: como organizar el code en Dev-Cpp
« en: Viernes 8 de Octubre de 2010, 20:56 »
La verdad 300 líneas de código no es mucho.

Creo que el problema de fondo es que te falta seguir un estilo de codificación y configurar el editor para hacer tu código más legible:
1. Tu código está en blanco y negro, los editores modernos como el Notepad++ te permiten cambiar el color de operadores, cadenas, números comentarios, tipos, etc. Incluso te muestran visualmente cuando tienes paréntesis demás o te falta alguno.
2. Tu código no respeta un máximo de X columnas. (Generalmente X es 80.) Tener que usar la barra de desplazamiento horizontal para leer esas líneas extra largas es incómodo y pierdes capacidad de visualizar el código rápidamente.
3. Usa espacios después de las comas, punto y coma y para separar expresiones. Puede que al principio te resulte incómodo pero a la larga agradecerás la facilidad con la que podrás leer tu código.
4. Trata de usar siempre las llaves {} en lugar de escribir el código en una sola línea, a menos que dicho código sea extremadamente corto y fácil de entender, para evitar lineas innecesariamente largas.
5. En la medida de lo posible evita las anidaciones y múltiples niveles de tabulación. Posiblemente sea mejor llamar a una función en lugar de escribir el código dentro de la anidación. Lo ideal es que el bloque completo pueda ser visto en la pantalla sin tener que mover la barra vertical.
6. Evita funciones o métodos demasiado largos, si no es posible asegúrate que puedan ser divididos en etapas bien documentadas de forma que sea fácil ubicarse. Lo peor es tener una función que es un bloque indivisible con varios niveles de anidamiento conteniendo cientos de líneas; por que para entender dicha función hay que leerla entera y seguir el flujo completo de proceso. En cambio si está separada en etapas puedes enfocarte en una sola etapa y en el mejor de los casos puedes ver la parte que te interesa en pantalla sin necesidad de mover la barra vertical.
7. En general das buenos nombres a las variables, pero sería bueno que eches un vistazo a estilos de codificación.

58
C/C++ / Re: Por qué no funciona???
« en: Viernes 24 de Septiembre de 2010, 21:26 »
Y mucho mejor si te acostumbras a poner la constante antes, asi: "0==np". De esta forma si escribes "0=np" el compilador podrá avisarte de tu error.

59
C/C++ / Re: no se pòr que este ejercicio no compila( memoria dinamica)
« en: Martes 14 de Septiembre de 2010, 23:04 »
Además tienes que cambiar algunas cosas:

En lugar de:
Código: C++
  1.  
  2. computador*compu=new int;
  3.  
  4.  

Debería ser:
Código: C++
  1.  
  2. computador* compu = new computador[n];
  3. ...
  4. // Al final cuando ya no necesites "compu" tienes que liberar la memoria:
  5. delete[] compu;
  6.  
  7.  

Los arreglos en C, C++ están basados en 0, así que en lugar de:
Código: C++
  1.  
  2. for(i=1;i<=n;i++)
  3.  
  4.  

Tiene que ser:
Código: C++
  1.  
  2. for(i = 0; i < n; i ++)
  3.  
  4.  

60
C/C++ / Re: Solucionen este conveniente II Gracias
« en: Lunes 30 de Agosto de 2010, 18:40 »
Tal vez exista alguna opción de compilación para respetar el estándar y obtener los mismos resultados que otros compiladores. De lo contrario sería un compilador terriblemente desastroso. :(
¿Probaste desactivando optimización, o declarando esas variables como "volatile"?

61
C/C++ / Re: Funcion de error, erf(X)
« en: Lunes 2 de Agosto de 2010, 22:10 »
Bueno eso es bastante básico, en lugar del anterior main, tendrías que usar uno como este:

Código: C++
  1.  
  2. void main()
  3. {
  4.     double x = 2.0;
  5.     printf("erf(%f) = %fn", x, erf(x));
  6. }
  7.  
  8.  

Sería mejor si buscas un tutorial para que vayas aprendiendo a usar estos aspectos básicos paso a paso.

62
C# / Re: While y OR
« en: Sábado 31 de Julio de 2010, 01:27 »
Cita de: "ProfesorX"
...
Por eso en realidad ^ no sirve para el problema mencionado arriba donde necesitamos un operador logico.
...

De hecho XOR es siempre un operador lógico que trabaja a nivel de bits. Son las características del lenguaje las que hacen transparente su aplicación como operador para el tipo bool y tipos enteros. La gracia del tipo bool es que fuerza a que sus valores sean 0 o 1, en C# no puedes hacer un casting de entero a bool, tienes que usar un operador que retorna un valor bool: "bool b = i != 0;". En C++ puedes hacer el casting de un entero a bool y el compilador generará código para que el tipo bool contenga 0 si el entero es 0 o 1 si no es cero. Sin embago en C++ es recomendable usar la misma forma de c#: "bool b = i != 0;" para evitar un Warning de nivel 4, además de hacer explícito el hecho que la variable b contiene 0 si i es 0 o 1 si i no es 0.

63
C/C++ / Re: Funcion de error, erf(X)
« en: Viernes 30 de Julio de 2010, 01:30 »
Visual Studio (incluyendo VS 2010) no soporta esas funciones. Como son parte del estándar C99 la palabra oficial de MS es que VS es un compilador de C++, no de C.  :bad:

En esta página puedes encontrar una implementación de erf() para C++:  http://www.johndcook.com/cpp_erf.html

Lo copio abajo, por si desaparece dicha página:
Código: C++
  1.  
  2. #include <cmath>
  3. #include <cstdio>
  4.  
  5. double erf(double x)
  6. {
  7.     // constants
  8.     double a1 =  0.254829592;
  9.     double a2 = -0.284496736;
  10.     double a3 =  1.421413741;
  11.     double a4 = -1.453152027;
  12.     double a5 =  1.061405429;
  13.     double p  =  0.3275911;
  14.  
  15.     // Save the sign of x
  16.     int sign = 1;
  17.     if (x < 0)
  18.         sign = -1;
  19.     x = fabs(x);
  20.  
  21.     // A&S formula 7.1.26
  22.     double t = 1.0/(1.0 + p*x);
  23.     double y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);
  24.  
  25.     return sign*y;
  26. }
  27.  
  28. void main()
  29. {
  30.     // Select a few input values
  31.     double x[] =
  32.     {
  33.         -3,
  34.         -1,
  35.         0.0,
  36.         0.5,
  37.         2.1
  38.     };
  39.  
  40.     // Output computed by Mathematica
  41.     // y = Erf[x]
  42.     double y[] =
  43.     {
  44.         -0.999977909503,
  45.         -0.842700792950,
  46.         0.0,
  47.         0.520499877813,
  48.         0.997020533344
  49.     };
  50.  
  51.     int numTests = sizeof(x)/sizeof(double);
  52.  
  53.     double maxError = 0.0;
  54.     for (int i = 0; i < numTests; ++i)
  55.     {
  56.         double error = fabs(y[i] - erf(x[i]));
  57.         if (error > maxError)
  58.             maxError = error;
  59.     }
  60.  
  61.     printf("Maximum error: %fn", maxError);
  62. }    
  63.  
  64.  

64
C# / Re: While y OR
« en: Martes 27 de Julio de 2010, 01:03 »
El gorro de gnomo es el operador XOR.  :)

Código: C#
  1.  
  2.         static void Main(string[] args)
  3.         {
  4.             int a, b;
  5.             bool x, y;
  6.             for (int i = 0; i < 4; i++)
  7.             {
  8.                 a = i & 1;
  9.                 b = i >> 1;
  10.                 x = a == 1;
  11.                 y = b == 1;
  12.                 Console.WriteLine("{0} xor {1} = {2}", a, b, a ^ b);
  13.                 Console.WriteLine("{0} xor {1} = {2}", x, y, x ^ y);
  14.             }
  15.         }
  16.  
  17.  

65
C/C++ / Re: Como hago esto soy novato en C
« en: Sábado 24 de Julio de 2010, 03:32 »
Si los caracteres están en una cadena terminada en carácter 0:

Código: C++
  1.  
  2. #include <stdio.h>
  3.  
  4. char* reversaDeCadena(char* cadena)
  5. {
  6.     // Necesitamos un char temporal, un puntero al inicio y otro al final de la cadena
  7.     char temp, *inicio, *final;
  8.     // Asignar a inicio cadena, asignar a final inicio.
  9.     final = inicio = cadena;
  10.     // Buscamos el final de la cadena: el char 0
  11.     while (*final++);
  12.     // Necesitamos apuntar al último char no al siguiente después del 0
  13.     final -= 2;
  14.     // Intercambiamos hasta llegar a la mitad, el resto ya estará en reversa
  15.     while (inicio < final)
  16.     {
  17.         temp = *inicio;
  18.         // Apuntar al siguiente desde el inicio, después de asignar el apuntado por final al apuntado por inicio.
  19.         *inicio++ = *final;
  20.         // Apuntar al anterior desde el final, después de asignar al apuntado por final.
  21.         *final-- = temp;
  22.     }
  23.     return cadena;
  24. }
  25.  
  26. int main()
  27. {
  28.     char s[] = "MJRASP";
  29.     printf("%sn", reversaDeCadena(s));
  30.     return 0;
  31. }
  32.  
  33.  

O también puedes usar una de las funciones definidas en string.h:

Código: C++
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. int main()
  5. {
  6.     char s[] = "MJRASP";
  7.     printf("%sn", _strrev(s));
  8.     return 0;
  9. }
  10.  
  11.  

66
C# / Re: convertir array de strings en array de bytes
« en: Viernes 23 de Julio de 2010, 17:23 »
No he tenido oportunidad de usar ese método en especial, sin embargo, en general, tendrías que incluir información del número de cadenas que deseas enviar, la longitud de la cadena y evidentemente los bytes de la cadena. También es necesario aclarar que en comunicación por sockets usando el protocolo TCP, si bien garantiza que llegue toda la información en la secuencia correcta, no te garantiza que te lleguen los bloques de datos del mismo tamaño que los enviaste. Por ejemplo puede suceder que:

Envías: "Cadena1" Puedes recibir: "Cad", luego "en" y más tarde "a1"

También puede suceder que envíes "Cadena1", luego envíes "Cadena2". Puedes recibir todo junto: "Cadena1Cadena2" o bien "Cad" y luego "ena1Cadena2".

Por lo anterior es importante saber cuantas cadenas estás enviando y el tamaño de las mismas.

67
C/C++ / Re: Sobrecargar operador = con punteros
« en: Jueves 22 de Julio de 2010, 22:55 »
*lista2 = lista1;
:)

68
C/C++ / Re: Problema con entrada/salida por archivos
« en: Martes 13 de Julio de 2010, 22:44 »
Cita de: "ndi"
Estoy usando Borland 5.5 para compilar. Segund lei feof() no es presiso, es decir, puede devolver "true" aunque no este en el final del archivo, otra posibilidad seria, ir al final del archivo con fseek(pf, 0l, 2) y hacer un fell() para sacar la posicion del ultimo byte y asi vlaerse de este valor y no de feof() :S

Tal parece que en este caso feof() devuelve "false" aunque esté en el final del archivo.  :mellow:

De todas formas esta sería la forma más correcta:
Código: C
  1.  
  2. void mostrar (FILE * fp ) {
  3.      categoria buff2;
  4.      fseek (fp, 0L, 0);
  5.      printf ("|t Cat t|t Totalt|n");
  6.      while (1 == fread(&buff2, sizeof(categoria), 1, fp)){
  7.            printf ("|t %d t|t %0.2f t|n", buff2.cat, buff2.total);
  8.            }
  9.      printf("nnn Fin! ");
  10.      }
  11.  
  12.  
Se desea leer un item y el resultado debería ser que se leyó un item. Tal vez en Borland 5.5 fread retorna "-1" si no pudo leer el item por que no hay más datos en el archivo y "0" si ocurrió otro error.

69
C/C++ / Re: Problema con entrada/salida por archivos
« en: Martes 13 de Julio de 2010, 19:00 »
Hmm esto es interesante. Tal vez estás usando otro compilador. Yo usé VS 2005 y con la verificación del fread era suficiente para que no muestre repetido el último item. Por otra parte, usando un visor hexadecimal, es posible ver que el archivo está correctamente escrito, 8 bytes por item.

Otro punto interesante es que feof() no está funcionando como se esperaría. La última operación que encontró el final de archivo, el último fread, debería actualizar la bandera de fin de archivo, pero no es así. Posiblemente este comportamiento sólo sucede cuando el archivo es abierto para lectura y escritura.

70
C/C++ / Re: Problema con entrada/salida por archivos
« en: Martes 13 de Julio de 2010, 01:15 »
En realidad el problema está al mostrar, no al escribir por que no estás revisando el resultado de fread().
Código: C
  1.  
  2.         if (fread(&buff2, sizeof(categoria), 1, fp))
  3.             printf ("|t %d t|t %0.2f t|n", buff2.cat, buff2.total);
  4.  
  5.  

71
C/C++ / Re: Muchas Gracias de antemano
« en: Lunes 12 de Julio de 2010, 22:03 »
En realidad es bastante sencillo:

Primero buscas un cero en la primera columna, guardas la posición
Haces esto hasta que la posición guardada esté en la columna final:
* Marcar la posición como recorrida, por ejemplo poner un 2.
* Imprimir coordenada
* Buscar una casilla aledaña que sea 0, guardar su posición

72
Pascal / Re: Modo Gráfico.
« en: Domingo 27 de Junio de 2010, 14:28 »
Si es el turbo pascal que creo que es, el problema es que es muy pero muy antiguo. tal vez usando un emulador de DOS, como DosBox siempre funcione bien.

73
C/C++ / Re: Variables static en c++
« en: Domingo 27 de Junio de 2010, 14:04 »
Afuera de una función te sirve para definir una variable global que no quieres que sea visible fuera del archivo donde la estás definiendo. Muy útil si tienes cientos de archivos y no quieres buscar en todos para ver si alguno de ellos está haciendo mal uso de tal variable.

Dentro de una función o método sirve para definir una variable que es inicializada la primera vez que se llama a la función y perdura hasta la muerte del proceso. Asi que sólo es inicializada una vez y perdura entre llamadas a la función.

74
C/C++ / Re: clases en diferentes ficheros y stdafx.h
« en: Domingo 27 de Junio de 2010, 13:51 »
Efectivamente usar precompilados (incluir stdfx.h en los cpp) es opcional, pero reduce el tiempo de compilación así que no es necesario en proyectos chicos. De todas formas me parece que podrías usar otros compiladores y tener un stdfx.h en blanco.

¿Por que tener separado el .h del .cpp?

1. Por diseño: separación de interfaz de implementación, ocultar detalles de implementación. Muy importante al crear DLLs para mantener compatibilidad entre versiones.
2. Reduce tiempo de compilación: Tienes que tener en cuenta que antes de compilar un ".cpp" prácticamente se hace un "copy/paste" de todos los "include" dentro del archivo .cpp.

Por lo anterior cuanto más grande sea tu proyecto cuanto más importante es tener un .h y un .cpp por clase. Para códigos pequeños, como algún ejemplo de uso, no es relevante.

75
C/C++ / Re: Método que actue sobre objetos de la misma clase
« en: Jueves 24 de Junio de 2010, 02:32 »
Sería interesante saber si esto se puede hacer sin mantener una lista de punteros a todas las instancias creadas.

Este código implementa una clase que permite aplicar una función a todas sus instancias. Use un conjunto en lugar de una lista o vector para tener complejidad logaritmica al agregar y eliminar elementos. En todo caso no deberían existir elementos repetidos.  ^_^

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <set>
  4. #include <algorithm>
  5.  
  6. class ClaseInteresante
  7. {
  8. public:
  9.     ClaseInteresante(int unValor = 0) : valor(unValor)
  10.     {
  11.         printf("Creando: %pn", this);
  12.         mInstancias.insert(this);
  13.     };
  14.  
  15.     ClaseInteresante(const ClaseInteresante& c)
  16.     {
  17.         printf("Creando copia: %pn", this);
  18.         valor = c.valor;
  19.         mInstancias.insert(this);
  20.     };
  21.  
  22.     ~ClaseInteresante()
  23.     {
  24.         printf("Destruyendo: %pn", this);
  25.         mInstancias.erase(this);
  26.     };
  27.  
  28.     template<class F>
  29.     static void aplicarEnTodos(F f)
  30.     {
  31.         std::for_each(mInstancias.begin() ,mInstancias.end() ,f);
  32.     }
  33.  
  34.     int getValor()
  35.     {
  36.         return valor;
  37.     };
  38.  
  39. private:
  40.     int valor;
  41.     static std::set<ClaseInteresante*> mInstancias;
  42. };
  43.  
  44. std::set<ClaseInteresante*> ClaseInteresante::mInstancias;
  45.  
  46. struct ClaseImpresora
  47. {
  48.     void operator()(ClaseInteresante* i)
  49.     {
  50.         if (i)
  51.         {
  52.             printf("Objeto: %p, Valor: %dn", i , i->getValor());
  53.         }
  54.     };
  55. };
  56.  
  57. void main()
  58. {
  59.     ClaseInteresante a(1), b(2), c(3);
  60.     ClaseInteresante d(c);
  61.     ClaseInteresante e(c);
  62.    
  63.     ClaseImpresora i;
  64.     printf("nAplicando funcion a todas las instancias:n");
  65.     ClaseInteresante::aplicarEnTodos(i);
  66.     printf("n");
  67. }
  68.  
  69.  

Páginas: 1 2 [3] 4 5 ... 27