elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problemas con los void
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas con los void  (Leído 6,776 veces)
Sayuri108

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Problemas con los void
« Respuesta #10 en: 6 Enero 2018, 20:11 pm »

void codigoAleatorio(tCodigo codigo, bool admiteRepetidos): elige
aleatoriamente un código y lo devuelve con el parámetro de salida. El
segundo parámetro permite indicar si se admiten colores repetidos en él.

para eso nos dio tambien como hacer  una funcion que genere numeros aleatorios y con esa funcion rellenamos el array dentro del void.


« Última modificación: 6 Enero 2018, 20:38 pm por Sayuri108 » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problemas con los void
« Respuesta #11 en: 6 Enero 2018, 23:28 pm »

Bien.
Mira:
Lo primero de todo, para entender lo que debes hacer es entender qué te pide la función, así que voy a desglosarla:
void: Como te he dicho indica que la función no retorna valor alguno, solo realiza un trabajo.
codigoAleatorio: Tú dices que debe generar un código aleatorio en el array que se le va a pasar. De ahí que tenga ese nombre.
tCodigo codigo: Es el array que le pasarás a esta función. Ahora algo que seguramente no has visto: Los arrays y punteros se dice que se pasan por referencia, es decir, ese dato se podrá cambiar. El funcionamiento interno es un poco más complicado, pero por ahora te basta saber eso. Así es como la función retornará el array relleno.
bool admiteRepetidos: Dato que indicará si se pueden repetir los elementos.

Como puedes ver no hay ningún argumento que diga el tamaño que tendrá el array, así que lo deberás tomar de la constante que usaste para declararlo: TAM_CODIGO.

Deduzco que la función que te ha dado el profesor es la de la librería estándar rand().

Deduzco, partiendo de lo que has ido mostrando, es que el código se realiza a partir de una combinación de las letras R, Z, V, A, M, B.

Así que empiezo a escribir:
Código
  1. void codigoAleatorio(tCodigo codigo, bool admiteRepetidos) {
  2.    unsigned i; // mi índice para el array.
  3.    unsigned j; // mi índice para un array auxiliar, ver mas abajo.
  4.    char c; // tendrá el elemento del código seleccionado.
  5.    char elementosCodigo[] = {'R', 'Z', 'V', 'A', 'M', 'B'}; // el array que contiene los elementos que conforman el código.
  6.    const unsigned TAM_ELEM_COD = 6; // 6 es el tamaño del array elementosCodigo. En verdad se debería sustituir 6 por 'sizeof(elementosCodigo) / sizeof(char)', pero por razones de que todavía no habrás avanzado lo suficiente en el curso lo dejo con el 6.
  7.  
  8.    // Ahora voy a rellenar el array codigo que ha recibido la función.
  9.    for(i = 0; i < TAM_CODIGO; ++i) {
  10.        j = rand() % TAM_ELEM_COD;
  11.        // Ahora viene la parte donde trabajamos con si se admiten elementos repetidos o no.
  12.        if(!admiteRepetidos) { // Si no se admiten repetidos...
  13.            // La idea es cambiar el dato de elementosCodigo que ya se ha usado a 0, así sabremos que ese ya se ha pillado.
  14.            while((c = elementosCodigo[j]) == 0) { // Mientras encontremos que el elemento seleccionado ya ha sido escogido con anterioridad
  15.                ++j; // Elegiremos el siguiente elemento.
  16.                if(j >= TAM_ELEM_COD); // Si el índice j queda fuera del array de código...
  17.                    j = 0; // Se regresa el índice al inicio.
  18.            } // Terminado el while c tendrá un carácter válido y j estará sobre ese elemento que no se ha repetido.
  19.            elementosCodigo[j] = 0; // Para evitar que en posteriores búsquedas, para rellenar el array codigo, se elija de nuevo esta posición, se marca con el 0.
  20.        } // Como en el paso anterior ya tenemos un elemento del código válido podemos continuar. Nótese que si se admitieran repetidos la función es la misma, lo único que todo lo que hay dentro del if se puede omitir, por eso que se ha escrito de esta forma.
  21.        codigo[i] = c; // Se copia a la posición i del array codigo el carácter obtenido de elementosCodigo.
  22.    } // Terminado el for ya tenemos el código listo por tanto...
  23. } // fin de la función.
               


En línea

Sayuri108

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Problemas con los void
« Respuesta #12 en: 7 Enero 2018, 12:36 pm »

Vale, creo que ya lo entiendo, muchas gracias por tu ayuda.  :)
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problemas con los void
« Respuesta #13 en: 7 Enero 2018, 12:54 pm »

Un placer  ;-)
En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: Problemas con los void
« Respuesta #14 en: 7 Enero 2018, 22:30 pm »

Si dice que tiene que devolver o retornar un código puede hacerlo con un puntero genérico (void *) y otra alternativa es modificar el array que le pasas como parámetro (por referencia) para luego modificarlo.

Ejemplo :
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /* prototipos */
  5. void * funcionConPunteroGenerico();
  6. void subrutina(char * cadena);
  7.  
  8. void main()
  9. {  
  10.    /* Aqui reservamos espacio de memoria a 'cadena' pero NO asignamos valores*/
  11.    char * cadena=(char *) malloc(10 * sizeof(char));
  12.  
  13.    /* Devolvemos una cadena */
  14.    printf(funcionConPunteroGenerico());
  15.  
  16.    /* Asignamos valores a la 'cadena' */
  17.    subrutina(cadena);
  18.    /* Mostramos el contenido de la 'cadena' */
  19.    printf(cadena);
  20.  
  21. }
  22.  
  23. void * funcionConPunteroGenerico(){
  24.    char * cadena =(char *) malloc(10*sizeof(char));
  25.    *cadena='H';
  26.    *(cadena+1)='o';
  27.    *(cadena+2)='l';
  28.    *(cadena+3)='a';
  29.    *(cadena+4)=' ';
  30.    *(cadena+5)='M';
  31.    *(cadena+6)='u';
  32.    *(cadena+7)='n';
  33.    *(cadena+8)='d';
  34.    *(cadena+9)='o';
  35.    *(cadena+10)=0; /* final de la cadena */
  36.  
  37.    return cadena; /* Podemos devolver cualquier tipo */
  38. }
  39.  
  40. void subrutina(char * cadena){ /* por referencia */
  41.    *cadena='A';
  42.    *(cadena+1)='d';
  43.    *(cadena+2)='i';
  44.    *(cadena+3)='o';
  45.    *(cadena+4)='s';
  46.    *(cadena+5)=0; /* final de la cadena */    
  47. }
« Última modificación: 7 Enero 2018, 22:32 pm por srWhiteSkull » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problemas con los void
« Respuesta #15 en: 7 Enero 2018, 23:58 pm »

Esto está mal.
Dentro de funcionConPunteroGenerico capturas memoria de forma dinámica y siempre que se haga algo así se debe liberar manualmente.
Tú haces que el valor devuelto por la función sea usado por printf, pero al no capturarlo con una variable ese puntero se va a perder y quedarás con esa porción de memoria inutilizada al no poder liberarla.

Lo mismo con la variable cadena. La capturas pero nunca la liberas. Es cierto que los modernos S.O. liberan la memoria ocupada por un programa cuando éste termina pero ten en cuenta de que si alguna vez vas a trabajar con uno antiguo, un embebido o con un sistema diferente; o vayas a realizar un programa que su ejecución se alarga en el tiempo, este tipo de fallos pueden llegar a hacer lento e inestable todo el sistema.
En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: Problemas con los void
« Respuesta #16 en: 8 Enero 2018, 00:16 am »

Bueno, pienso que "Esto está mal" no es lo correcto. Déjalo en "incompleto" porque es así como indicas, faltaría la parte que libera el espacio reservado... es lo que tiene cuando trabajas con punteros.

De todas formas el código simplemente muestra las alternativas que cité en el mensaje. Gracias MAFUS, tú comentario es bastante didáctico, esperemos que no vaya a petar mi PC de 64kb  ;-) ;-)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void * funcionConPunteroGenerico();
  6. void subrutina(char * cadena);
  7.  
  8. void main()
  9. {  
  10.    /* Aqui reservamos espacio de memoria a 'cadena' pero NO asignamos valores*/
  11.    char cadena[10];
  12.    char * otraCadena=funcionConPunteroGenerico();
  13.  
  14.    /* Devolvemos una cadena */
  15.    printf("%s\n",otraCadena);
  16.  
  17.    /* Asignamos valores a la 'cadena' */
  18.    subrutina(cadena);
  19.    /* Mostramos el contenido de la 'cadena' */
  20.    printf(cadena);
  21.  
  22.    /* liberamos el espacio reservado del puntero */
  23.    free(otraCadena);    
  24.  
  25.    /* el array no es necesario ya que apunta a la pila(memoria estática) del programa
  26.        , y esta es liberada al cerrar o salir del programa. */
  27. }
  28.  
  29. void * funcionConPunteroGenerico(){
  30.    char * cadena =(char *) malloc(11*sizeof(char));
  31.    strcpy(cadena,"Hola Mundo\0");
  32.  
  33.    return cadena; /* Podemos devolver cualquier tipo */
  34. }
  35.  
  36. void subrutina(char * cadena){ /* por referencia */
  37.    strcpy(cadena,"Adios\0");
  38. }
« Última modificación: 8 Enero 2018, 02:39 am por srWhiteSkull » En línea

Sayuri108

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Problemas con los void
« Respuesta #17 en: 9 Enero 2018, 22:09 pm »

hola de nuevo, al fin tuve clase con mi profesor y me dijo que lo que debia hacer era poner
Código
  1. void codigoAleatorio(tCodigo & codigo, bool admiteRepetidos);
y asi hace referencia al array que yo quiero y no me genera uno nuevo cada vez.
En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: Problemas con los void
« Respuesta #18 en: 10 Enero 2018, 01:47 am »

Pues es igual al ejemplo que te pasé, con subrutina, solo que yo use lenguaje c y por eso puse asterisco. Paso por referencia, trabaja mas rapido que paso por valor ya que no copia el objeto o valor sino trabaja directamente con el espacio donde se alojan los datos.
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
(void *) en funciones
Programación C/C++
Shon 4 5,332 Último mensaje 25 Enero 2011, 16:06 pm
por Littlehorse
dev-c++ ----> ¿void?
Programación C/C++
lalocr 7 18,938 Último mensaje 21 Abril 2011, 11:05 am
por <<<-Basura->>>
funciones INT vs VOID « 1 2 »
Programación C/C++
ALONSOQ 14 7,266 Último mensaje 4 Septiembre 2012, 16:49 pm
por ALONSOQ
Convertir de void a int
Programación C/C++
mester 3 5,300 Último mensaje 22 Noviembre 2015, 20:07 pm
por mester
Problema con un void
Programación C/C++
grossgore 2 1,842 Último mensaje 4 Mayo 2017, 16:10 pm
por dato000
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines