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

#41
Hola, tengo el siguiente fragmento de programa:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void baraja( int wMazo[][13] );
// código

int main (void)
{
   //código
   int mazo[4][13] = {0};
   srand(time(0));
   baraja(mazo);
   //código
   return EXIT_SUCCESS;
}

void baraja( int wMazo[][13] )
{
   int fila;
   int columna;
   int carta;

   for(carta=1; carta<=52; carta++){
      do{
         fila = rand() % 4;
         columna = rand() % 13;
      } while(wMazo[fila][columna] != 0);
      wMazo[fila][columna] = carta;
   }
}


No entiendo porqué se pasa wMazo[][13], es decir, porque se deja el primer corchete sin datos, ¿no debería ser wMazo[4][13] ?

Gracias.
#42
Cita de: amchacon en  5 Abril 2014, 20:46 PM
Pues que puedes crear una función que llame a otra función que no sabes ni como es ;D

Suponte que yo hago una librería para trabajar con imagenes BMP. Mi librería es capaz de leer un archivo bmp, descodificarlo y coger los datos de la imagen.

Pintarla es un tema que depende de la librería gráfica que se use en el momento. Como quiero que sea general me hago una función pintartal que así:

Código (cpp) [Seleccionar]
void pintar(void (*ptrF) (int) ptrf);

El usuario que use mi librería, puede pintar la imagen con esta función independientemente de la plataforma y de la librería gráfica que use. Solo necesita que pasar la función que él usa para pintar un pixel en la pantalla.

Muchas gracias. Tendré que investigar más sobre el tema.
Una última cosa, ¿una llamada a una función con un puntero a función es más rápida que una llamada "normal"?
#43
Pues eso, quería saber cual es la ventaja de usar una función con una llamada normal, por ejemplo funcion(10) a hacerlo con un puntero a una función, por ejemplo ( siendo la decalaración void (*ptrF) (int x); )  x=ptrF(10)
#44
Cita de: Eternal Idol en  4 Abril 2014, 01:04 AM
const char *cara es un array constante de punteros a cadena, en cara[0] hay un puntero a "As", en cara[1] a "Dos" y asi con los demas elementos del array.

La funcion llenaMazo, no llena mazo, ni llena Mazo, llenaMazo si, hace lo que te dije antes. ¿Como? Hay un bucle que se ejecuta 52 veces (de 0 a 51), una por cada carta del mazo, en el mismo se asigna a cada carta su cara y su palo, estos se toman de los arrays, se calcula el elemento de cada uno mediante una operacion matematica simple de enteros.

Ejemplo, cuando i es 22:
22 % 13 = 9
22 / 13 = 1

¿Que hay en cara[9]? "Diez". ¿Que hay en palo[1]? "Diamantes". Asi es como funciona, proba con otros numeros y comproba que es correcto. Y de paso escribi una funcion sencilla que tenga un bucle parecido a este pero en lugar de asignar que escriba en pantalla la cara y el palo de cada carta.

Muchísimas gracias  :D
Acabo de terminar de estudiar fundamentos fe punteros y estos temas aún me lían bastante
#45
Cita de: Eternal Idol en  3 Abril 2014, 20:25 PM
Lo que hace es ordenar el mazo de cartas tal y como fija el orden en los arrays, de As a Rey y a su vez de Corazones a Picas :silbar: ¿Que no entendes exactamente?

Por ejemplo que hace const char *cara[] y la función llena mazo
#46

#include<stdio.h>
#include<stdlib.h>
#include<time.h>


struct carta{
const char *cara;
const char *palo;
};

typedef struct carta Carta;

void llenaMazo(Carta * const wMazo, const char * wCara[], const char * wPalo[]);

int main(void)
{
Carta mazo[52];

const char *cara[] = {"As", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve", "Diez", "Jota", "Reina", "Rey"};
const char *palo[] = {"Corazones", "Diamantes", "Treboles", "Picas"};

srand(time(NULL));

llenaMazo(mazo, cara, palo);


return EXIT_SUCCESS;
}

void llenaMazo(Carta * const wMazo, const char * wCara[], const char * wPalo[])
{
int i;

for(i=0; i<=51; i++){
wMazo[i].cara = wCara[i%13];
wMazo[i].palo = wPalo[i/13];
}

}




No entiendo lo que quiere hacer. Sé algo de punteros pero me armo un lío enorme.


Muchas gracias

#47
Muchas gracias a todos, se resolvió notablemente mi duda  :D
#48
Imaginemos que tenemos un un array como:

   char cadena[10];

Entonces usamos la función fgets para leer una cadena de caracteres como:

   fgets(cadena, 10, stdin);

E introducimos menos de 9 caracteres por lo que automáticamente se nos pone un '\n' al final del array, en la posición cadena[9] en el ejemplo.
Entonces si usamos:

   if(cadena[strlen(cadena)-1] == '\n'{
      cadena[strlen(cadena)-1] = '\0'
   }

obtenemos la cadena sin la impresión de una nueva línea (es decir que el cursor se situa justo después del último caracter.

Lo que no entiendo de todo es es que si introducimos por ejemplo HOLA el array quedaría como:

   H O L A  \0 _ _ _ _ \n

y al usar la anterior instrucción para quitar el '\n' tendríamos:
   
   H O L A  \0 _ _ _ _ \0

¿Cómo es posible tener dos '\0'?

Muchas gracias.
#49
Cita de: eferion en 28 Marzo 2014, 19:59 PM
tienes que capturar un string y luego intentar convertirlo a int... si la conversión no es satisfactoria muestras un mensaje de error y repites el proceso.

Muchas gracias. Al final lo hice usando las funciones de la biblioteca ctype.h y string.h :D
#50
¿Cómo se podría hacer para que en un programa que solo pida números enteros si se introduce un float, double o char el programa pueda capturar el error.

Es decir que si yo tengo por ejemplo scanf("%d", &x); e introducimos en 5.5 es claro que si lo imprimimos con printf("%d", x); el programa mostrará 5. Lo que yo quiero es algún fragmento de código que me permita imprimir que se ha introducido un tipo diferente de int.

Gracias