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

#11
Hola gente!, estaba leyendo un codigo en internet y me surgieron algunas dudas:

typedef struct ElementoLista
{
  char *dato;
  struct ElementoLista *siguiente;
} Elemento;

typedef struct ListaIdentificar
{
  Elemento *inicio;
  Elemento *fin;
  int tamanio;
} Lista;


int ins_en_lista_vacia (Lista * lista, char *dato) {
    Elemento *nuevo_elemento;
    if ((nuevo_elemento = (Elemento *) malloc (sizeof (Elemento))) == NULL)
    {
        return -1;
    }
    if ((nuevo_elemento->dato = (char *) malloc (50 * sizeof (char))) == NULL)
    {
        return -1;
    }
    strcpy (nuevo_elemento->dato, dato);
    nuevo_elemento->siguiente = NULL;
    lista ->inicio = nuevo_elemento;
    lista ->fin = nuevo_elemento;
    lista ->tamanio++;
    return 0;
}


Es una funcion para insertar un elemento a una lista vacia, en la condicion 'if' primero le asigna espacio en la memoria a 'nuevo_elemento' y despues compara ese resultado con NULL, que significa eso? Generalmente asigno NULL a los punteros que todavia no apuntan a un elemento, ademas que en esa funcion le asigno memoria a 'nuevo_elemento' y despues a 'nuevo_elemento->dato', no seria suficiente con asignar memoria solo a 'nuevo_elemento->dato'?

int main (void){
    char eleccion;
    char *nom;
    Lista *lista;
    Elemento *actual; 
    if ((lista = (Lista *) malloc (sizeof (Lista))) == NULL) return -1;
    if ((nom = (char *) malloc (50)) == NULL) return -1;


Mi otra duda es que pude notar que asigno memoria a una estructura entera, 'Lista', no a una variable de tipo 'Elemento' como hizo en la funcion de insercion, por que no hacer lo mismo con todas las estructuras? No como hizo en la funcion 'ins_en_lista_vacia' que asigno en dos situaciones. Espero no haber hecho muchas preguntas, realmente me tiene confundida este tema de asignar memoria y no encuentro un medio para poder entenderlo mejor. Desde ya muchas gracias.

#12
Cita de: 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 (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:
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
#13
Cita de: 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...

Tenés razon, mejorare el nombre que utilizo para mis variables y funciones, gracias por el dato!
#14
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


int main (){
    int a=4,b=0;
    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)};
    printf(" return--> %i ",mov1(v,&a,&b)); //devuelve 1
    printf(" return--> %i ",mov1(v,&a,&b)); // pero aca devuelve 0
    return 0;
}
int mov1 (int v[N][M],int *a,int *b){
   if (v[*a-2][*b+1]==0){
       *a=*a-2;
       *b=*b+1;
       return 1;
   }else{
            return 0;
   }
}


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?