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

#571
Cita de: DarkSorcerer en 25 Noviembre 2013, 11:19 AMEl problema que mas me complica es que si ingreso una letra, pareciera ser que el ciclo while se vuelve loco e imprime el menu infinitas veces, por ahi lei que es necesario usar el clear para restablecer "cin" y tambien usar el flag cin.fail(), pero no tengo los resultados esperados.
El problema se debe a que el operador ">>" solo consumirá los caracteres validos para la conversión indicada, si el carácter en turno no es valido se queda en el bufer de la entrada estándar para ser procesado eventualmente.

Para solucionarlo solo debes eliminar el resto de la linea mediante sync o ignore. Un ejemplo sencillo del uso de este ultimo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include <limits>
using std::numeric_limits;

int main()
{
   int numero;
   
   while (true) {
      cout << "Introduce un numero: ";
      if (cin >> numero)
         break;
      else {
         cin.clear();
         cin.ignore(numeric_limits<int>::max(), '\n');
      }
   }
   
   cout << "El numero es " << numero << endl;
   
   return 0;
}


Un saludo
#572
Eso sucede porque en C todo se pasa por valor, si quieres modificar una variable declarada en otra función tienes que hacerlo indirectamente emulando el paso por referencia:

1) La función recibe la dirección en memoria del objeto.
2) Utilizando indirección se accede al objeto apuntado.
Ejemplos sobre ello los puede consultar vía el motor de búsqueda de los foros.

Si aplicamos eso al primer programa tenemos:
#include <stdio.h>
#include <stdlib.h>

void inicializaTablero(char ***tablero, int n);

int main(void)
{
   int n,i,j;
   char **tablero;
   
   printf("Dame tamanio de tablero: ");
   fflush(stdout);
   scanf("%d", &n);
   
   inicializaTablero(&tablero,n);
   for(i = 0;i < n;i++){
      for(j = 0; j < n; j++)
         printf("[%c]", tablero[i][j]);
     
      putchar('\n');
   }
   
   return 0;
}

void inicializaTablero(char ***tablero, int n)
{
   int i,j,k;
   
   *tablero = malloc(n * sizeof **tablero);
   for(i = 0; i < n; i++)
      (*tablero)[i] = malloc(n);
   
   /* NO tiene caso, en su lugar usa la funcion calloc */
   for (j = 0; j < n; j++)
      for (k = 0; k < n; k++)
         (*tablero)[j][k] = '0';
}


Por ultimo y sin temor a repetir: en C la conversión explicita no es necesaria.

Un saludo
#573
Para cambiar el separador solo tienes que cambiar la cadena pasada a strtok como segundo argumento (no tiene porque ser la misma en cada llamada).

Si el objetivo de ese fragmento solo es obtener un maximo de tres tokens (el comando y sus dos parametros) debes cambiarlo a:
fgets(frase, 100, stdin);
parametro1 = NULL;
parametro2 = NULL;
contador = 0;
if ((comando = strtok(frase, " ")) != NULL){
   contador++;

   if ((parametro1 = strtok(NULL, " ")) != NULL){
      contador++;

      if ((parametro2 = strtok(NULL, "\n")) != NULL)
         contador++;
   }
}


Un saludo
#574
Casi. Debes utilizar el operador lógico OR para verificar si el carácter en turno es '1' o '0':
while (argv[1][i] == '1' || argv[1][i] == '0'){
   /* ... */
}

También puedes utilizar un bucle for para tener ahí la inicializacion del contador y su incremento después de cada iteración:
for (i = 0; argv[1][i] == '1' || argv[1][i] == '0'; i++){
   /* ... */
}


Un saludo
#575
Programación C/C++ / Re: desbordamiento de arreglos
24 Noviembre 2013, 17:25 PM
Ya que el resultado de los operadores relacionales y lógicos es uno si se cumple la condición y cero en caso contrario puedes reducir la función a:
int VerificarCelda(int total_filas, int total_columnas, int fila, int col, int x)
{
   return  fila + x < total_filas && col + x < total_columnas;
}


Un saludo
#576
Solo tienes que modificar la función "DibujarTablero" para que reciba dos argumentos (los tableros de ambos jugadores). En su bucle principal imprimes la primera fila del primer tablero seguida de la primera fila del segundo tablero, la segunda fila del primer tablero seguida de la segunda fila del segundo tablero, etc..

Un saludo
#577
De nuevo: cuando tengas una duda por favor indica el lenguaje de programación.

¿Modificaste el segundo fragmento de tu primer mensaje?

En C para implementar una matriz el idioma es:
T **mat;

/* ... */

mat = malloc(NUM_FILAS * sizeof *mat);
for (i = 0; i < NUM_FILAS; i++)
   mat[i] = malloc(NUM_COLS * sizeof *mat[i]);

Donde "T" es el tipo de los elementos de la matriz, la ventaja de esta forma es no tener que indicar el tipo apuntado al reservar memoria.

Cita de: m@o_614 en 23 Noviembre 2013, 06:32 AMpor que en algunas ocasiones lo ponen como puntero y en otras no
Porque depende del programa, cuando se reserva memoria siempre se utiliza el operador sizeof con el tipo del objeto apuntado, por ejemplo:
/* Ejemplo 1: el tipo apuntado es *p == int */
int *p;

p = malloc(ALGUN_VALOR * sizeof *p);

/* Ejemplo 2: el tipo apuntado es *q == int (*[10])(void) */
int (*(*q)[10])(void);

q = malloc(ALGUN_VALOR * sizeof *q);


Un saludo
#578
Cita de: johndoe1337 en 23 Noviembre 2013, 00:21 AMquisiera utilizar listas y memoria dinámica en mi juego, el objetivo es poder remover un barco en cierta posición y volver a colocarlo en otra ya sea porque me equivoque o algo
1) La ventaja de las listas vinculadas es su mayor eficiencia (en comparación con el uso de un array) de las operaciones inserción y eliminación.
2) Reservar memoria en tiempo de ejecución permite su uso de manera eficiente al no conocer (de antemano) el numero de elementos de un array.

Como ninguno de los dos casos aplica en el juego de batalla naval no tiene caso (en mi opinión) implementar los cambios.

Un saludo
#579
Cuando tengas una duda por favor indica el lenguaje de programación.

Cita de: m@o_614 en 22 Noviembre 2013, 23:13 PM
si tengo  una matriz n x n, a la que quiero asignarle memoria dinamicamente porque su tamaño solo se puede saber en tiempo de ejecucion, cual es la manera correcta de hacerlo?
La segunda. Dos detalles a considerar son 1) en C no es necesaria la conversión explicita y 2) en C y C++ no es necesario utilizar "sizeof(char)" ya que este siempre es igual a uno.

Cita de: m@o_614 en 22 Noviembre 2013, 23:13 PMotra duda, estaba leyendo un manual sobre memoria dinamica y me decia que si hacia algo como esto me iba a dar error de compilacion que porque el compilador requiere que el tamaño del array o de la matriz sea constante

[...]

pero ya lo probe y me compila correctamente, a que se debe esto??
* En C++ no es valido.
* En C depende del modo de compilación: C90 no lo soporta, C99 si (array de longitud variable o VLA) y C11 también lo soporta pero como una característica opcional.

Un saludo
#580
Programación C/C++ / Re: Leer fichero y "trocearlo"
22 Noviembre 2013, 18:29 PM
Cita de: SARGE553413 en 22 Noviembre 2013, 16:05 PMTengo un vector de punteros a char.
Quiero leer todas las líneas de un fichero y almacenar cada una de ellas en cada componente de mi vector de punteros.
No conozco a priori el tamaño del fichero.

El problema es que, no se por qué, al redimensionar el vector de punteros voy perdiendo las cadenas almacenadas.
Cuando utilizas el operador new este reserva un bloque de memoria del tamaño apropiado, nada mas. El problema es que tu esperas que copie el contenido del bloque anterior y eso no lo hará el operador. Debes hacerlo manualmente reservando un nuevo bloque de memoria, copiando en el las direcciones de memoria y finalmente liberando el bloque original (y utilizando a partir de ese momento el nuevo bloque).

Cita de: SARGE553413 en 22 Noviembre 2013, 16:05 PM¿Qué puedo hacer?
Ya que el lenguaje es C++ es mejor utilizar un vector de objetos de tipo string para almacenar todas las lineas del archivo, con ello te liberas del manejo de memoria.

Un saludo