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 Hokuto7 » Fri Jun 04, 2021 5:15 pm

tiri..tiri..tiri.

Ya funciona,lo que pasa es que los ejemplos que estaba estudiando de raylib se hacian de esa forma y yo pues a copiar se ha dicho,tendre que estudiar mas el libro magico y menos los ejemplos de estraños. :cry: :cry: :cry:

Sobre allegro 5 pues... si tiene acceleracion por directx mejor que mejor,a mi ordenador le gusta mucho directx pero opengl le da gases.Me puedes pasar algun ejemplo con algo de chicha para ver como me funciona en mi ordenador,mejor 2d,aunque si tienes 3d pues tambien pa la saca,pero que funcione todo con direct x,opengl pa la basura...

Se me olvidaba,dirext x 9,a partir del 10 mi ordenador no quiere.
User avatar
Hokuto7
 
Posts: 1396
Joined: Mon Aug 28, 2017 10:14 am

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Sat Jun 05, 2021 3:05 am

Se puede forzar allegro para que use driver directx (solo windows) o bien opengl con los flags de display, por defecto no estoy seguro como funciona pero supongo que intentará directx por defecto y en caso de no poder intentará con opengl, y en caso de fallo se podría retornar al sistema de manera limpia con dialog boxes nativos de windows o por stdout.
Pero bueno, hablemos de C esto ya es fuera del tema.
User avatar
Vortigano
 
Posts: 239
Joined: Sun May 07, 2017 6:04 am

Re: Preguntas sobre el lenguaje C

Postby Hokuto7 » Sat Jun 05, 2021 3:48 pm

He intentado hacer algo como una lista y funcionar funciona pero tengo que ver la forma de que me sirva para cualquier estructura que cree.

Code: Select all
//listas enlazadas
#define MAXIMOMEMORIA 1024

#include "raylib.h"
#include "stdlib.h"

//prototipo lista
int longitud_lista = 0;
typedef struct Lista{
    int x,y;
    int ancho,alto;
    Color color;
}Lista;

//jugador
typedef struct Jugador{
    int x,y;
    int ancho,alto;
    Color color;
}Jugador;

//variable global
Lista lista[MAXIMOMEMORIA];

//prototipo de funciones lista
void insertar(Lista objeto);
void extraer();

//puntero a funcion
void(*puntero_a_funcion_insertar)(Jugador jugador);
void(*puntero_a_funcion_extraer)();

int main(void){
    InitWindow(640,480,"listas");
    SetTargetFPS(60);
   
    //asignar puntero a funcion
    puntero_a_funcion_insertar = &insertar;
    puntero_a_funcion_extraer = &extraer;
   
    Jugador jugador;
    jugador.x = 180;
    jugador.y = 280;
    jugador.ancho = 50;
    jugador.alto = 50;
    jugador.color = WHITE;
    puntero_a_funcion_insertar(jugador);
   
    Lista objeto;
    objeto.x = 280;
    objeto.y = 380;
    objeto.ancho = 50;
    objeto.alto = 50;
    objeto.color = BLUE;
    insertar(objeto);
   
    while(!WindowShouldClose()){
        //lista------------------------------
        //crear objeto en posicion aleatoria
        if(IsKeyPressed(KEY_Z)){
            objeto.x = GetRandomValue(32,608);
            objeto.y = GetRandomValue(32,448);
            insertar(objeto);
        }
       
        //eliminar objeto
        if(IsKeyPressed(KEY_X)){
            extraer();
        }
       
        //jugador------------------------------
        //crear objeto en posicion aleatoria
        if(IsKeyPressed(KEY_C)){
            jugador.x = GetRandomValue(32,608);
            jugador.y = GetRandomValue(32,448);
            puntero_a_funcion_insertar(jugador);
        }
       
        //eliminar objeto
        if(IsKeyPressed(KEY_V)){
            puntero_a_funcion_extraer();
        }
       
        BeginDrawing();
            ClearBackground(BLACK);
            //mostrar objeto
            for(int i = 0;i < longitud_lista;i++){
                DrawRectangle(lista[i].x,lista[i].y,lista[i].ancho,lista[i].alto,lista[i].color);
            }
            //mostrar jugador
            //for(int i = 0;i < longitud_lista,i++){
              //  DrawRectangle(jugador[i].x,jugador[i].y,jugador[i].ancho,jugador[i].alto,jugador[i].color);
           // }
        EndDrawing();
    }
   
   
    CloseWindow();
    return 0;
}

//declaracion de funciones para la lista
void insertar(Lista objeto){
    lista[longitud_lista] = objeto;
    longitud_lista += 1;
}

void extraer(){
    if(longitud_lista > 0){
        longitud_lista -= 1;
    }
}




He intentado que me sirva para usarlo con cualquier estructura y aprovechar las funciones y variables hechas,pero no consigo nada.
Solo me funciona para la estructura lista,si quiero utilizar esto para otras estructuras tendria que hacer todo para cada estructrura.

¿Hay alguna forma de hacer esto?,¿se puede de alguna forma hacer que el jugador sea como la lista para usar sus funciones?
Last edited by Hokuto7 on Sat Jun 05, 2021 8:08 pm, edited 1 time in total.
User avatar
Hokuto7
 
Posts: 1396
Joined: Mon Aug 28, 2017 10:14 am

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Sat Jun 05, 2021 4:22 pm

He intentado hacer algo como una lista y funcionar funciona pero tengo que ver la forma de que me sirva para cualquier estructura que cree.
...
He intentado que me sirva para usarlo con cualquier estructura y aprovechar las funciones y variables hechas,pero no consigo nada.
Solo me funciona para la estructura lista,si quiero utilizar esto para otras estructuras tendria que hacer todo para cada estructrura.

¿Hay alguna forma de hacer esto?,¿se puede de alguna forma hacer que el jugador sea como la lista para usar sus funciones?


Jejeje, estás advirtiendo como dice la película matrix, "no hay cuchara" ;) https://www.youtube.com/watch?v=VsWZu_boOKU. Esto se llama "polimorfismo", como estamos hablando en lenguaje C, no es posible implementar orientación a objetos con funciones virtuales. Sin embargo podrías usar de forma más primitiva punteros a función para poder doblar tu percepción y solucionarlo 8-) .
User avatar
Vortigano
 
Posts: 239
Joined: Sun May 07, 2017 6:04 am

Re: Preguntas sobre el lenguaje C

Postby Hokuto7 » Sat Jun 05, 2021 8:17 pm

Codigo actualizado.

Ahora ya me funcione la funcion de insertar el objeto,tengo la del objeto de la lista y la del jugador y funciona perfecto,el problema es la funcion extraer.Tanto la de la lista como la del jugador me extraen los dos objetos al mismo tiempo,da igual cual use,las dos funcionan igual y yo lo que quiero es que cada una solo extraiga su objeto,pero como no se le esta indicando pues ese es el comportamiento que tiene .

Ya he intentado muchas cosa pero no consigo nada...otra cosa es al mostrar el objeto.recorro un bucle y muestro el objeto lista,pero es que tambien me muestra el objeto jugador y yo solo quiero que me muestre el objeto lista.Para el jugador tengo otro bucle pero me da error.

Digamos que lo que pasa es que cada objeto se esta introduciendo en la misma lista y habria que crear otra lista para el jugador(mañana lo miro haber si funciona).

Alguna pista para la funcion extraer,para que cada funcion me extraiga el objeto que yo quiero.
User avatar
Hokuto7
 
Posts: 1396
Joined: Mon Aug 28, 2017 10:14 am

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Sat Jun 05, 2021 9:47 pm

Te felicito, vas bien. Luego lo miro pero vas bien.
User avatar
Vortigano
 
Posts: 239
Joined: Sun May 07, 2017 6:04 am

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Sun Jun 06, 2021 12:33 am

Estuve mirando y no entendí bien lo que querés hacer, pero te preparé una cosa para que veas a que me refería.
Code: Select all
entidad[index].saludar();
You do not have the required permissions to view the files attached to this post.
User avatar
Vortigano
 
Posts: 239
Joined: Sun May 07, 2017 6:04 am

Re: Preguntas sobre el lenguaje C

Postby Hokuto7 » Sun Jun 06, 2021 9:20 am

Vortigano wrote:Estuve mirando y no entendí bien lo que querés hacer, pero te preparé una cosa para que veas a que me refería.
Code: Select all
entidad[index].saludar();


Pues que la funcion extraer me extraiga solo el objeto que yo quiero,ahora me extrae los dos y yo solo quiero que me extraiga uno,la primera funcion extraer debe extraer solo el primer objeto y la otra funcion extraer solo extrae el otro objeto,ahora mismo la funcion me extrae los dos de golpe.
User avatar
Hokuto7
 
Posts: 1396
Joined: Mon Aug 28, 2017 10:14 am

Re: Preguntas sobre el lenguaje C

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

Pues que la funcion extraer me extraiga solo el objeto que yo quiero,ahora me extrae los dos y yo solo quiero que me extraiga uno,la primera funcion extraer debe extraer solo el primer objeto y la otra funcion extraer solo extrae el otro objeto,ahora mismo la funcion me extrae los dos de golpe.


Sigo sin entender bien lo que querés hacer mirando el código. La función extraer reduce el indizado usable aunque las entidades sigan vivas en memoria luego de extraer de una lista. Tenes una sola lista global donde metes "objeto" tanto como "jugador" con funciones diferentes.
Cuidado con los comentarios de "creo jugador" "creo objeto", en realidad estás "registrando" un elemento que ya existe por si mismo en la memoria.
Algo que veo raro es que no estés usando referencias para pasar como argumento para la lista, estás haciendo por valor, pero es fundamental recordar que los identificadores de elementos de stack se hacen inválidos al completar la ejecución de una función. Cuando tu función insertar añadir o como sea que se llame se completa, todo el stack se destruye, por lo tanto no tiene sentido almacenar en un array global identificadores que ya fueron destruidos **. Mejor usar punteros de jugador, de objeto y en todo caso considerar el uso de memoria de heap (memoria dinámica) etc.

** Imaginate si no fuera así y por ejemplo tuvieras una función como
Code: Select all
void mi_funcion()
{
    int indice;
    //no hago más que crear una variable local indice y luego acabo la función
}

ahora desde otra parte del código llamo a "mi_funcion()" 100000 de veces, quiere decir que cada vez que llamo a mi_funcion() estoy creando una variable int indice; que nunca se libera automáticamente al completar la función, hasta que se acaba la memoria de la máquina y el sistema operativo deja de funcionar. Esto no sucede, al completar la función "mi_funcion()" el entero "indice" se destruye automáticamente. Leo bastantes artículos que critican negativamente el uso de C porque no tiene recolector de basura (es cierto), que debés ocuparte de la memoria constantemente y causa errores, bueno en este caso es automático porque son variables alojadas en stack y es automático, es lenguaje C, y como dijo dennis ritchie, "cuando hicimos este lenguaje de programación eran muy pocos los que sabían programar computadoras y todos eran expertos", esos tiempos pasaron ahora nosotros hacemos sufrir a la máquina (me incluyo aquí) y a veces no nos damos cuenta porque son muy potentes :lol: :lol:
User avatar
Vortigano
 
Posts: 239
Joined: Sun May 07, 2017 6:04 am

Re: Preguntas sobre el lenguaje C

Postby Hokuto7 » Sun Jun 06, 2021 4:11 pm

Gracias por el ejemplo vortigano,me ha venido muy bien y me ha dado algunas ideas para implementar programacion orientada a objetos super simplificada en c,si tienes mas ejemplos de c pasamelos que se aprende mucho. :claphands:

Una pregunta,cuando se crea un puntero hay que liberarlo de memoria o solo cuando se le asigna memoria con malloc.
User avatar
Hokuto7
 
Posts: 1396
Joined: Mon Aug 28, 2017 10:14 am

PreviousNext

Return to Offtopic

Who is online

Users browsing this forum: No registered users and 11 guests