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

#101
No recuerdo mucho de ensamblador desde que lo estudié pero buscando un poco en Internet he encontrado este enlace dónde parece que está bien explicado: https://stackoverflow.com/questions/21245245/c-uses-assemble-operand-type-mismatch-for-push

Resumiendo: si utilizas 'push' sin un sufijo 'w/l/q' para 16/32/64 bits respectivamente, el ensamblador determinará cuál es el sufijo más apropiado. Como %eax es de 32 bits, utilizará 'pushl' pero las máquinas con arquitecturas de 64 bits no soportan esa operación de 32 bits.
Solución: Utilizar 'pushq %rax' y trabajar con el registro de 64 bits.

Como ya digo, no tengo mucha experiencia y lo que he dicho está básicamente sacado del enlace a stackoverflow. Espero que te sirva y en caso contrario, siempre puedes echar un vistazo tú mismo a las respuestas por si encuentras algo que te sirva.

Suerte  :-X
#102
La función Beep() es propia de Windows y se encuentra en la biblioteca <windows.h>.
Buscando un poco por Internet he podido encontrar esto pero no sé si funcionará alguna de las opciones:
https://stackoverflow.com/questions/12919378/playing-beep-in-c-linux
https://stackoverflow.com/questions/10072909/beep-on-linux-in-c
#103
 :xD :xD :xD :xD
Empezaba a extrañar ya a la gente que viene pidiendo que les den la tarea hecha...
En vez de dedicar el poco tiempo que puedes sacar de tu viaje a pedir la tarea en un foro, dedícalo a hacerla tú mismo.
Suerte  :silbar:
#104
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.
#105
El código debe estar publicado entre etiquetas de Código GeSHi. Puedes seleccionarlas en el desplegable que dice "Código GeSHi" o escribiendo directamente:
[code=cpp]
// Tu codigo C++
[/code]




Los espacios tienes que imprimirlos también tú pues el programa siempre escribirá desde la izquierda en cada línea. Entonces tienes que encontrar un patrón (una regla) que sigan estos espacios. Además lo bueno es que solo tienes que preocuparte por los espacios a la izquierda ya que a la derecha son indiferentes.

Si te fijas en la línea 0, los espacios a la izquierda son: 0. En la línea 1, los espacios a la izquierda son: 1. ...así hasta que solo imprimes 1 valor y entonces los espacios serán (n-1) y entonces empiezan a disminuir.

Otro problema que veo es que no va a parecer centrado sino que aparecerá alineado a la derecha. Esto es porque al usar fuentes monoespaciadas (todos los caracteres ocupan lo mismo), en la línea 1 (empezando a contar por el 0) el espacio ocupará el hueco del 1, el 1 el hueco del 2,..., y el 5 ocupará el hueco del 6 por lo que quedará a la derecha. La solución es incluir un espacio entre cada valor de forma que quede:

1 2 3 4
1 2 3
 1 2
  1
 1 2
1 2 3
1 2 3 4


Para que se entienda bien lo que tienes que hacer:
Código (cpp) [Seleccionar]

int numeroMaximo = 6; // por ejemplo
for(int linea = 0; linea < numeroMaximo; ++linea){
 // En la linea 0 -> 0 espacios | En la linea 1 -> 1 espacio | En la linea 2 -> 2 espacios | ...
 for(int espacios = 0; espacios < linea; ++espacios){
   cout << " ";
 }
 // En la linea 0 -> 6 numeros | En la linea 1 -> 5 numeros | En la linea 2 -> 4 numeros | ...
 for(int numero = 1; numero <= (numeroMaximo - linea); ++numero){
   cout << numero << " "; // Incluimos un espacio despues de cada numero para que tenga forma
 }
}

Con esto consigues la primera mitad.
Ahora te toca ver cómo haces la segunda mitad pero la idea es la misma.

#106
Programación C/C++ / Re: Juego de Buscaminas
28 Enero 2021, 01:01 AM
En esta ocasión no voy a explayarme tanto como en el otro tema. El foro es para resolver dudas concretas, no para que te digan cómo tienes que hacer cada ejercicio y te lo den prácticamente hecho. Para otra ocasión incluye concretamente cuál es la duda o problema que tienes.

Imagina un tablero con: X (mina) y ? (no mina)

? ? X ?
X ? ? ?
? X ? X
? ? ? ?


Tendrías que introducir en el programa los siguientes datos (tal y como te dicen):

4 // Numero de filas/columnas del tablero (matriz)
4 // Numero de minas en el tablero (cada X)
0 2 // Coordenadas de la primera mina (0,2)
1 0 // Coordenadas de la primera mina (1,0)
2 1 // Coordenadas de la primera mina (2,1)
1 3 // Coordenadas de la primera mina (1,3)


Ahora tienes que hacer un programa que construya el tablero completo comprobando cuántas minas hay adyacentes a cada casilla. Te doy la solución para que la compruebes con tu programa:

1 1 -1 1
-1 2 2 2
2 -1 2 -1
1 1 2 1


Suerte  :-X
#107
Programación C/C++ / Re: validar gato
27 Enero 2021, 09:12 AM
Primero, para situarnos, vemos que se habla del juego del gato (conocido también como el 3 en raya si el tablero es de 3x3). Esto se juega entre dos jugadores que ponen sus fichas en el tablero y el primero que consigue completar una fila, columna o diagonal (principal o secundaria) con sus fichas, gana. Hasta aquí todo claro.

Lo que parece que pide es un algoritmo que determine si un jugador en concreto ha ganado. Para ello tienes que pasar una entrada al programa en el formato que te dicen:
Citar
En la primer línea el valor  entero a buscar en el tablero.

En la segunda línea separados por un espacio, la cantidad 3<=n<=10 de renglones y columnas para una matriz (tablero) de forma cuadrada.

A partir de la tercera línea, se presentan separadas por un espacio los números de cada renglón de la matriz, se inicia con el renglón 0 y se termina con el renglon n-1 , y en cada renglón se inicia con la columna 0  y se termina con la columna . n-1

Suponiendo que los valores pueden ser: {0, 1, 2} para representar: {casilla vacía, jugador1, jugador2}, respectivamente.
Un ejemplo de entrada podría ser:

1 // Vamos a ver si ha ganado el jugador 1
4 // En un tablero de 4x4 cuyos valores actuales son: (Y ahora escribimos la matriz que representa el tablero)
1 0 0 2
1 1 2 2
2 1 1 2
0 0 0 1

Como se puede ver, en este caso sí ha ganado el jugador 1 porque tiene la diagonal principal completa con sus fichas. Entonces tu algoritmo tiene que devolver 1 (lo que viene a traducirse como true). En caso de que el jugador 1 no hubiese ganado (bien porque ha ganado el jugador 2 o porque no ha ganado ninguno todavía), debería devolver un 0 (que equivale a false).

No sé si este programa tienes que hacerlo en C o C++ pero una idea para empezar (en C) puede ser:

#define MIN_SIZE 3
#define MAX_SIZE 10

// Es obligatorio indicar todas las dimensiones de un array, excepto la primera
// Esta funcion comprueba si el jugador indicado ha ganado segun la matriz (tablero) indicada
int comprobarGanador(int, int[][MAX_SIZE], int);


int main(){
  // La forma mas sencilla para empezar es crear una matriz con el maximo valor posible y usar solo la parte necesaria
  int matriz[MAX_SIZE][MAX_SIZE];
  // Aqui ya depende del formato que utilices para la entrada de datos (fichero, teclado,...)
  int jugador;
  // Con este bucle sigues pidiendo un valor hasta que sea valido (1 o 2)
  do {
    printf("Introduce el jugador a comprobar (1/2): ");
    scanf("%d", &jugador);
  } while(jugador != 1 && jugador != 2);

  // Hacemos lo mismo para el orden de la matriz
  int orden; // A partir de ahora tenemos que usar 'orden' para recorrer la matriz porque las posiciones restantes hasta MAX_SIZE contendran basura
  do {
    printf("Introduce el orden del tablero [%d, %d]: ", MIN_SIZE, MAX_SIZE);
    scanf("%d", &orden);
  } while(orden < MIN_SIZE || orden > MAX_SIZE);

  for(int i = 0; i < orden; ++i){
    printf("Introduce los valores de la fila %d: ", i);
    for(int j = 0; j < orden; ++j){
      scanf("%d", &matriz[i][j]); // Aunque se escriban todos los valores en una fila, scanf() va separando por espacios
    }
  }

  printf("El jugador %d ha ganado la partida?: %d\n", jugador, comprobarGanador(jugador, matriz, orden));
  // Si vas a ejecutarlo desde la consola hay que incluir la siguiente linea para que no se cierre hasta pulsar Enter:
  getchar(); // cin.get() si se hace en C++
  return 0; // El return se puede omitir y el compilador lo incluye implicitamente
}

int comprobarGanador(int jugador, int matriz[][MAX_SIZE], int orden){
  // Aqui queda tu tarea de comprobar si el jugador indicado ha ganado o no
  // Recuerda recorrer la matriz hasta la fila/columna <orden-1> y no hasta <MAX_SIZE-1> (no es lo mismo)
}


Tenía ganas de escribir algo en C así que creo que con eso ya te he dejado más que suficiente... :silbar: :silbar:
Con implementar la función comprobarGanador(), el código debería funcionar correctamente (si no he olvidado nada). Luego ya puedes cambiar lo que quieras o necesites.
Si lo pruebas con el ejemplo de entrada que puse antes el resultado debería ser:
El jugador 1 ha ganado la partida?: 1
#108
Para cambiar el idioma de un toast se hace igual que con cualquier otro elemento.
Lo importante es que no definas las cadenas (strings) en el propio código fuente sino que lo hagas en el fichero strings.xml. Así después basta con crear otro fichero strings.xml cambiando el lenguaje y definir las mismas cadenas pero en el idioma que quieras.

Desde el código fuente tienes que hacer referencia a las cadenas de strings.xml. Así al cambiar el idioma del dispositivo, las cadenas se obtendrán del xml correspondiente y se cambiarán automáticamente.
#109
Programación C/C++ / Re: Duda C++
3 Enero 2021, 17:47 PM
Pues para hacer/entender programas escritos en C++ básicamente... :xD :xD

C++ es un lenguaje que se usa bastante de forma profesional para videojuegos pero tú puedes hacer programas de cualquier tipo con él. Una de las cosas que destacan de este lenguaje es que tiene tantos las características de alto nivel (al igual que lenguajes como Java) como de bajo nivel (al igual que C o ensamblador). Puedes hilar muy fino si así lo necesitas y trabajar directamente con espacios de memoria y punteros, cosa que en otros lenguajes de alto nivel es imposible.
Además, cualquier código escrito en C lo podrás compilar y ejecutar junto a C++ (a la inversa no)
#110
Programación C/C++ / Re: extraer submatrices
27 Diciembre 2020, 20:25 PM
Tienes varios errores:
  • Líneas 17 y 18 -> La i y la j marcan el punto de inicio. A cada valor de i y de j le vas a sumar hasta 2 por lo que en las últimas iteraciones de cada bucle se te saldrá fuera de la matriz.
  • Línea 23 -> No es la misma la posición que vas leyendo de la matriz original que la posición en la que tienes que escribir de la submatriz. Aunque hagas la submatriz que empieza por ejemplo en [2][3] tienes que empezar a escribir en
  • , no en [2][3].
  • Líneas 25 - 28 -> No tienes que calcular la suma cada vez que cambias un valor sino cada vez que copias una submatriz completa. Tal y como lo haces ahora mismo estás calculando sumas de submatrices que no existen.

    Aparte de los errores, ese programa está muy limitado pues no permite cambiar fácilmente ni el tamaño ni los valores de las matrices. Sería mejor usar constantes para permitir esto más fácilmente.