No funciona bien los includes, decepcionada

Started by alicesimu, November 14, 2016, 12:42:03 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

alicesimu

Estoy decepcionada con el comportamiento de includes: bueno como el compilador los relaciona entre si...

por ejemplo:

Programa juego.prg vincula otros prg...
include "menus.prg";
include "elementos.prg";


juego.prg
contiene esta variable global:
int mis_datos;

Hay un proceso dentro de menus.prg
proces menu_titulo();
y necesita acceder a la variable global mis_datos; del principal juego.prg

Esto al compilar NO ME LO RECONOCE la variable!!!  >:(

menus.prg:24: error: Unknown identifier ( error in token: "mis_datos" ).
juego.prg: doesn't exist or isn't version 8 DCB compatible

teóricamente, los ficheros include deberían tener acceso las variables globales,locales y procesos/funciones del principal juego.prg
además, otros includes
por ejemplo:

include "menus.prg";
include "elementos.prg";

elementos.prg pueda tener acceso alguna variable global,local que se declara en menus.prg

resumiendo, deberia ser accesible en ambos sentidos, solo el programa_jefe.prg tiene los includes enlazados entre si.
tanto si el programa_jefe.prg necesita aceder alguna variable de algun include.
como si de algun include, necesita aceder algo del programa_jefe.prg
incluso de algun include, necesita aceder un dato de otro include.

Flecha verde: declaran que necesita conectar con include <codig>.prg
Flecha azul: los accesos entre programa_jefe.prg y todos los includes conectados, todos son accesibles entre si.


la idea de los include es poder dividir el PRG principal en varios archivos.prg, para organizarte mejor.
El compilador deberia comprobar todos los includes, y realizar la compilacion final, con todos los PRG juntos, como si de 1 se tratase realmente.

no me puede decir que no reconoce una variable, que se llamó dentro de un include extra.prg, cuando esta declarado en el programa_jefe.prg que es el punto de partida a la hora de compilar.

panreyes

No entiendo tu explicación ni el gráfico, pero los includes funcionan perfectamente.

Lo único que estés haciendo esos includes antes de declarar las variables globales. Debes hacerlo en orden, lógicamente.

Esto está mal:

include "otro.prg";
global
variable;
end


Esto está bien:

global
variable;
end
include "otro.prg";

SplinterGU

los include funcionan perfectamente como dijo panreyes... el tema es que los estas usando de forma incorrecta... esto es valido para cualquier lenguaje, primero incluyes lo que quieres se vea, y luego lo usas...

no es conveniente incluir el .prg directamente, deberias incluir un .h o .header o como quieras llamarlo, donde solo esten las declaraciones de las cosas que quieras se vean desde otros .prg, y luego incluyes el resto
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

alicesimu

Quote from: panreyes on November 14, 2016, 01:01:35 AM
No entiendo tu explicación ni el gráfico, pero los includes funcionan perfectamente.

Lo único que estés haciendo esos includes antes de declarar las variables globales. Debes hacerlo en orden, lógicamente.

Esto está mal:

include "otro.prg";
global
variable;
end


Esto está bien:

global
variable;
end
include "otro.prg";


ese era mi fallo:
despues de los import...
hacia llamar los includes... <----
y despues declaraba las global, locals....
y al compilar no reconocia las variables....

ahora cambiando el orden:
-import
-global,local
-includes <----
-procesos/funciones.

FreeYourMind

espero que con la explicación de splinter ya no te sientas decepcionada

Yawin

Para evitar ese error mi modo de trabajar es el siguiente:

- Tengo un .prg llamado global.prg que contiene todas las declaraciones de globales, locales y constantes así como los declares de las funciones y procesos que lo requieran. Este fichero lo incluyo con include justo debajo de los import.

- Tengo un fichero includes que contiene los includes de todos los ficheros y lo incluyo justo debajo de la inclusión de global.prg.

De esta manera me aseguro de tener control sobre el orden en el que se incluyen y declaran las cosas.

Ejemplo: https://github.com/rfstudios/LittleTales/blob/master/includes.prg
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

+1 a lo dicho. Include viene a decirle al compilador "¡oye! copia  aquí el contenido de este fichero".
Y aquí es cuando los conocimientos de otros lenguajes se vuelven útiles: en C, por ejemplo, se tenía los ficheros .h (header) donde se realizaban las declaraciones de variables y métodos, y aparte, los ficheros .c/.cpp con el código en sí.
Yo recomiendo hacer lo mismo en Bennu: por cada código que separes, ten un .h con sus propias declaraciones. Es más, si miras mis códigos, tengo declaraciones de variables globales en muchísimos ficheros diferentes, porque así los tengo separados y sé en qué procesos/funciones los estoy usando, y si en algún momento dejo de usarlos, comento su .h y no tengo que buscar dichas variables en una larga lista de globales. Además, viene de lujo para los "declare", que se utilizan con las variables públicas.

No tenemos clases, pero tenemos includes :D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Quote from: Drumpi on November 15, 2016, 01:47:21 AM
+1 a lo dicho. Include viene a decirle al compilador "¡oye! copia  aquí el contenido de este fichero".
Y aquí es cuando los conocimientos de otros lenguajes se vuelven útiles: en C, por ejemplo, se tenía los ficheros .h (header) donde se realizaban las declaraciones de variables y métodos, y aparte, los ficheros .c/.cpp con el código en sí.
Yo recomiendo hacer lo mismo en Bennu: por cada código que separes, ten un .h con sus propias declaraciones. Es más, si miras mis códigos, tengo declaraciones de variables globales en muchísimos ficheros diferentes, porque así los tengo separados y sé en qué procesos/funciones los estoy usando, y si en algún momento dejo de usarlos, comento su .h y no tengo que buscar dichas variables en una larga lista de globales. Además, viene de lujo para los "declare", que se utilizan con las variables públicas.

No tenemos clases, pero tenemos includes :D

exacto! muy bien explicado Drumpi!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

alicesimu

pido disculpas, es que me altere, cuando no me dejaba compilar  :'(
para mi es importante usar include para poder organizarme mejor el programa y no liarme.

ahora he aprendido mejor como organizarme gracias a vosotros.
reconozco que hace mucho que no me paso por aqui y perdi el hilo de bennugd, estaba en otro mundo.

siempre es bueno aprender cosas nuevas.

SplinterGU

por mi parte no es necesario pedir disculpas.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Ni por el mío, para eso está el subforo.
Si vieras las tontadas que he llegado a mostrar por aquí... ^^U

Lo que sí recomiendo, como decía en el otro hilo, es darle un repasito de vez en cuando a la programación básica en C, para no perder las "buenas costumbres" por usar lenguajes de alto nivel. Vale que Java o Bennu te ayudan con cositas, pero no está de más, por ejemplo, inicializar las variables, o usar conversión explícita de tipos :P
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

alicesimu

avandono el uso de los includes sinceramente

como puede ser que me devuelva error en un elemento de un proceso , una variable privada de da error?!

al final tengo esto:

programa_jefe.prg
-declaro los import que necesito
-declaro include "global.prg"; aqui dentro tengo declaradas CONST y GLOBAL (TODAS)
-declaro LOCAL
-include mascosa.prg , contiene procesos...
...
-include mascosa5.prg , contiene procesos...
-declaro PROCESS MAIN(); y empieza el codigo jefe....

NO SE COMO ORGANIZARME LOS DATOS GLOBALES/CONST Y LOS PROCESOS.

pero no quiero volver a la antigua epoca de Div2 que tenia todo en unico PRG gigantesco  :'( :'( :'( :'(

FreeYourMind

mete todas las definiciones y variables en el main, y en los includes/ficheros adjuntos, metes procesos (agrupados por tematica o relacion), para que no tengas todo en el main.


yo sigo preferiendo tenerlo todo en el main, cada una lo hace como mas comoda se sienta

Drumpi

¿Qué error te da exactamente?
Si te da error porque no reconoce una variable privada, lo más seguro es que se te haya olvidado poner un END en alguna parte ¡La de problemas que he tenido yo por no cerrar un switch! Me da el error en código5.inc y resulta que en código4.inc o en código3.inc he cerrado todos los CASE pero no el SWITCH.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

alicesimu

Quote from: Drumpi on November 25, 2016, 02:48:02 AM
¿Qué error te da exactamente?
Si te da error porque no reconoce una variable privada, lo más seguro es que se te haya olvidado poner un END en alguna parte ¡La de problemas que he tenido yo por no cerrar un switch! Me da el error en código5.inc y resulta que en código4.inc o en código3.inc he cerrado todos los CASE pero no el SWITCH.

olvidado no...
mas bien sobraba un END justo por encima de la variable privada y no la podia reconocer esa variable...(estaba fuera del proceso)

Solucionado y ejecuta bien.

:-[ :-[ :-[ :-[

si funciono mi estructura, como mencione en el primer post.