Preguntas sobre el lenguaje C

Todo aquello que no está relacionado con Gemix Studio ni con la programación DIV en general.

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Sun Jun 06, 2021 4:56 pm

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.
User avatar
Vortigano
 
Posts: 240
Joined: Sun May 07, 2017 6:04 am

Re: Preguntas sobre el lenguaje C

Postby Hokuto7 » Sun Jun 06, 2021 9:42 pm

Gracias por la ayuda Vortigano. :y:
User avatar
Hokuto7
 
Posts: 1397
Joined: Mon Aug 28, 2017 10:14 am

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Wed Jun 09, 2021 7:38 am

De nada, si tenés progresos o experimentos que mostrar me contás. Saludos.
User avatar
Vortigano
 
Posts: 240
Joined: Sun May 07, 2017 6:04 am

Re: Preguntas sobre el lenguaje C

Postby Hokuto7 » Sun Jun 20, 2021 3:28 pm

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.
User avatar
Hokuto7
 
Posts: 1397
Joined: Mon Aug 28, 2017 10:14 am

Re: Preguntas sobre el lenguaje C

Postby CicTec » Sun Jun 20, 2021 5:12 pm

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:
Source Code (Gemix) [ Download ] [ Hide ]
  • 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;
  • }
  •  

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.
User avatar
CicTec
 
Posts: 16554
Joined: Thu Jul 31, 2008 10:18 pm

Re: Preguntas sobre el lenguaje C

Postby Hokuto7 » Sun Jun 20, 2021 8:53 pm

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.
User avatar
Hokuto7
 
Posts: 1397
Joined: Mon Aug 28, 2017 10:14 am

Re: Preguntas sobre el lenguaje C

Postby CicTec » Sun Jun 20, 2021 9:23 pm

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.
User avatar
CicTec
 
Posts: 16554
Joined: Thu Jul 31, 2008 10:18 pm

Re: Preguntas sobre el lenguaje C

Postby Hokuto7 » Mon Jun 21, 2021 10:32 am

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;
}
User avatar
Hokuto7
 
Posts: 1397
Joined: Mon Aug 28, 2017 10:14 am

Re: Preguntas sobre el lenguaje C

Postby CicTec » Mon Jun 21, 2021 12:03 pm

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.
User avatar
CicTec
 
Posts: 16554
Joined: Thu Jul 31, 2008 10:18 pm

Re: Preguntas sobre el lenguaje C

Postby Hokuto7 » Mon Jun 21, 2021 8:24 pm

Gracias por la ayuda. ;)
User avatar
Hokuto7
 
Posts: 1397
Joined: Mon Aug 28, 2017 10:14 am

PreviousNext

Return to Offtopic

Who is online

Users browsing this forum: No registered users and 14 guests