Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - K-YreX

#1
Hola a tod@s.
Estoy con un proyecto desde hace un tiempo y aunque lo he planteado de varias formas diferentes, no logró decantarme por una. Os lo comento por si alguien quiere aportar su granito de arena:

Tengo x dispositivos que se comunican con el PC mediante un mismo puerto serie creado por un receptor. Cada dispositivo tiene un ID (2 dígitos) y para enviar un comando (aaaa) al dispositivo bb hay que escribir en el puerto serie: bbaaaa. El dispositivo responde con el mismo comando (bbaaaa) seguido de algún argumento si fuera necesario.

Como todos los dispositivos comparten el mismo puerto serie, creé algo así:
Código (csharp) [Seleccionar]

public class Dispositivo {
  private static SerialPort puertoSerie;

  public static void AbrirConexion(string nombreCOM) {...}

  public int Id { get; }
  public int NumeroSerie { get => ObtenerNumeroSerie(); }
  //...
}


En un principio la comunicación era comando-respuesta por lo que en los métodos utilizados implementé algo así:
Código (csharp) [Seleccionar]

lock(puertoSerie) {
  EnviarComando(comando);
  respuesta = RecibirRespuesta();
}
// gestion de la respuesta


De esta manera me aseguraba de que cuando una instancia de un dispositivo enviaba un comando al puerto serie, ninguno más pudiese enviar nada hasta obtener una respuesta de este (o superar el ReadTimeout del puerto serie y entonces devolver null). Esto funcionaba perfectamente mientras los comandos fuesen todos comando-respuesta.

El problema viene al intentar utilizar un comando que se envía una vez pero genera muchas respuestas seguidas durante x tiempo. Esta implementación para la comunicación ya no me servía así que opté por lo siguiente:
Código (csharp) [Seleccionar]

public class Dispositivo {
  //...
  private static readonly Dictionary<int, Dictionary<string, string>> gestorRespuestas = new Dictionary<int, Dictionary<string, string>>();
  //...
}


Lo que hago con esto es tener un almacén de respuestas. Cada dispositivo, tras enviar un comando se queda esperando una respuesta del puerto serie. Cuando ha obtenido una respuesta o null (si se supera el ReadTimeout) mira si esa respuesta coincide con la que estaba esperando. Si es así la gestiona y se acabó. Si no coincide, mira de qué dispositivo viene esa respuesta y a qué comando está respondiendo y lo almacena en gestorRespuestas[idEmisor][comandoRespondido], una vez hecho esto mira en gestorRespuestas[Id][comandoEnviado] si otro hilo ha almacenado una respuesta para él.

He realizado unas cuantas pruebas y funciona bastante bien excepto cuando escribo múltiples comandos en el puerto serie prácticamente al mismo tiempo que entonces alguno no llega a responderse nunca. Supongo que es porque hay que esperar un poco entre comando y comando (agregando una espera de 50 ms no he conseguido producir este problema).
La sincronización del puerto serie ahora la realizo justo para escribir en el puerto serie y para leer de él.


Me preguntaba si este enfoque es correcto o debería diseñar otra solución. Pensé también en hacer una cola de envíos y tener un único subproceso enviando comandos de esa cola cada x ms y otro subproceso únicamente para obtener las respuestas y guardarlas en el gestorRespuestas. Así cada hilo que trabaja con una instancia de dispositivo sólo tendría que acceder al gestorRespuestas y nunca al puerto serie directamente.
También he pensado en crear una clase ConcurrentSerialPort para no tener que gestionar los bloqueos desde la clase Dispositivo.

Estaré a la espera de vuestras aportaciones. :rolleyes:
#2
Redes / Configurar router como punto de acceso
21 Abril 2021, 21:44 PM
Hola a tod@s, estoy teniendo un problema al configurar un router como punto de acceso.
Tengo algunos conocimientos teóricos de redes y en alguna ocasión he accedido al router de mi casa para modificar algún ajuste pero nada más lejos de la realidad. El problema viene cuando me piden que configure un router de una red más extensa.

Situación actual: el router en cuestión está funcionando con conectividad WiFi y Ethernet (aunque la Ethernet no se utiliza). Al mismo tiempo está conectado a un switch que está conectado digamos al router principal.
Objetivo: configurar el router en cuestión como punto de acceso para ampliar la señal WiFi del router principal.

Cuando intenté configurarlo, entrando en la configuración del router y cambiando el modo de operación a punto de acceso, conseguí dejarlo funcionando pero únicamente mediante cable Ethernet, sin WiFi.
Me comentaron que puede ser por tener el router conectado a un switch y no directamente al router principal. Entonces quería saber si esto es así o el problema pueda ser otro o si hubiese alguna solución.

Muchas gracias de antemano.
#3
Hace unos meses hice una instalación limpia de Windows 10 en un Acer Aspire ES1-511 (que ya tenía W10 y funcionaba bien). Al principio tenía un problema con el touchpad que lo solucioné instalando los drivers correspondientes. Después de eso empezó a funcionar todo correctamente pero desde hace ya un tiempo tiene otro problema que no logro solucionar:
Si está el ordenador encendido y se conecta a la corriente, la pantalla se queda negra. En ocasiones se soluciona pulsando varias veces el botón de encendido pero en otras ocasiones es necesario apagarlo del todo y volver a encenderlo para que funcione. Este problema empezó a ocurrir en algunas ocasiones pero actualmente ocurre prácticamente siempre.

El ordenador no está en mi posesión por lo que tampoco puedo hacer muchas pruebas.
¿Alguien sabe a qué puede deberse? Gracias.
#4
Java / [JAXB] Generar xsd mediante schemagen
18 Diciembre 2020, 12:53 PM
He tenido problemas para generar un schema xsd a partir de unas clases .java mediante el comando schemagen.

Tenía las siguientes clases (todas ellas en el mismo directorio . para simplificar):

ConjuntoVehiculos
Vehiculo
Furgoneta extends Vehiculo
Coche extends Vehiculo

Entonces al ejecutar:
schemagen -d . -cp *.java -encoding utf-8
Se me generaba el schema xsd pero me aparecía el siguiente mensaje y no se incluía el elemento Coche en el schema.
Citar
ConjuntoVehiculos.java:14: error: cannot find symbol
                        @XmlElementRef(name = "Coche", type = Coche.class),
                                                                                             ^
    symbol:   class Coche
    location: class ConjuntoVehiculos
Esa anotación @XmlElementRef la tengo junto a otras dos que hacen referencia a Vehiculo y Furgoneta y estas otras no producen ningún problema. He comprobado los nombres y está todo bien escrito.

He hecho varias pruebas incluyendo los ficheros .java uno por uno y compilándolos primero (aunque por lo que he visto, schemagen debe llamar internamente a javac para compilar los ficheros fuente) pero obtenía más errores y no me generaba el schema.

Al final después de mucho probar me ha dado por compilar los ficheros .java (en el mismo directorio) y ejecutar:
schemagen -d . -cp . ConjuntoVehiculos.java -encoding utf-8
Con esto sí he conseguido generar el schema correctamente, sin errores e incluyendo todos los elementos pero no entiendo por qué ha funcionado. Es decir, no entiendo cómo funciona schemagen. He buscado en muchas webs y en todas aparece un ejemplo sencillo que funciona con el primer comando que he probado y no se explica nada más.

Espero que alguien conozca esta herramienta y pueda ayudarme. :-X

PD: Estoy utilizando schemagen 3.0.0 (recientemente descargado junto con las otras herramientas de JAXB).
#5
Desde hace algún tiempo tengo en mente empezar a publicar algunos contenidos como tutoriales, blogs o similares sobre informática, programación y puede que más adelante sobre otros temas relacionados o no con los anteriores. El problema me surge cuando pienso en qué formato y plataforma utilizar para ello, por lo que abro aquí este debate para cualquiera que quiera expresar su opinión (tanto si es creador de contenido como si no) o dar a conocer otras alternativas.

La duda principal que tengo es: ¿vídeo o texto?.
Aunque supongo que en formato texto conlleva menos trabajo de edición, también pueden acabar siendo textos demasiado grandes (lo he comprobado ya en este foro cuando intento responder un tema de forma breve y al final me acabo explayando más de lo esperado). Por esto pensé en hacerlo mejor en formato vídeo aunque no sé cómo me desenvolveré luego.

Y la otra duda es: ¿qué plataforma utilizar?
No conozco nada sobre blogs por lo que no sé qué páginas existen para publicar contenido (obviamente de forma gratuita para empezar) o cómo gestionarlo una vez creado.
Por otro lado, para publicar vídeos, tenía en mente la opción más conocida (creo): YouTube. Conozco algunas otras webs pero que tienen un propósito más específico y de momento prefiero elegir una más flexible y ya más adelante valorar si empezar en otras plataformas.

Dicho esto y como ya he comentado al principio, me gustaría conocer otras opiniones y recomendaciones de personas que se hayan visto, o no, en esta situación.

PD: Por si alguien se ha preocupado, no voy a dejar este foro pero sí quiero empezar otros proyectos personales paralelamente...  :xD

#6
Desde que he accedido al foro (hace unas 12 horas) he notado que en mi ordenador no se visualiza bien la página principal (portada) de elhacker.net. La barra superior de: Inicio | Foro | Blog | WarZone |... se ven correctamente pero la imagen superior aparece cortada (solo se ve "cker net").
Además el contenido central de la página aparece dispuesto en vertical (primero la parte que aparecía normalmente a la izquierda: elhacker.NET | Servicios | Descargas | Participa |..., debajo de lo anterior: el tablón de novedades | últimas entradas... | últimas noticias... |..., y debajo de estos últimos: Buscador | Boletín mensual | Estadísticas del Foro |...).

He probado a recargar la página varias veces y siempre se ve igual.
Me parece raro puesto que no he modificado ninguna configuración de mi ordenador. Sin embargo, si bajo el zoom del navegador al 80%, se vuelve a ver como siempre pero si lo dejo al 100% (como lo he tenido siempre) se ve como menciono arriba.

He accedido desde otro ordenador y en este se ve todo correctamente.
¿Alguien sabe por qué puede ser?
#7
Redes / [VirtualBox] Adaptadores de Red
24 Noviembre 2020, 00:52 AM
He instalado en varias ocasiones VirtualBox en una máquina Windows 10. Me he dado cuenta de que cada vez que instalo VBox, se crea un adaptador de red: <VirtualBox Host-Only Network> (Habilitado). Hasta aquí creo que todo normal.

Sin embargo; en ocasiones, cuando ejecuto VBox, me aparece varias ventanas seguidas solicitando permisos para VBox y en caso de que acepte, me crea otro/s adaptador/es <VirtualBox Host-Only Network #X> (donde X es un número {2, 3, 4, ...}) (Habilitado) y después se inicia el programa en sí.
En cambio si cancelo las ventanas de permisos de VBox, el programa se inicia con normalidad sin crear más adaptadores.
No me queda muy claro por qué se crean más adaptadores de red y por qué esto sólo ocurre en algunas ocasiones.

Empecé a notar esto después de instalar en varias ocasiones Genymotion. La primera vez que lo instalé me pidió permisos de ejecución para VBox y se los concedí porque sino fallaba. Después de eso estuvo una temporada que funcionaba bien y de repente me empezó a pasar como con VBox: en ocasiones cuando ejecuto Genymotion me pide permisos para ejecutar VBox y si no se los doy no puedo iniciarlo. Sin embargo; si se los doy, me salen varias ventanas seguidas seguidas de permisos y me crea un adaptador de red nuevo cada vez que acepto los permisos. Lo peor de todo es que cuando los acepto, Genymotion arranca correctamente pero cuando voy a iniciar un dispositivo virtual, este se queda cargando y nunca llega a iniciar (o salta un error).

He buscado documentación en las páginas tanto de VBox como de Genymotion y en otras páginas pero siempre te explican los tipos de conexión de las VMs y no he encontrado nada sobre este tema. Además no tengo muchos conocimientos de redes por lo que espero que alguien pueda ayudarme con este tema.

PD: Necesito instalar Genymotion pero actualmente lo tengo desinstalado tras haber tenido estos problemas.
#8
Estoy empezando a programar en Android por medio de Android Studio y se me está haciendo desesperante. Es por temas de estudios y tengo que desarrollar aplicaciones Android usando Java desde este IDE.

Principalmente, los problemas que tengo con este IDE son:
  • Los tiempos de carga cuando abro un proyecto no son pequeños que digamos y eso que son proyectos muy sencillos.
  • Cada vez que ejecuto una aplicación, es bastante lento construyendo el proyecto también. Además los proyectos aumentan mucho de tamaño al ser construidos. No sé si será por la plataforma (Android) o por el IDE pero nunca me ha pasado esto con proyectos de escritorio de Eclipse (Java) o Visual Studio (C#).
  • Los AVDs no son muy de fiar. He tenido problemas para ejecutar algunos intents implícitos en estos porque no se lanzan y al final he tenido que probar las aplicaciones en mi dispositivo (lo cual también es una pesadilla tener que estar siempre con el móvil conectado).
  • La vista de Diseño de los xml tampoco es muy de fiar. En ocasiones los componentes no se actualizan correctamente hasta después de ejecutar la aplicación.

    He intentado utilizar el plugin de Genymotion para virtualizar los dispositivos Android pero este sólo está disponible hasta la versión 4.0 de AS. Ahora mismo que la última versión estable es la 4.1, no se puede instalar este plugin.

    Quería saber si hay alguna forma o alternativa de solucionar al máximo estos inconvenientes pues se me está haciendo, como ya digo, desesperante desarrollar en Android.
#9
Estaba haciendo unas ventanas en Java cuando me dio por comprobar si realmente el tamaño de éstas se correspondía con el tamaño que había definido en el código fuente y he visto que no es así, no coinciden las medidas.
He estado leyendo sobre las dimensiones del JFrame (heredadas de Window), las dimensiones del Layout (que he probado también a usar diferentes tipos incluso null), los métodos set y get de height, width, minimumSize, preferredSize, bounds,... y todo lo que he ido encontrando por el camino; y no consigo unas conclusiones.

Os dejo un pequeño código de lo último que he probado y los resultados obtenidos:
Código (java) [Seleccionar]

public class App {
  private Ventana miVentana;

  public static void main(String[] args){
    miVentana = new Ventana();
    miVentana.setSize(200, 200);
    miVentana.setVisible(true);
  }
}

class Ventana extends JFrame {
  public Ventana(){
    getContentPane().setLayout(null);
  }
}


Establezco el layout a null para evitar que el layout pueda influir en las medidas de la ventana. Le doy un tamaño de 200 x 200 (que no choca con el tamaño mínimo de la ventana) pero al mostrar la ventana esta mide:
  • 234 x 242 (contando la barra de título)
  • 232 x 203 (contando el espacio interior de la ventana. Sin contar barra de título ni bordes)

    He probado también a usar el método setBounds() para establecer la posición de la esquina superior izquierda en las coordenadas (0,0), es decir, que la ventana debería aparecer pegada también a la esquina superior izquierda, pero realmente tampoco es así. En el eje X se desplaza 8 píxeles a la derecha, es decir, que la esquina superior izquierda de la ventana aparece en las coordenadas (8,0).
    Código (java) [Seleccionar]

    // Sustituir el setSize(200, 200) del codigo anterior por:
    miVentana.setBounds(0, 0, 200, 200);


    Sé que es un tema muy quisquilloso pero no sé de qué sirve poder establecer tamaños a las ventanas si luego no van a ser reales...
#10
Dudas Generales / Qué navegador usas??
25 Abril 2020, 20:39 PM
No sabía muy bien dónde poner este tema pero ya que es un tema bastante abierto y de opinión pues he decidido ponerlo aquí...

Bueno pues la cosa es que siempre utilizo Chrome tanto en Windows como en Linux por tener integrada la cuenta de Google pero no me agrada mucho el consumo de RAM que tiene y que se abran varios procesos en el administrador de tareas; así que me he planteado si cambiar a otro como Firefox por ejemplo.

Quería ver la opinión del resto de usuarios sobre los navegadores... Los que hayáis probado y los pros y contras que les encontréis. A ver si con este tema, me animo a probar otras opciones.
#11
El tema es que he instalado WindowBuilder en Eclipse para trabajar de forma gráfica y a la hora de utilizar la pestaña Design (que muestra la ventana con sus componentes), ésta aparece cortada. El lateral derecho se corta y no llegan a verse los botones de minimizar, maximizar y cerrar.
Además si agrando la ventana, los botones desaparecen completamente mientras que si la reduzco de tamaño se ven parcialmente.

He probado también a añadir un botón para ver si eso afecta al posicionamiento de los elementos y de momento parece que no pero de todas formas resulta molesto y me gustaría poder arreglarlo. Dejo una imagen para que se vea más claro lo que explico.


He probado varias versiones de Eclipse (4.15.0 2020-03 y 4.14.0 2019-12), varias versiones de WindowBuilder (la última y una anterior) y varios sistemas operativos (Ubuntu 18.04 y Windows 10) y el problema es el mismo siempre. También cambié los valores de xms y xmx del fichero eclipse.ini porque aparecía cierto lag al trabajar con ello y actualmente los tengo como estaban por defecto:

-Xms256m
-Xmx2048m


PD: Todo ello utilizando jdk-11.
#12
Mi problema, como dice el asunto es el siguiente: tengo un fichero xml muy sencillo con un dtd interno y quiero pasar su contenido a una tabla de SQL Server. (Estoy utilizando SSMS 2014). Lo primero que había intentado era:
Código (sql) [Seleccionar]

DECLARE @doc xml
SELECT @doc = (cast x as xml) FROM OPENROWSET(BULK 'ruta', SINGLE_BLOB) as T(x)

Pero al intentar ejecutarlo me aparecía el siguiente error:

No se permite analizar XML con DTD de un subconjunto interno. Utilice CONVERT con la opción de estilo 2 para habilitar la compatibilidad limitada con DTD de subconjuntos internos.


Investigué un poco el uso de CONVERT y cambié la sentencia anterior por:
Código (sql) [Seleccionar]

SELECT @doc = CONVERT(xml, x, 2) FROM OPENROWSET(BULK 'ruta', SINGLE_BLOB) as T(x)

Parece que se ejecuta correctamente mostrando el siguiente mensaje:

Se ha quitado del DTD XML uno o más fragmentos XML. Se han omitido los subconjuntos externos existentes.


Pero a la hora de intentar trabajar con la variable @doc me sale el siguiente error:

Debe declarar la variable escalar "@doc".



Ya de paso aprovecho para preguntar si conocéis de alguna guía sobre SQL Server ya que voy buscando información según la voy necesitando pero no llego a consolidar nada de forma teórica. Muchas gracias desde ya.

PD: El documento xml es válido y como es lógico pero por si acaso lo digo: donde he ido poniendo 'ruta' obviamente es la ruta completa de mi fichero xml pero para no copiarla entera...  :-X



EDIT RESUELTO: Vale, problema resuelto. Tengo el día tonto y estaba ejecutando únicamente la última sentencia. He seleccionado desde el DECLARE hasta el final y ya funciona correctamente... :rolleyes: :rolleyes:
#13
Buenas, me ha surgido un problema y ya adelanto que no tengo muchos conocimientos sobre este tema... :rolleyes:
Tengo una serie de vídeos guardados en el disco duro que puedo reproducir sin problemas en el ordenador. El problema viene cuando los conecto por USB a la tv e intento reproducirlos en ella.
Me he fijado en las propiedades de vídeo y son las siguientes:
  • Dimensiones: 1280 x 720
  • Códec: H.264 (Main Profile)
  • Tasa fotogramas: 25 fotogramas/s
  • Tasa bits: N/D
    Me comentaron que podía ser por el códec, que igual la tv no era capaz de reproducirlo pero he visto otros vídeos que sí puedo reproducir en ella y tienen el mismo códec. También he podido reproducir vídeos con las mismas dimensiones y no sé si puede estar relacionado con esas tasas... :-\
    No sé si alguien puede ayudarme o si es necesario que aporte más información.
#14
Ya sé que este suele ser un tema básico pero me he encontrado con un resultado inesperado en el funcionamiento de estos operadores.
Mi problema es que estaba implementando un algoritmo de ordenamiento por inserción tanto en C++ como en Java; sin embargo, el resultado obtenido en C++ no era el que esperaba por eso pongo la duda en este foro.
Aquí el código en Java:
Código (java) [Seleccionar]

public static void insertionSort(int[] numbers){
   for(int i = 1; i < numbers.length; ++i){
       int currentValue = numbers[i];
       int previousIndex = i-1;
       while(previousIndex >= 0 && currentValue < numbers[previousIndex])
           numbers[previousIndex+1] = numbers[previousIndex--];
       numbers[previousIndex+1] = currentValue;
       showArray(numbers);
   }
}


Y aquí el código en C++:
Código (cpp) [Seleccionar]

void insertionSort(int *numbers, const int size){
   for(size_t i = 1; i < size; ++i){
       int currentValue = numbers[i];
       int previousIndex = i-1;
       while(previousIndex >= 0 && currentValue < numbers[previousIndex])
           numbers[previousIndex+1] = numbers[previousIndex--];
       numbers[previousIndex+1] = currentValue;
       showArray(numbers, size);
   }
}

Como se puede ver, códigos idénticos. El problema está en la línea 6 del código en C++. He visto que había valores que se repetían y después de un rato investigando he visto que si en C++ se cambia la línea 6 por:
Código (cpp) [Seleccionar]

numbers[previousIndex+2] = numbers[previousIndex--];

Entonces sí funciona. Y si se cambia el bucle <while> por:
Código (cpp) [Seleccionar]

while(previousIndex >= 0 && currentValue < numbers[previousIndex]){
   numbers[previousIndex+1] = numbers[previousIndex];
   --previousIndex;
}

También funciona correctamente. Entonces el problema sé que está en el orden en que se realiza el decremento. Me gustaría sabes cómo funciona eso en profundidad ya que veo que no funciona igual en Java que en C++.

PD: Agradecería también una explicación del funcionamiento en Java para ver cuáles son las diferencias exactamente. O si es mejor que abra otro tema en el foro de Java para esta parte me lo podéis decir también. :-X :-X
#15
Cuando trabajamos con memoria dinámica y pasamos una variable (ya sea un array, una variable sencilla o un objeto), hasta el punto que yo sé, lo que estamos pasando es el puntero que apunta a la dirección de memoria donde hemos guardado esa variable. Entonces me surgen las siguientes preguntas:
  • ¿Por qué si pasamos un puntero a una función y queremos reservar memoria una vez en la función, hay que pasar ese puntero además por referencia?
  • Tenemos, imaginemos, un array bidimensional (matriz) que ha sido reservada con memoria dinámica, ¿hay diferencia entre pasarla por referencia o por valor?
    En ambos casos estamos pasando la dirección de memoria de su primer elemento, pero viendo que para la primera pregunta que he planteado sí hay diferencia entre usar referencias o no, quería saber si para este segundo caso es más "eficiente" pasarla por referencia.
#16
Hardware / Pendrive dejó de funcionar
26 Enero 2019, 23:27 PM
Compré dos pendrives y al principio podía utilizarlos bien, sin problemas. SIn embargo un día estaba formateando uno de ellos cuando por error lo desconecté antes de que terminara el formateo y ha dejado de funcionar por completo. Es decir, que no lo reconoce el pc cuando lo conecto a este.
He probado en distintos puertos de distintos ordenadores y también he probado en distintos sistemas operativos y nada. El pendrive ha quedado inutilizable... :-\
Me gustaría saber si existe alguna solución para recuperar el pendrive. :-X
#17
Recientemente he instalado Ubuntu 18.04 en un laptop junto a Windows 10. Al principio con el escritorio por defecto (GNOME) me di cuenta de que el click derecho del touchpad no funcionaba pero enseguida encontré la solución (usando GNOME Tweaks).

El problema llega cuando decidí cambiar de escritorio a Unity. Con el cambio de escritorio se arregló lo del click derecho automáticamente, sin embargo; noté que ahora lo que no funcionaba era el click tocando en el touchpad (no en el botón que hay en la parte inferior del touchpad). Estuve buscando información y encontré que podía deberse a que no estuviese instalado el <xserver-xorg-input-synaptics>.
Decidí instalarlo mediante

sudo apt-get install xserver-xorg-input-synaptics


Después de la instalación, reinicié el laptop y me encontré con que ya funcionaba el toque del touchpad. Sin embargo, dejaron de funcionar las teclas de subir/bajar volumen al igual que las combinaciones de teclas que incluían <alt>. (Es decir <ctrl> + <w> por ejemplo funcionaba pero <ctrl> + <alt> + <t> no).
Decidí volver a desinstalarlo y recuperé el uso de esas teclas pero perdiendo de nuevo el toque del touchpad.

Me gustaría saber si hay alguna forma/solución para tener las dos cosas disponibles. Es decir habilitar el toque del touchpad sin perder las funciones de las teclas físicas del volumen ni los atajos que incluyen <alt>. Gracias :-X
#18
Tengo la siguiente clase y estoy intentando sobrecargar el operador -> pero sólo puedo sobrecargarlo con constantes, me explico:
Código (cpp) [Seleccionar]

class ConjuntoEnteros{
    private:
        std::set<int> private_set;
    public:
        ConjuntoEnteros();
        // ...
        class Iterator{
            private:
                 std::set<int>::iterator private_iterator;
            public:
                  Iterator();
                  // ...
                  int* operator->(){
                      return &*private_iterator;
                  }
         };
};


Entonces si intento sobrecargar ese operador -> me da un error. Lo he conseguido solucionar modificándolo así:
Código (cpp) [Seleccionar]

const int* operator->(){
     return &*private_iterator;
}


Entonces no sé si es posible sobrecargar ese operador cómo lo había intentado al principio o siempre tiene que ser constante. :-X
#19
Mi pregunta es si es posible definir una función con varios <templates>. Para que se entienda mejor os pongo un ejemplo sencillo, imaginad tener una función que devuelve el tamaño de una pila <stack> de cualquier tipo (sí, ya se que eso ya existe pero para hacer sencillo el ejemplo):
Código (cpp) [Seleccionar]

template <class T>
size_t stackSize(const stack<T> &s){
   return s.size();
}


Hasta aquí todo bien pero si queremos hacer una función que reciba dos pilas de distinto tipo y devuelva el tamaño de la más grande... La idea es algo así, pero tendríamos errores de compilación por un conflicto entre el tipo de la primera pila y el de la segunda si no son iguales.
Código (cpp) [Seleccionar]

template <class T>
size_t biggestStackSize(const stack<T> &st1, const stack<T> &st2){
   size_t size = st1.size();
   if(st2.size() > size)
       size = st2.size();
   return size;
}

Ya sé que en este caso podría hacerse sin tanta función ni <template> pero es posible hacerlo así definiendo dos <template> distintos?? :huh:
#20
Programación C/C++ / Compilar C/C++ en Windows
4 Diciembre 2018, 21:16 PM
Bueno el tema es que yo empecé a programar usando Dev C++ en Windows, pero después empecé a usar distribuciones Linux y entonces empecé a compilar mis programas con gcc y g++. Me gusta poder editar mi código con editores de texto ya sea con gedit, sublime text y no usar IDEs como Dev, NetBeans, Eclipse...

Entonces ahora estoy usando en ocasiones Windows y me gustaría saber que métodos hay para compilar programas en este sistema sin usar IDEs. Por ejemplo he leído un poco de MinGW y no sé si existen otras alternativas similares o esa es la forma más similar de compilar como en Linux. :-X
#21
Windows / Restaurar Windows 10
29 Noviembre 2018, 23:17 PM
Estoy usando un laptop nuevo que tiene Windows 10 preinstalado y posiblemente más adelante instale alguna distribución GNU/Linux. Entonces para prevenir he pensado en crear una unidad usb con la que poder recuperar el sistema tal y como está ahora. Me he puesto a investigar ya que es algo que nunca he hecho y me he encontrado con varias opciones; una de ellas es crear una unidad de recuperación (que por lo que he entendido sirve para poder arrancar en caso de error del sistema operativo), también he leído que si al hacer la unidad de recuperación seleccionas la opción de "crear copia de seguridad de los archivos del sistema en la unidad de recuperación" se puede volver a instalar el sistema operativo a partir de esa copia. En cambio en otros sitios he leído que lo que hay que hacer es crear una imagen del sistema (pero para esta opción no me deja seleccionar el usb).

Mi objetivo es tener un usb desde el que poder reinstalar el sistema operativo de Windows tal y como está ahora. El problema es que no sé si para lo que yo quiero conseguir tengo que crear una unidad de recuperación o una imagen del sistema.
Gracias a quien pueda guiarme un poco en esto. :-X

PD: Si creo el usb y después reinstalo el sistema, mantengo la licencia de Windows?
#22
Programación C/C++ / Duda cstdlib y srand (C++)
25 Noviembre 2018, 07:33 AM
Esto puede parecer una tontería ya que no tiene mucha complicación usar la librería de C++ <cstdlib> y las funciones <srand> y <rand> para generar números aleatorios. Pero qué pasa si no usas <cstdlib> o usas la función <time()> sin incluir <ctime>?? :huh:
Estaba haciendo un programa en el que iba a generar unos números aleatorios pero se me ha olvidado incluir tanto la librería <cstdlib> como la función <srand> es decir que únicamente he usado la función <rand> sin más... Y el programa ha funcionado. :o
Me he puesto a hacer pruebas y os dejo los resultados (compilado desde Ubuntu 18.04 con g++ <programa.cpp> -o <programa>):
Código (cpp) [Seleccionar]

#include <iostream>
#include <list>

using namespace std;

int main(){
const int MAX_ELEMENTS = 10;
const int LIMIT_INF = 0, LIMIT_SUP = 5;

list<int> myList;

for(size_t i = 0; i < MAX_ELEMENTS; i++)
myList.push_back(LIMIT_INF + rand() % (LIMIT_SUP - LIMIT_INF + 1));

for(auto it = myList.cbegin(); it != myList.cend(); it++)
cout << *it << "  ";
cout << endl;
}


Con este código compila el programa sin errores ni warnings pero sí es cierto que los números son siempre los mismos (lógico por no usar srand).

Entonces he probado a incluir la semilla sin nada más, es decir, como se ve aquí:
Código (cpp) [Seleccionar]

#include <iostream>
#include <list>

using namespace std;

int main(){
const int MAX_ELEMENTS = 10;
const int LIMIT_INF = 0, LIMIT_SUP = 5;

list<int> myList;

srand(time(NULL));

for(size_t i = 0; i < MAX_ELEMENTS; i++)
myList.push_back(LIMIT_INF + rand() % (LIMIT_SUP - LIMIT_INF + 1));

for(auto it = myList.cbegin(); it != myList.cend(); it++)
cout << *it << "  ";
cout << endl;
}

Y ahora tengo un programa que compila sin errores ni warnings y que genera los números aleatorios distintos cada vez que se ejecuta el programa (sin compilarlo antes de cada ejecución). ;-)
También si os dais cuenta tampoco he incluido <ctime> para usar la función <time()>. :silbar:
He estado investigando <iostream> por si incluía <cstdlib> pero no he encontrado nada. Lo de usar <list> es simplemente porque era lo que estaba usando cuando me he dado cuenta de esto y no he querido quitarlo por si tenía algo que ver con la respuesta aunque tampoco he encontrado nada al respecto.