Page 3 of 5

Re: Preguntas sobre el lenguaje C

Posted: Sun Jun 06, 2021 4:56 pm
by Vortigano
Gracias por tus palabras, dicen que explicar es aprender dos veces, aunque no te aferres a lo que te explico yo también estoy aprendiendo "errare humanum est", y recordá siempre la frase "No hay cuchara" jejejej.
Básicamente vas a liberar la memoria que no sea liberada de forma automática. Un puntero puede ser almacenado en stack, así que el puntero se libera automático, más no así la dirección a la que esté apuntando, que pudiera ser tanto una dirección que también está en el stack o que se encuentra en heap. Si se encuentra en heap deberás liberarla con free() pero solo a la dirección que apunta este puntero.
En tu caso si pasas variables que son de stack simplemente podés pasar la dirección de esa variable, y atraparlas desde la función llamada con un puntero de stack también... así que nada de uso de free() ni malloc() en este caso particular y la máquina estará encantada de ejecutar tu programa igualmente.

Re: Preguntas sobre el lenguaje C

Posted: Sun Jun 06, 2021 9:42 pm
by Hokuto7
Gracias por la ayuda Vortigano. :y:

Re: Preguntas sobre el lenguaje C

Posted: Wed Jun 09, 2021 7:38 am
by Vortigano
De nada, si tenés progresos o experimentos que mostrar me contás. Saludos.

Re: Preguntas sobre el lenguaje C

Posted: Sun Jun 20, 2021 3:28 pm
by Hokuto7
Hola,aqui estamos con otra preguntita.

Estoy intentando crear un constructor para iniciar variables pero no consigo nada,pongo codigo orientativo y comento.

Code: Select all

typedef struct Jugador{
    int x,y,velocidad;
    Color color;
}Jugador;

Jugador *iniciar_jugador(){
    Jugador *jugador;
    jugador->x = 280;
    jugador->y = 380;
    jugador->velocidad = 5;
    jugador->color = WHITE;
    return jugador;
}
El codigo esta a medio hacer porque he intentado varias cosas pero nada,lo que quiero es inicializar las variables de la estructura en la funcion y que me devuelva la estructura,para que cuando llame a la funcion iniciar en el main pueda guardarla en una variable y utilizarla,tampoco se muy bien que tipo de variable utilizar para guardar el valor devuelto de la funcion.

Re: Preguntas sobre el lenguaje C

Posted: Sun Jun 20, 2021 5:12 pm
by CicTec
Hola Hokuto7,

Asi no puede funcionar porque estas indicando a la funcion de devolver un puntero o sea un address de una zona de memoria, por ende debes alocar esta zona de memoria y luego devolverla, o si no se puede devolver NULL, seria asi:
[Codebox=gemix file=Untitled.gemix]
Jugador *iniciar_jugador(){
Jugador *jugador = NULL; // se inicializa el puntero a null por seguridad
jugador = (Jugador *)malloc(sizeof(Jugador));
if(jugador != NULL) {
jugador->x = 280;
jugador->y = 380;
jugador->velocidad = 5;
jugador->color = WHITE;
}
return jugador;
}
[/Codebox]
Con este codigo si malloc tiene exito (averiguando con IF, se inicializa la memoria, sino nada y return puede devolver el address en judador de la memoria alocada o NULL si no pudo allocar.

Luego no olvidar de dealocar este bloque de memoria en otro lado, sino habra memory leak en el programa.

Re: Preguntas sobre el lenguaje C

Posted: Sun Jun 20, 2021 8:53 pm
by Hokuto7
La verdad es que el puntero que señala a la funcion se lo puse porque si no no funcionaba y no se porque.

Como le estas asignando memoria a la estructura jugador donde exactamente lo libero,porque esta funcion es parte del archivo jugador,luego tengo que llamarla en el main,la libero en la misma funcion o donde.

Re: Preguntas sobre el lenguaje C

Posted: Sun Jun 20, 2021 9:23 pm
by CicTec
Si la funcion te debe devolver un puntero, no puedes libearla en la misma funcion, sino el puntero se invalida y al usarlo generara crash por violacion de acceso de memoria no autorizado, debes estructurar el programa de forma que en algun lugar donde no te sirva mas, lo vas a dealocar, depende como quieres estructurar tu programa.

Re: Preguntas sobre el lenguaje C

Posted: Mon Jun 21, 2021 10:32 am
by Hokuto7
Una preguntita mas.

Pongo ejemplo y comento.

Code: Select all

typedef struct Jugador{
    int x,y,velocidad;
    Color color;
}Jugador;

void iniciar_jugador(Jugador *jugador){
    jugador->x = 280;
    jugador->y = 380;
    jugador->velocidad = 5;
    jugador->color = WHITE;
}

Code: Select all

int main(){
   Jugador jugador;
   iniciar_jugador(&jugador);

   return 0;
}
Pues aqui tengo un ejemplo parecido al otro,donde en un archivo creo la estructura jugador y la funcion iniciar y le paso por parametro la estructura para manipular sus propiedades.Luego tengo el archivo donde esta el main y ahi creo una variable de la estructura y se la paso por referencia a la funcion iniciar.

Me gustaria saber si esta forma de hacerlo es correcta o mejor seria reservar memoria para la variable de la estructura.

Code: Select all

int main(){
   Jugador *jugador = (Jugador*)malloc(sizeof(Jugador));
   iniciar_jugador(jugador);
    
   free(jugador);
   return 0;
}

Re: Preguntas sobre el lenguaje C

Posted: Mon Jun 21, 2021 12:03 pm
by CicTec
Son ambas correctas, en el primer caso estas reservando memoria estatica, en el segundo memoria dinamica, obviamente en el segundo hay mas codigo de escribir, asi que en este pequeno ejemplo mejor la primera forma, pero en la gran mayoria de los casos (programas mas grandes o muy grandes) donde se necesita forzadamente memoria dinamica y hay que usar el segundo metodo, esto depende de las necesidades de tu programa.

Re: Preguntas sobre el lenguaje C

Posted: Mon Jun 21, 2021 8:24 pm
by Hokuto7
Gracias por la ayuda. ;)