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

#1181
Programación C/C++ / Re: Ayuda con vectores.
9 Octubre 2012, 03:06 AM
Cita de: elkiedis en  8 Octubre 2012, 05:10 AMnecesito validar si dentro del vector existe una carta que equivalga a una tirada de Dados realizada por el jugador
Para esto solo tienes que verificar el valor de "Dados" sea menor que 10 y que el valor de "Cartas[ Dados ]" sea diferente de cero.


Cita de: elkiedis en  8 Octubre 2012, 05:10 AMo si al menos, existe la posibilidad de sumar 2 cartas del Vector para obtener el resultado de la tirada de Dados.
La tirada de Dados consta de 2 dados de 6 caras c/u. Siendo la tirada mas baja posible 2, y la mas alta 12.
Para esto solo necesitas de un bucle. La función con los cambios:
int validaJugada(void)
{
   int i;
   int j;
   
   if (Dados > 9){
      i = Dados - 9;
      j = 9;
   }else {
      i = 1;
      j = Dados - 1;
   }
   
   while (i < j && (!Cartas[i] || !Cartas[j])){
      i++;
      j--;
   }
   
   return i < j;
}


Un saludo
#1182
Cita de: marvic en  7 Octubre 2012, 21:55 PMEstoy documentando un programa y necesito literatura (en ingles mejor) para explicar  que problemas podria haber al cambiarlo de maquina
La función "memcpy" no debe dar problemas siempre y cuando las direcciones de origen y destino así como el numero de caracteres a copiar sean los correctos. Aquí nos convendría que dieras una descripción mas detallada del programa.


En cuanto al caso particular que mencionas:
Cita de: marvic en  7 Octubre 2012, 21:55 PMmemcpy(&estructura1,"\x00\x00\x00\x00\x00\x00\x00\x00",8);

en este caso
estructura1{
    int a;
    int b;
}
Das por sentado que el tamaño del tipo "int" es cuatro, si ese no es el caso, por ejemplo si "sizeof(int)" es igual a dos, la función escribiría fuera de la región en memoria del objeto y eso seria un error.


Cita de: marvic en  7 Octubre 2012, 21:55 PMNecesito literatura sobre si esta manera de copiar el valor directamente podria dar problemas en diferentes arquitecturas por gestionar la memoria del struct de diferente manera.
No recuerdo uno enfocado específicamente en el tema. Una opción seria leer los estándares de C (o alguno de sus borradores) pero son documentos muy pesados (muy técnicos). Otra opción seria leer un libro enfocado en C estándar, buena parte de las recomendaciones que se dan al seguir el estándar tienen que ver con el tema de la portabilidad.

Un saludo
#1183
Programación C/C++ / Re: Duda sobre crash
7 Octubre 2012, 17:24 PM
El problema que mencionas se debe a la sentencia condicional:
Código (cpp) [Seleccionar]

for (int i = -2000; i < 2000; i++){
   if ((i >= 0 && !used1[i]) || used2[i * (-1)])
      cout << i << " ";
}

Al evaluarse el operando izquierdo de "||":
Código (cpp) [Seleccionar]
(i >= 0 && !used1[i])
Si "i" es mayor o igual a cero y "!used1[ i ]" es cero la condición es falsa y se evalúa la expresión a su derecha:
Código (cpp) [Seleccionar]
used2[i * (-1)]
Y de nuevo: si el valor de "i" es mayor que cero la expresión "i * (-1)" resulta en un indice negativo. Por cierto no hay necesidad de multiplicar por menos uno, puedes utilizar el operador unario "-".

Para que el programa funcione correctamente hay que cambiar el condicional a:
Código (cpp) [Seleccionar]
for (int i = -2000; i < 2000; i++){
   if ((i >= 0 && !used1[i]) || (i < 0 && !used2[-i]))
      cout << i << " ";
}


También debes declarar el bitset "used2" con una capacidad de 2001 elementos (ello porque su elemento con indice cero no es utilizado).

Un saludo
#1184
Cita de: Caster en  6 Octubre 2012, 12:30 PMel ambito de una variable una variable automatica puede ser menor que una funcion? una instruccion por ejemplo:
for (auto int i = 5; i < count; ++i)
{
/* code */
}


Es decir, que el valor 5 para la variable solo valga para este bucle
Correcto. El ámbito o alcance de una variable declarada dentro un bloque inicia justo después de su declaración y continua hasta el termino de este (del bloque).

Cita de: Caster en  6 Octubre 2012, 14:06 PM
Y se podria utilizar otro?, asi por ejemplo:

for (static int i = 0; i < count; ++i)
{
/* code */
}
No.


Primero porque en C99 y C11 es posible declarar variables locales a los bucles "for" pero solo pueden incluir los calificadores "register" y "auto", utilizar (como en tu caso) "static" no es valido.


Segundo porque "static" no afecta el alcance de una variable sino su tipo de almacenamiento (en buen cristiano: la duración o "vida" de la variable):

* Las variables automáticas se crean justo en su declaración y desaparecen al terminar su ámbito (el bloque al que pertenecen).

* Las variables estáticas se crean, conceptualmente, justo antes de iniciar el programa y se inicializan con el valor indicado (si no existe su valor inicial es 0, 0.0 o NULL dependiendo del caso). Ellas desaparecen justo antes de terminar la aplicación.

Un programa de ejemplo:
#include <stdio.h>
#include <stdlib.h>

void f(void);
void g(void);

int main(void)
{
   int i;
   
   for (i = 0; i < 5; i++)
      f();
   
   puts("----");
   
   for (i = 0; i < 5; i++)
      g();
   
   return EXIT_SUCCESS;
}

void f(void)
{
   int i = 100;
   
   printf("%d\n", i);
   i++;
}

void g(void)
{
   static int i = 200;
   
   printf("%d\n", i);
   i++;
}


Y su salida es:
100
100
100
100
100
----
200
201
202
203
204


Un saludo
#1185
Cita de: soyloqbuskas en  5 Octubre 2012, 21:14 PMSabeis como puedo hacer una linea como esta en C?

system("programa -a param1 -b %s -c param3", intVar);
Deseas construir el comando que pasaras a la función "system" mientras se este ejecutando tu programa, ¿Es así?

Si ese es el caso puedes utilizar la función "sprintf" (prototipo en <stdio.h>), esta es casi idéntica a "printf" con la diferencia que la cadena no se envía a la salida estándar sino que se almacena en el array indicado.

Por ejemplo:
#include <stdio.h>
#include <stdlib.h>

#define LONG_LINEA  256

int main(void)
{
   char cmd[LONG_LINEA];
   int i;
   
   for (i = 0; i < 10; i++){
      sprintf(cmd, "compilador -abc %d.c", i);
      printf("%s\n", cmd);
   }
   
   return EXIT_SUCCESS;
}


Y su salida es:
compilador -abc 0.c
compilador -abc 1.c
compilador -abc 2.c
compilador -abc 3.c
compilador -abc 4.c
compilador -abc 5.c
compilador -abc 6.c
compilador -abc 7.c
compilador -abc 8.c
compilador -abc 9.c


Un saludo
#1186
Correcto. Si se trata de una sola sentencia no es necesario utilizar llaves.

Un saludo
#1187
Cita de: Erres en  5 Octubre 2012, 15:58 PMpor cierto, el fread si me esta funcionando, pero me regresa mas de lo que ocupo (me regresa caracteres raros)
La razón es, al no darle un valor inicial a cada elemento del array "leer", estos inician con un valor no definido o basura. Para corregir eso debes cambiar la declaración a, por ejemplo:
char leer[100] = "hola";

Y se deben tener en cuenta dos detalles en relación a la función "fread":

1) La función lee los caracteres y los almacena tal cual, no agrega el '\0' como es el caso con "fscanf" y "fgets" (lo cual puede ser bueno o malo, dependiendo del caso).

2) La función retorna el numero de elementos leídos y almacenados, esto es:
numero de caracteres leídos / tamaño del elemento
Si el tamaño del elemento es 1 el valor retornado es el numero de caracteres pero no es así si el tipo del elemento es, por ejemplo, "signed int".

Un saludo
#1188
Cita de: Caster en  3 Octubre 2012, 19:35 PMAntes de nada, no he compilado el codigo, voy a fiarme del libro
Al parecer al copiar el programa agregaste (de forma accidental, por supuesto) algunos errores o bien el libro no es de calidad. ¿Que libro estas leyendo?

Hay varias partes a modificar en la función "inverso":

* Faltan los paréntesis en la llamada a "getchar".
* El tipo de retorno de "getchar" es "int".
* Si "getchar" por alguna razón falla a partir de ese momento retorna "EOF" y como este valor es distinto de '\n' se entra en una recursion infinita.
* No es necesaria la sentencia "return;" al final de la función, esta retorna al encontrarse su llave de cierre '}'.

El programa con las correcciones:
#include <stdio.h>

void inverso(void);

int main(void)
{
   puts("Introduce una linea de texto debajo:");
   inverso();
   return 0;
}

void inverso(void)
{
   int c;
   
   if ((c = getchar()) == '\n')
      putchar('\n');
   else if (c != EOF){
      inverso();
      putchar(c);
   }
}


Un saludo
#1189
Cita de: Mari2012 en  5 Octubre 2012, 16:18 PM
fgets(cadena,100,stdin); /* stdin funciona como archivo no? de ser asi: cadena no deberia primero ser escrita en stdin para luego ser leida en esa archivo*/
Cuando una aplicación de consola inicia se tienen tres streams predeterminados (stdin, stdout y stderr), puedes utilizarlos casi de la misma forma que un archivo abierto con "fopen".


Cita de: Mari2012 en  5 Octubre 2012, 16:18 PM
while (cadena[++i]!='\0');
    i=i-1;
[...]
/*por que en los while colocas ; y no llaves { }*/
Porque en ese bucle no hay nada que hacer en su cuerpo, sin embargo el lenguaje C requiere que todo bucle tenga un cuerpo. Para cumplir con esa regla se pone una sentencia nula:
/* sentencia nula (nada) */ ;

La convencion en estos casos es colocar la sentencia nula en una linea aparte:
while (cadena[++i] != '\0')
   ;


Un saludo
#1190
Cita de: Caster en  1 Octubre 2012, 21:36 PM
Es exactamente el mismo codigo, es un copia y pega de lo que has posteado tu y me sigue dando el fallo.
Eso es debido a que la declaración de una referencia:
Código (cpp) [Seleccionar]
void modificar(int &a) {
Y la reserva de memoria mediante "new":
Código (cpp) [Seleccionar]
int *a = new int(2);
Son parte del lenguaje C++ (pero no de C).

Un saludo