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ú

Mensajes - K-YreX

#151
Programación C/C++ / Re: Arreglos y rangos
26 Noviembre 2020, 01:16 AM
No entiendo muy bien lo que quieres hacer.
Tienes una serie de notas de 0 a 10 y quieres que el usuario introduzca un valor que será la longitud de cada rango de notas?? Es eso lo que quieres hacer??
De ser así, hay varios factores a tener en cuenta:
  • Lenguaje de programación (C o C++)
  • Qué vas a hacer con esos valores? Basta con mostrarlos o hay que guardarlos para trabajar con ellos más adelante?
  • Qué es la forma más simple posible? En programación hay muchas formas de hacer las cosas y cada una tiene sus cosas buenas y sus cosas malas.

    Añade el código de lo que lleves hecho o lo que no consigas hacer para tenerlo más claro.
#152
Programación C/C++ / Re: Código de inventario en C
25 Noviembre 2020, 06:30 AM
No lo ordena al revés, eso ha sido casualidad por el orden en que los has introducido tú.
Lo que hace en realidad es intercambiar siempre el último con el penúltimo y fin. Esto ocurre principalmente por dos errores:
  • Llaves.
  • Error en la condición del bucle interno.

    Tu código (resumido) bien identado para que lo veas es:

    void menuOrdenDescrp(){
       // declaraciones y otros...
       // parte del if...
       } else {
           for (i = 0; i<numeroProductos-1; i++){
               strcpy(min, productos[i].descripcion);
               pos=i;
               for (j=i+1; j<numeroProductos-1; j++) // No utilizas llaves. Este bucle solo comprende el bloque del if()
                   if (strcmp(productos[j].descripcion , min) < 0){
                       strcpy(min, productos[j].descripcion);
                       pos=j;
                   }
           } // este no cierra el for interno porque no usas llaves. Cierra el bucle externo
           temp=productos[i];
           productos[i]=productos[pos];
           productos[pos]=temp;

           printf("\n\tDatos ordenados:\n");
           for(i=0; i<numeroProductos; i++){
               printf("\n\t%s\n",productos[i].descripcion);
           }
       } // Cierre del else{}
       getchar();
    }

    Por lo tanto la ejecución sería:

    i = 0 -> i < productos-1 (2)?? Si -> min = productos[0] (dosis) y pos = 0
     j = 1 -> j < productos-1 (2)?? Si -> productos[1] (botella) < min (dosis) ?? Si -> min = productos[1] y pos = 1
     j = 2 -> j < productos-1 (2)?? No
    i = 1 -> i < productos-1 (2)?? Si -> min = productos[1] (botella) y pos = 1
     j = 2 -> j < productos-1 (2)?? No
    i = 2 -> i < productos-1 (2)?? No
    //FINALIZAN LOS BUCLES Y SE HACE UN SOLO CAMBIO:
    temp = productos[2] (caja)
    productos[2] = productos[1] (botella)
    productos[1] = temp (caja)


    Como ves, ahí está el problema. Para encontrar estos errores la gente suele recurrir a un depurador que te muestra el estado de las variables en cada momento y qué instrucción se va a ejecutar. Y sino pues lápiz y papel y a mano como acabo de hacer.

    PD: Cuando arregles eso, ten cuidado con el último for() porque al usar la misma variable (i) que en el primero, como metas uno dentro del otro tendrás problemas.
#153
Redes / Re: [VirtualBox] Adaptadores de Red
24 Noviembre 2020, 14:15 PM
Efectivamente en las herramientas de VirtualBox me aparecen los dos adaptadores que veo también desde Configuración - Red e Internet - Estado - Cambiar opciones del adaptador.

Y respecto a lo de que algún programa/extensión puede que me agregue estos adaptadores; hasta ahora pensaba que era Genymotion el único que lo hacía y suponía que sería para asignar dicho adaptador al dispositivo creado desde aquí. Sin embargo, en esta última ocasión ha sido el propio VBox el que me ha creado el adaptador extra.
He comprobado todas las máquinas virtuales por si se hubiese asignado dicho adaptador a alguna de ellas y no es así. Todas las máquinas las tengo configuradas con un único adaptador y están conectados a NAT, no a host-only adapter.

Hay alguna manera de averiguar por qué se están creando más adaptadores??
#154
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.
#155
Programación C/C++ / Re: No Imprime
23 Noviembre 2020, 23:20 PM
Cita de: hzre en 23 Noviembre 2020, 18:44 PM
Me marca error en quicksort, tengo la idea pero no se si me falte otra libreria o asi algo por el estilo
Efectivamente, como dice Eternal Idol, lo que te falta es el código; es decir, la función. La función:
quicksort(int[], int, int);
no existe por lo que tienes que implementarla tú.
Eso es lo que pasa cuando se copia el código tal cual de Github.

PD: Espero por tu propio bien que ese programa no sea una tarea que tengas que entregar pues ya ves lo fácil que ha sido encontrar el código original.
#156
Programación C/C++ / Re: Código de inventario en C
21 Noviembre 2020, 21:20 PM
Cuando tengas un error, explícalo para poder saber de qué tipo de error se trata.

  • Las líneas 30 - 32 van fuera de ese for(). Así estás haciendo un intercambio en cada iteración de dentro y muchas veces será entre un mismo elemento, lo que equivale a no hacer nada.
  • Elimina las declaraciones de i y de j en la línea 5. Las estás declarando nuevamente en el for().
  • Utiliza otro nombre de variable en el for() de la línea 36. Puedes tener conflictos entre una i y la otra. Aparte supongo que ese último for lo tendrás para hacer las pruebas porque sino no tiene mucho sentido que muestres todos los productos en cada movimiento.

    Si el error no es por ninguna de esas cosas, adjunta el error.

    PD: No es recomendable utilizar system() para hacer una pausa. Esta función realiza una llamada al sistema lo que conlleva mayor gasto de recursos. La mejor alternativa para C es utilizar getchar() (que pertenece a <stdio.h>).
#157
Java / Re: Procesos
19 Noviembre 2020, 06:41 AM
Cita de: rubcr en 18 Noviembre 2020, 11:36 AM
Hola buenas.
Me ha surgido una duda de como programar procesos en java.
Poniendo un ejemplo, ¿como se podría crear un proceso que ejerza como proceso padre y pida una frase por teclado y uno que ejerza como hijo y haga algo con esa frase como invertirla y la muestre?
He visto mucha documentación y no me llega a quedar claro.
Espero que alguien me ayude.
Un saludo.
El funcionamiento es mucho más sencillo de lo que parece. A continuación te explico los pasos de lo que tienes que hacer:
PD: No te voy a dar el programa hecho. Solo te voy a dar un ejemplo de conexión de procesos en Java (que no es poco) y tú tendrás que hacer el resto.

  • Crear las dos clases ejecutables de manera independiente. Ambas clases deben tener su método main() y la clase hija (independiente) debe poder ejecutarse por si sola y funcionar correctamente. Esta última la vamos a crear con un BufferedReader para obtener los datos de la entrada estándar:
    Código (java) [Seleccionar]

    public class Independent {
      public static void main(String[] args) {
        try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { // try-with-resources para cerrar automaticamente el br
          System.out.println("Introduce un numero: ");
          int numero = Integer.parseInt(br.readLine());
          System.out.println(numero * 2);
        } catch(Exception e) {}
      }
    }


    Ahora tienes que hacer una clase dependiente que lo que hará será ejecutar la clase independiente y mandarle la entrada como si la hubiésemos introducido directamente desde el teclado, después recibirá su salida y la mostrará:
    Código (java) [Seleccionar]

    public class Dependent {
      public static void main(String[] args){
        ProcessBuilder pb = new ProcessBuilder("java", "Independent"); // comando para lanzar la otra clase como si se hiciese desde linea de comandos
        try {
          Process p = pb.start(); // iniciamos el proceso
          OutputStream os = p.getOutputStream(); // redireccionamos su ENTRADA a os. Se utiliza output porque se entiende que es la salida del padre
          BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); // redireccionamos su SALIDA (que es la entrada para el padre)
          os.write((4 + "\n").getBytes()); // Simulamos que hemos introducido un 4 por teclado y le hemos dado al enter
          os.flush(); // hacemos que los bytes anteriores se escriban en el flujo. Si no hacemos esto se quedaran en un buffer temporal y no continuara
          // Ahora el programa hijo que ha sido lanzado hace un rato acaba de recibir el flujo anterior como si lo hubiesemos introducido por teclado
          // Ahora "ha mostrado" el resultado (8). Tenemos que recoger su salida mediante br:
          br.readLine(); // Leemos la primera linea de su salida que no interesa (porque es: "Introduce un numero: \n")
          int doble = Integer.parseInt(br.readLine()); // Guardamos el 8 que se habria mostrado por pantalla
          System.out.println("El resultado es: " + doble);
        } catch(Exception e){}
        // ...ahora habria que cerrar flujos y demas...
      }
    }


  • Si trabajas desde un IDE es posible que tengas problemas con la instanciación del ProcessBuilder pues tendrás que utilizar un comando de ejecución algo más complejo.
  • Si trabajas en Windows y tu IDE está configurado en UTF-8 tendrás que añadir la codificación a la instrucción.

    A partir de aquí te toca continuar a ti y si tienes algún otro problema siempre puedes preguntar pero adjunta lo que tengas hecho. :-X
#158
Programación C/C++ / Re: Código de inventario en C
19 Noviembre 2020, 05:55 AM
Cita de: Boris Morales en 19 Noviembre 2020, 04:13 AM
POR FAVOR, CUALQUIER AYUDA O COMENTARIO ES BIENVENIDO  :(  :-(
ESPERO NO ME IGNOREN...
Un consejo para que no te ignoren: no pongas un código de 990 líneas. Y más cuando es innecesario. El código en un vistazo general parece que está bien estructurado por lo que es más que suficiente con que pongas las funciones involucradas en la parte del error.

Cita de: Boris Morales en 19 Noviembre 2020, 04:13 AM
-Muestra el laboratorio de un producto buscándolo por su descripción, en este ya hice unos cambios que de hecho están en el menú "buscarDescripcion"; pero no me da el resultado que espero :(

El problema lo tienes en la función existeProducto2():
Cita de: Boris Morales en 19 Noviembre 2020, 04:13 AM

char existeProducto2(char descripcionProducto, Producto *producto)//
{
FILE *archivo;
char existe;

/* Abre el archivo en modo lectura */
archivo = fopen("productos.dat", "rb");

if (archivo == NULL) { /* Si no se pudo abrir el archivo, el valor de archivo es NULL */
existe = 0;

} else {
existe = 0;

/* Se busca el producto cuyo código coincida con codigoProducto */
fread(&(*producto), sizeof(*producto), 1, archivo);
while (!feof(archivo)) {
if ((*producto).descripcion == descripcionProducto) {
existe = 1;
break;
}
fread(&(*producto), sizeof(*producto), 1, archivo);
}

/* Cierra el archivo */
fclose(archivo);
}

return existe;
}

Estás comparando dos cadenas de caracteres char[] utilizando el operador ==. Para esto tienes que utilizar la función strcmp(). A juzgar por el comentario de la línea anterior (15), has cambiado código por descripción (siendo código un int y descripción un char[]) y se te ha olvidado cambiar la función de comparación.

Un par de consejos extra:
  • La función fread() la puedes meter en la condición del while()
  • La nomenglatura: (*puntero).valor se puede sustituir por: puntero->valor.
  • Los operadores & y * se anulan. Utilizar: &(*p) es lo mismo que utilizar: p.

    Cita de: Boris Morales en 19 Noviembre 2020, 04:13 AM
    -Ordenar alfabéticamente los productos por su descripción, utilizando método de selección
    -Ordenar alfabéticamente los productos por laboratorio, utilizando método de inserción
    Especifica qué problemas tienes con esas funciones. Lo único que tienes que hacer es cargar todos los productos en un Producto[], ordenarlos por cualquiera de los métodos y volver a guardarlos en el fichero.
    No es muy eficiente estar continuamente accediendo al fichero para cada operación. Por eso es mejor cargar los datos en memoria y trabajar con ellos desde un array.

#159
Programación General / Re: ayuda con programa
17 Noviembre 2020, 15:00 PM
Para lo que quieres hacer tienes que ver los procesos del sistema. Para eso está el comando: ps.
Puedes buscar las opciones que tiene mediante argumentos adicionales.
#160
Para llamar a la función de la clase base tienes que usar ::.
Código (cpp) [Seleccionar]

struct Base {
  virtual void show(){
    cout << "Base" << endl;
  }
};

struct Derived : Base {
  void show(){
    Base::show();
    cout << "Derived" << endl;
  }
};

int main(){
  Derived d;
  Base *p = &d;
  p->show();
}


SALIDA:

Base
Derived