Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: LadyWin en 20 Julio 2021, 00:59 am



Título: Invocacion funcion con variables de tipo puntero
Publicado por: LadyWin en 20 Julio 2021, 00:59 am
Hola, esto es una parte de un programa que estoy haciendo que evalúa los posibles movimientos, en este caso, de un caballo de el ajedrez, los 0 serian espacios vacíos, el punto de partida seria el 0 de la posición v[4][0]:
 
                                                   1 1 0 1 1
                                                    1 1 1 1 1
                                                    1 0 1 1 1
                                                    1 1 1 1 1
                                                    0 1 1 1 1


Código
  1. int main (){
  2.    int a=4,b=0;
  3.    int v[N][M]={(1,1,0,1,1),(1,1,1,1,1),(1,0,1,1,1),(1,1,1,1,1),(0,1,1,1,1)};
  4.    printf(" return--> %i ",mov1(v,&a,&b)); //devuelve 1
  5.    printf(" return--> %i ",mov1(v,&a,&b)); // pero aca devuelve 0
  6.    return 0;
  7. }
  8. int mov1 (int v[N][M],int *a,int *b){
  9.   if (v[*a-2][*b+1]==0){
  10.       *a=*a-2;
  11.       *b=*b+1;
  12.       return 1;
  13.   }else{
  14.            return 0;
  15.   }
  16. }

Este código debería retornar dos veces 1 pero desconozco la razón del porqué en la segunda invocación no me evalúa correctamente la condición de if y me devuelve 0, se deberá a que estoy utilizando mal los punteros?


Título: Re: Invocacion funcion con variables de tipo puntero
Publicado por: Locura_23 en 20 Julio 2021, 03:33 am
Hola @LadyWin

Te dejo mis ideas jaja...Por ahi ya lo sabes pero, creo que la única forma que eso te retorna 0 es que ese if de la línea 9 es distinto de cero. Al utilizar punteros acordate que modificas el valor de la variable misma... entonces, la segunda llamada no va a devolver 1 porque se modificaron las variables en sí mismas. Osea que te está posicionando en otro casillero del tablero que no es cero...
Por ahi te interese hacer paso de parametros por valor, y vos le pasas la posición del tablero que queres evaluar.

Luego... en mi humilde opinión, te conviene hacer más descriptivos los nombres de tus variables y funciones, código aburrido y simple = código funcional y facil de mantener. Por ejemplo, la función puede llamarse: evalua_movimiento_caballo(), de un vistazo ya sabes qué hace.

PD: en el caso de que esa función busque las posibles posiciones del caballo (las que son igual a cero en la matriz), tal vez podrías hacer un while o for que recorra cada fila de la matriz hasta que encuentre una posición cero, y si no encuentra ninguna salta a la fila que viene...


Título: Re: Invocacion funcion con variables de tipo puntero
Publicado por: MAFUS en 20 Julio 2021, 17:15 pm
Tienes un problema en la línea 3:
Para crear los diferentes elementos del array has escrito
Código:
(1,1,0,1,1),(1,1,1,1,1),(1,0,1,1,1),(1,1,1,1,1),(0,1,1,1,1)

Con los paréntesis no generas elementos, sino que agrupas operaciones. Pues bien dentro de los paréntesis estás usando el operador coma.

El operador coma es un operador binario que evalúa la primera expresión y descarta su valor, después evalúa la segunda expresión y devuelve el resultado. Encadenando expresiones, cómo lo has hecho estás devolviendo el último operando de cada grupo de paréntesis.

Por otra parte, cuándo inicializas un array se puede hacer de forma incompleta dando valor a las primeras posiciones; el compilador entiende que debe dejar las siguientes a 0 por lo que en realidad tu código genera el siguiente array:
Código:
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

Para solucionar esto sólo cambia los paréntesis por llaves en tu inicialización del array.


Título: Re: Invocacion funcion con variables de tipo puntero
Publicado por: LadyWin en 20 Julio 2021, 17:43 pm
Hola @LadyWin

Te dejo mis ideas jaja...Por ahi ya lo sabes pero, creo que la única forma que eso te retorna 0 es que ese if de la línea 9 es distinto de cero. Al utilizar punteros acordate que modificas el valor de la variable misma... entonces, la segunda llamada no va a devolver 1 porque se modificaron las variables en sí mismas. Osea que te está posicionando en otro casillero del tablero que no es cero...
Por ahi te interese hacer paso de parametros por valor, y vos le pasas la posición del tablero que queres evaluar.

Luego... en mi humilde opinión, te conviene hacer más descriptivos los nombres de tus variables y funciones, código aburrido y simple = código funcional y facil de mantener. Por ejemplo, la función puede llamarse: evalua_movimiento_caballo(), de un vistazo ya sabes qué hace.

PD: en el caso de que esa función busque las posibles posiciones del caballo (las que son igual a cero en la matriz), tal vez podrías hacer un while o for que recorra cada fila de la matriz hasta que encuentre una posición cero, y si no encuentra ninguna salta a la fila que viene...

Tenés razon, mejorare el nombre que utilizo para mis variables y funciones, gracias por el dato!


Título: Re: Invocacion funcion con variables de tipo puntero
Publicado por: LadyWin en 20 Julio 2021, 17:44 pm
Tienes un problema en la línea 3:
Para crear los diferentes elementos del array has escrito
Código:
(1,1,0,1,1),(1,1,1,1,1),(1,0,1,1,1),(1,1,1,1,1),(0,1,1,1,1)

Con los paréntesis no generas elementos, sino que agrupas operaciones. Pues bien dentro de los paréntesis estás usando el operador coma.

El operador coma es un operador binario que evalúa la primera expresión y descarta su valor, después evalúa la segunda expresión y devuelve el resultado. Encadenando expresiones, cómo lo has hecho estás devolviendo el último operando de cada grupo de paréntesis.

Por otra parte, cuándo inicializas un array se puede hacer de forma incompleta dando valor a las primeras posiciones; el compilador entiende que debe dejar las siguientes a 0 por lo que en realidad tu código genera el siguiente array:
Código:
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

Para solucionar esto sólo cambia los paréntesis por llaves en tu inicialización del array.

Mil gracias, ahora me funciona correctamente!  :D :D :D :D :D