Preguntas sobre el lenguaje C

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

Preguntas sobre el lenguaje C

Postby Hokuto7 » Thu Jun 03, 2021 12:55 pm

Pues me he quedado atascado con una cosa en c.

Tengo un pequeño ejemplo de un simple objeto que se muestra en pantalla y se mueve y lo que he intentado hacer es dividir el codigo en un archivo.c y otro .h.

Esto tengo en el archivo.h:
Source Code (C) [ Download ] [ Hide ]
  • //prototipo de programacion de jugador
  • #ifndef JUGADOR_H
  • #define JUGADOR_H
  •  
  • #include "raylib.h"
  •  
  • typedef struct Jugador{
  •     int x,y;
  •     Color color;
  •     Texture2D imagen;
  • }Jugador;
  •  
  • void cargarTextura();
  • void actualizar();
  • void pintar();
  • void descargarTextura();
  •  
  • #endif
  •  


Esto en el archivo.c:
Source Code (C) [ Download ] [ Hide ]
  • //programacion de jugador
  • #include "jugador.h"
  •  
  • //jugador
  • Jugador jugador;
  • jugador.x = 280;
  • jugador.y = 380;
  • jugador.color = WHITE;
  •  
  • void cargarTextura(){
  •     jugador.imagen = LoadTexture("jugador.png");
  • }
  •  
  • void actualizar(){
  •     if(IsKeyDown(KEY_LEFT)){
  •         jugador.x -= 5;
  •     }else if(IsKeyDown(KEY_RIGHT)){
  •         jugador.x += 5;
  •     }
  • }
  •  
  • void pintar(){
  •     DrawTexture(jugador.imagen,jugador.x,jugador.y,jugador.color);
  • }
  •  
  • void descargarTextura(){
  •     UnloadTexture(jugador.imagen);
  • }
  •  


Esto en el archivo donde esta el main:
Source Code (C) [ Download ] [ Hide ]
  • //crear objeto
  • #include "jugador.h"
  •  
  • int main(void){
  •     InitWindow(640,480,"crear objeto");
  •     SetTargetFPS(60);
  •    
  •     cargarTextura();
  •    
  •     while(!WindowShouldClose()){
  •         actualizar();
  •         BeginDrawing();
  •             ClearBackground(BLACK);
  •             pintar();
  •         EndDrawing();
  •     }
  •    
  •     //descargarTextura();
  •     CloseWindow();
  •     return 0;
  • }
  •  


Cuando compilo me da este error:
Code: Select all
C:\Users\usuario\AppData\Local\Temp\cc8MSjm8.o:basico27-objeto.c:(.text.startup+0x37): undefined reference to `cargarTextura'
C:\Users\usuario\AppData\Local\Temp\cc8MSjm8.o:basico27-objeto.c:(.text.startup+0x45): undefined reference to `actualizar'
C:\Users\usuario\AppData\Local\Temp\cc8MSjm8.o:basico27-objeto.c:(.text.startup+0x5b): undefined reference to `pintar'
collect2.exe: error: ld returned 1 exit status


No se que es lo que estoy haciendo mal,¿alguien sabe cual es el problema?.
User avatar
Hokuto7
 
Posts: 1396
Joined: Mon Aug 28, 2017 10:14 am

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Thu Jun 03, 2021 2:09 pm

Hola hokuto, el compilador C es el mejor maestro de programación que pueda haber, solo es cuestión de aprender sus mensajes.
por ejemplo:
Code: Select all
C:\Users\usuario\AppData\Local\Temp\cc8MSjm8.o:basico27-objeto.c:(.text.startup+0x37): undefined reference to `cargarTextura'

dice lo siguiente

todo ese path que termina con cc8MSjm8.o es donde el compilador (temporalmente) está tratando de traducir tu programa C a binario (osea compilar, aunque no suele compilar todo de una vez, hace varias pasadas pero eso no nos importa), luego indica que en .text.startup+0x37 hay algún sabor que no le gusta y no lo puede digerir.
Por suerte después de los ':' dice "undefined reference to `cargarTextura'", que quiere decir que no sabe que hacer con el identificador "cargarTextura", en este caso particular no tiene referencias con la definición. Quiero decir, el compilador obtiene el prototipo (en .h) pero no sabe que hacer con el identificador porque no tiene el cuerpo de eso (que debería encontrarlo en .c).
Luego collect2.exe que reporta error, tiene problemas de linkeado y no pudo continuar.

¿que comandos usás para enviar a compilar este programa?
Probablemente no sabe que tiene definiciones en archivo.c y por eso el error.
User avatar
Vortigano
 
Posts: 239
Joined: Sun May 07, 2017 6:04 am

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Thu Jun 03, 2021 4:44 pm

Hola, acá te mando un ejemplo de lo que te está pasando pero simplificado.
Para poder compilar esto debés utilizar mínimamente el siguiente comando:
Code: Select all
gcc main.c archivo.c -o build.exe


En cambio si solamente usaras esta forma:
Code: Select all
gcc main.c -o build.exe

obtendrías reporte de error como el tuyo.
Code: Select all
C:\Users\vorti\AppData\Local\Temp\ccA8XDDx.o:main.c:(.text+0xc): undefined reference to `hacer_algo'
collect2.exe: error: ld returned 1 exit status


Como verás cuando hayas practicado y experimentado mucho esto, al crear un proyecto muy grande vas a darte cuenta la importancia de usar las herramientas de "make/cmake" para organizar el orden y la configuración para la compilación de los archivos de tu proyecto, pero no te preocupes, paso a paso como dice Cictec. De hecho, yo no sé usar make ni cmake, me parece difícil. Raylib trae unos scripts para usar make me parece que de manera automática con notepad++ , pero no estoy seguro, sería en principio una buena forma de familiarizarte con su uso también.
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 » Thu Jun 03, 2021 5:08 pm

Haber...

El problema aqui es que no estoy utilizando opciones desde la consola con ningun compilador,estoy utilizando el paquete de instalacion de raylib que te instala todo configurado y listo para empezar con el notepad++.

O sea,que tu escribes el codigo y pulsando f6 se compila todo automaticamente y deberia detectar todo el codigo correctamente,si no lo hace pues hay un problema grave.Pero he recreado el mismo ejemplo con c a secas y el ide zinjai y me da el mismo error.

Entonces ni idea de como hacer esto,me parece que el unico que puede resolver esto es cictec,si le apetece que me diga como se puede hacer con cualquier ide.
User avatar
Hokuto7
 
Posts: 1396
Joined: Mon Aug 28, 2017 10:14 am

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Thu Jun 03, 2021 5:14 pm

ok, y recordé ponerte una cosa, también podrías haber usado en el archivo source (.c) donde está main lo siguiente:

Code: Select all
#include "archivo.c"
o bien
#include "jugador.c"


y remover
Code: Select all
#include "archivo.h"


pero no te recomiendo esa alternativa, ya que luego cualquier cambio en jugador.c te va a obligar a recompilar main.c (o como sea que se llame tu main source). Esto parece un capricho demoníaco que te complica la vida cuando el proyecto es pequeño y estás trabajando solo, pero vas a agradecerlo luego cuando tu proyecto crezca y tengas que esperar más de 2 o 3 minutos cada vez que recompiles para verificar un cambio.
"Haz lo que te digo pero no lo que yo hago" jejeje, yo algunas veces suelo usar esta mala práctica también jajaja, pero como le digo a mi hijo "lee siempre las instrucciones aunque no las sigas". Saludos.
User avatar
Vortigano
 
Posts: 239
Joined: Sun May 07, 2017 6:04 am

Re: Preguntas sobre el lenguaje C

Postby CicTec » Thu Jun 03, 2021 7:16 pm

Hola Hokuto7,

El problema es el IDE/paquete que usas para compilacion automatica, normalmente los editor crean los que llaman "proyectos", "workspace" o similar, donde ves y puedes meter el listado de ficheros del proyecto para que luego al compilar el proyecto el compilador tenga la lista de los source da compilar, si no usas un editor que soporta este tipo de proyectos, debes compilar manualmente en la consola como te ha explicado vortigano, viceversa, anade el fichero .c al proyecto (aparte el main) y pulsando la tecla para compilar deberia solucionar el problema en automatico.
User avatar
CicTec
 
Posts: 16553
Joined: Thu Jul 31, 2008 10:18 pm

Re: Preguntas sobre el lenguaje C

Postby Hokuto7 » Fri Jun 04, 2021 10:37 am

No..no se soluciona el problema solo con el archivo.c y todo el codigo,pero ya paso,lo que tenia que hacer con raylib ya lo hice,ahora toca pasarse a sdl o allegro.

Volvi al ide zinjai para ver si se pueden crear proyectos y si se puede,ya he podido hacer que funcionen varios archivos con sus archivos de cabecera y eso,pero con c++ y clases,probe a hacerlo como con c y me da algun error.

archivo.c
Code: Select all
#include "jugador.h"

Jugador jugador;
jugador.x = 100;
jugador.y = 150;

void logica(){
   cout<<"X: "<<jugador.x<<endl;
   cout<<"Y: "<<jugador.y<<endl;
}
   
void pintar(){
   cout<<"pintando jugador"<<endl;
}



archivo.h
Code: Select all
//prototipo
#ifndef JUGADOR_H
#define JUGADOR_H

#include<iostream>
using namespace std;

typedef struct Jugador{
   int x,y;
}Jugador;

void logica();
void pintar();

#endif



archivo main.c
Code: Select all
#include "jugador.h"

int main (int argc, char *argv[]) {
   
   logica();
   pintar();
   
   getchar();
   return 0;
}




error.
Code: Select all
jugador.cpp:4:1 error: ''jugador' does not name at type
jugador.cpp:4:1 error: ''jugador' does not name at type


Por cierto vortigano,¿podrias hacerme un favor? :angel:
Podrias hacer una pequeña aplicacion de rendimiento con allegro por software,la misma prueba que se hizo con gemix,es para ver cuantos objetos me crea en mi ordenador y ver si tiene buen rendimiento y si me merece la pena ponerme con ello,cictec te puede indicar como hacer esa prueba de rendimiento,aunque creo que por aqui hay alguna,voy a mirar...

Aqui hay test que puedes mirar,en la pagina 5.6,7 hay mas.
viewtopic.php?f=43&t=6655&start=30
User avatar
Hokuto7
 
Posts: 1396
Joined: Mon Aug 28, 2017 10:14 am

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Fri Jun 04, 2021 1:48 pm

:lol: :lol: :lol: me hacés reir con tus comentarios hokuto.
respecto de ese híbrido de cabeceras con extensión para lenguaje C pero que incluye cabecera C++ :

Está prohibida esa asignación porque estás fuera de cualquier cuerpo de función.
Code: Select all
Jugador jugador;
jugador.x = 100;
jugador.y = 150;


podrías cambiar por esto:
Code: Select all
Jugador jugador = {100, 150};
//jugador.x = 100;
//jugador.y = 150;


Por favor, revisá los libros que te recomendé en el thread de simu ahí está todo. :y:
User avatar
Vortigano
 
Posts: 239
Joined: Sun May 07, 2017 6:04 am

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Fri Jun 04, 2021 2:39 pm

Respecto a Allegro5, todo es acelerado por hardware sea directx u opengl. Yo estoy mezclando gemix con allegro5 y va muy bien, espero poder mostrar algo mientras cictec avanza el gemix v0.8.0.0 . Por otro lado leer y escribir pixeles de una imagen en memoria de video es lento (no es limitación de la biblioteca, es limitación de las computadoras modernas por su propia arquitectura) pero es posible con Allegro5 y no es recomendable, y bueno esto ya es "harina de otro costal". Las tarjetas de video aman dibujar texturas con texturas (VRAM -> VRAM). La era de Allegro4 acabó hace muchos muchos años, esa sí era por software, con allegro5 es posible hacer juegos 3D real y con aceleración por hardware, lo que puede resultar malo para los que quieren ver resultados rápidos es que hay que saber bastante de C/C++, conocer la biblioteca allegro y por supuesto saber matemática, además no está de moda usar allegro5 y eso creo que no va a cambiar nunca :) . Saludos.
User avatar
Vortigano
 
Posts: 239
Joined: Sun May 07, 2017 6:04 am

Re: Preguntas sobre el lenguaje C

Postby Vortigano » Fri Jun 04, 2021 3:08 pm

Ahí tenés resumido tu fallo
Code: Select all
#include <stdio.h>

typedef struct mi_estructura{
   int x,y;
}Testructura;

//PERMITIDO ^u^
//Testructura una_estructura;
//PERMITIDO ^u^
Testructura una_estructura = {90, -4};

//PROHIBIDO OnO
//una_estructura.x = 90;
//PROHIBIDO OnO
//una_estructura = {90,-4};

int main()
{
    //PERMITIDO ^u^
    //una_estructura.x = 90;
    //una_estructura.y = -4;
    printf("Hola mundo cruel!!!\n");
   
    printf("mi_estructura \"una_estructura\" direccion: %p\n", &una_estructura);
    printf("mi estructura una_estructura.x = %d\n",una_estructura.x);
    printf("mi estructura una_estructura.y = %d\n",una_estructura.y);
   
    return 0;
}
User avatar
Vortigano
 
Posts: 239
Joined: Sun May 07, 2017 6:04 am

Next

Return to Offtopic

Who is online

Users browsing this forum: No registered users and 19 guests