Problemas con los void

Iniciado por Sayuri108, 6 Enero 2018, 15:00 PM

0 Miembros y 1 Visitante están viendo este tema.

Sayuri108

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  :huh:
Este es el punto deonde me da problemas:

Código (cpp) [Seleccionar]
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.

engel lex

Citar(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
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

vale, gracias.
Este es mi main:
Código (cpp) [Seleccionar]
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.

Código (cpp) [Seleccionar]
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);
}

MAFUS

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.

Sayuri108

#4
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/3643d198efb64fb42a8b85c5cb4c50bf
https://gyazo.com/072244555cacd0ef0a6fb45f4a39485b

MAFUS

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.

Sayuri108

#6
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:
Código (cpp) [Seleccionar]
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 :
Código (cpp) [Seleccionar]
void codigoAleatorio(const tCodigo codigo, bool admiteReetidos);

MAFUS

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.

Sayuri108

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

MAFUS

¿Exactamente qué te pide exactamente?