Autor
|
Tema: Problemas con los void (Leído 6,907 veces)
|
Sayuri108
Desconectado
Mensajes: 8
|
Hola! Estoy haciendo un programa en el que uso void y arrays, y no se por que en cuanto llego a un void el array cambia de tamaño Este es el punto deonde me da problemas: const int tamaño = 4; typedef int tCode[tamaño]; void codigoAleatorio(tCode code) { //Aqui cambia a ser code ={0} en vez de code = {0,0,0,0} int random = 0; srand(time(NULL)); for (int i = 0; i < TAM_CODIGO; i++) { random = rand() % 7; code[i] = random; (aqui no se por que no salen [] con la i dentro despues de code) } } el main esta asi: int main(){ tCode code = {}; /*funcion*/ }
alguna idea? Gracias.
|
|
« Última modificación: 6 Enero 2018, 15:08 pm por engel lex »
|
En línea
|
|
|
|
engel lex
|
(aqui no se por que no salen [] con la i dentro despues de code) porque debes usar las etiquetas GeSHi, si no [ i ] significa cursiva, porfa corrige tu codigo para ver bien el problema y en el main si es posble pon más codigo relacionado
|
|
|
En línea
|
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
|
|
|
Sayuri108
Desconectado
Mensajes: 8
|
vale, gracias. Este es mi main: int main() { int opcion = menu(); EjecutarMenu(opcion); return 0; } int EjecutarMenu(int opcion) { tCodigo codigo = {}; tCodigo hipotesis = {}; bool admiteRepetidos = false; int colocados = 0, descolocados = 0; while (opcion != 0) { switch (opcion) { case (1): {//funcion no repetidos opcion1(codigo, hipotesis, admiteRepetidos, colocados, descolocados); } break; case (2): {//funcion con repetidos opcion2(codigo, hipotesis, admiteRepetidos, colocados, descolocados); } break; } } return opcion; }
las funciones opcion1 y opcion2 son dos void bastante parecidos y en cuanto llega al void cambia el tamaño del array. void opcion1(tCodigo codigo, tCodigo hipotesis, bool admiteRepetidos, int colocados, int descolocados) { admiteRepetidos = false; codigoAleatorio(codigo, admiteRepetidos); cout << "Introduce el codigo (palabra de 4 letras con alguna de las siguientes, R, Z, V, A, M, B): "; for (int s = 0; s < TAM_CODIGO - 1; s++) cin >> hipotesis[s]; compararCodigos(codigo, hipotesis, colocados, descolocados); ImprimirPantalla(codigo, hipotesis, colocados, descolocados); while (colocados != TAM_CODIGO) cout << "Introduce el codigo (palabra de 4 letras con alguna de las siguientes, R, Z, V, A, M, B): "; for (int s = 0; s < TAM_CODIGO - 1; s++) cin >> hipotesis[s]; compararCodigos(codigo, hipotesis, colocados, descolocados); ImprimirPantalla(codigo, hipotesis, colocados, descolocados); }
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Tienes algunos fallos que atribuyó a que aunque no conoces del todo el lenguaje y buenas prácticas, pero me gustaría que explicarás en qué notas que el array cambia el tamaño. Lo que si he observado es que haces cosas así: for (int s = 0; s < TAM_CODIGO - 1; s++) TAM_CODIGO marca el número de elementos, como C empieza por el 0 el máximo índice será TAM_CODIGO -1, y precisamente ese es al que va a llegar el for con la sentencia s<TAM_CODIGO: mientras s esté por debajo de TAM_CODIGO se va a ejecutar su código asociado. Pero tú le restas 1 a TAM_CODIGO con lo que no ejecutará las veces suficientes el código asociado, te faltará una. Tal vez eso es lo que te pasa.
|
|
|
En línea
|
|
|
|
Sayuri108
Desconectado
Mensajes: 8
|
for (int s = 0; s < TAM_CODIGO - 1; s++) es que comparo dos cosas en las posiciones del array, entonces no quiero que se salga del array (comparar el ultimo elemento del array con la nada), el ultimo elemento de array solo se compara con su anterior, entonces x solo puede llegar a valer como maximo 3. Pero el problema es que en cuanto pasa a un void, el array cambia automaticamente de tamaño, en vez de seguir siendo de tamaño cuatro, pasa a ser de tamaño 1. ahi dejo una captura de como se cambia el solito https://gyazo.com/3643d198efb64fb42a8b85c5cb4c50bfhttps://gyazo.com/072244555cacd0ef0a6fb45f4a39485b
|
|
« Última modificación: 6 Enero 2018, 17:35 pm por Sayuri108 »
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Vale. El void no es lo que pasas sino el tipo de dato devuelto de la función. Por otra parte te diría que mires un paper de lo que ocurre cuando se usa un array como argumento.
A grandes rasgos un array de una dimensión es lo mismo que un puntero, solo se pasará la dirección del primer elemento, todos los demás 'adornos' como el tipo de dato del array y loas restantes dimensiones que pueda tener (se especifican todas las dimensiones de un array menos la de más a la izquierda) solo sirven para, internamente, hacer aritmética y encontrar el dato deseado cuando usas notación de array.
Por tanto un array, cuando es pasado a una función, pierde toda la información de su tamaño y, a ojos del compilador, es un puntero.
|
|
|
En línea
|
|
|
|
Sayuri108
Desconectado
Mensajes: 8
|
entonces como puedo hacerlo? por que me piden que lo haga asi (es un trabajo de clase) y por narices tengo que usar voids,de hecho me ponen algunos asi: void codigoAleatorio(tCodigo codigo, bool admiteRepetidos);
y tengo que rellenarlos, otros solo me dan el nombre de la funcion. y los que me dan "completos" no puedo modificarlos asi que por ejemplo no puedo ponerle : void codigoAleatorio(const tCodigo codigo, bool admiteReetidos);
|
|
« Última modificación: 6 Enero 2018, 18:37 pm por Sayuri108 »
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Olvídate del void. En este caso indica que la función no devuelve ningún valor, solo hace un trabajo (en otros lenguajes se llamaría procedimiento o subprograma).
Cuando se pasa un array a una función lo normal es pasar también el número de elementos que el array contiene en otro argumento y así la función conocerá el límite. De todas formas tú usas una variación de eso qué es mediante una variable global llamada TAM_CODIGO, que por otra parte, en el primer código que has mostrado la llamas 'tamaño'.
Es decir, dentro de la función debes olvidarte del tamaño del array, lo verás como si fuera un puntero (o un entero sin signo, por si no has llegado a los punteros) y usa para trabajar con él los límites, ya sean variables globales o argumentos que lo van a acompañar en las llamadas a funciones.
|
|
|
En línea
|
|
|
|
Sayuri108
Desconectado
Mensajes: 8
|
entonces a la vuelta de vacaciones tendre que hablar con el profesor, por que quiere que use esa funcion y que haga algo determinado y no me puedo salir del guion... Gracias por la ayuda
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
¿Exactamente qué te pide exactamente?
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
(void *) en funciones
Programación C/C++
|
Shon
|
4
|
5,372
|
25 Enero 2011, 16:06 pm
por Littlehorse
|
|
|
dev-c++ ----> ¿void?
Programación C/C++
|
lalocr
|
7
|
19,018
|
21 Abril 2011, 11:05 am
por <<<-Basura->>>
|
|
|
funciones INT vs VOID
« 1 2 »
Programación C/C++
|
ALONSOQ
|
14
|
7,361
|
4 Septiembre 2012, 16:49 pm
por ALONSOQ
|
|
|
Convertir de void a int
Programación C/C++
|
mester
|
3
|
5,346
|
22 Noviembre 2015, 20:07 pm
por mester
|
|
|
Problema con un void
Programación C/C++
|
grossgore
|
2
|
1,877
|
4 Mayo 2017, 16:10 pm
por dato000
|
|