[ Annecdotique ] Bug avec AllocateMemory( ... ) et includes

Archive.
Avatar de l’utilisateur
Ouaf-Ouaf
Messages : 212
Inscription : dim. 11/juil./2004 9:07

[ Annecdotique ] Bug avec AllocateMemory( ... ) et includes

Message par Ouaf-Ouaf »

Bonjour -eventuellement- à la team,

Rien de métaphysique ni de trés important, mais :

Je reorganise en ce moment mon code, en mettant des Gosubs sous forme de procedures, et en creant des includes.

Certaines declaration de pointeurs se sont revelées bugées, et j'ai dut les placer dans l'Include qui me sert aux declarations.

Vous me direz, ça rentre dans l'ordre des choses. Mais le truc, c'est que "j'aime bien" désallouer les variables que je n'utilise plus...
Pour les ré-allouer si besoin est.

Ca correspond peut-être tout simplement à l'intérêt même des Procedures :? ...


Quoi qu'il en soit, c'est un petit truc qui m'as embetté.
Par contre ça ne vaux pas qu'on deploie trop de temps dessus...

Mais bon, j'imagine que les programmeurs sont des gens méticuleux en general :wink: , alors bon, je signale...
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je ne comprend pas grand chose à ton post, la seule chose qui est importante c'est de mettre un exemple qui montre le bug

ALors mets un exemple pour que l'on comprenne

A+
Denis
Avatar de l’utilisateur
Ouaf-Ouaf
Messages : 212
Inscription : dim. 11/juil./2004 9:07

Message par Ouaf-Ouaf »

J'ai pas l'habitude qu'on me comprenne pas quand je parle, mais soit, je vais essayer de presenter ça differement.
"Je te prie de bien vouloir excuser mon in-concision" (oui c'est lourd, mais "excuse moi" est une insulte)

Mon programme marchait impec sur une seul page.
Dedans, j'utilisais un tas de pointeurs.

J'ai divisé le fichier en plusieurs includes.
Et à la compilation, je me suis retrouvé avec des "write error at adress 0"

J'ai dus bouger la plupart de mes "variable.type = AllocateMemory(n)", dans un même include pour que ça marche.

Je n'arrive pas à recreer l'erreur, elle doit être.. très, très annecdotique..
Elle intervenait plutôt vers le debut du code.
Donc je pourrais chercher, mais là tout de suite, je me concentre sur mon code etant bientôt à bout de ce qui est pour moi un marathon.


Oui, il aurait été plus avisé de procéder comme tu l'entends.
Je demare trés souvant des questions, qui une fois formulées par ecrits me paraissent divinement connes. Et que donc je n'envois pas. Celle-çi à survecut à ce fusible.

Quoi qu'il en soit, ce problème en reste un pour moi, et j'aimerais vraiment comprendre ce genre de "bug".

Bon app' !
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Ouaf-Ouaf a écrit :J'ai divisé le fichier en plusieurs includes.
Et à la compilation, je me suis retrouvé avec des "write error at adress 0"
çà évoque un problème de scope (équivalent français = ?) de variable, avec comme conséquence des pointeurs nuls (car non définis).
As tu essayé de définir les pointeurs comme globaux [GLOBAL] ou de les partager entre les procédures qui les utilisent [SHARED] ?
Avatar de l’utilisateur
Ouaf-Ouaf
Messages : 212
Inscription : dim. 11/juil./2004 9:07

Message par Ouaf-Ouaf »

J'ai definis des pointeurs comme globaux, par contre pas de shared.

C'est l'un ou/et l'autre de toute façon ?

J'ai des elements de memoire parfois.. .. imaginatifs, mais il m'as semblé lire içi que dans le cas d'un SELECT, un schmilblick que je serais incapable de nommer (frustration suprème), "causait des problèmes sur les addresses".
(mon vocabulaire informatique est heu.. surement pas du tout conventionnel, desolé)

J'en utilise plusieurs, dont une imbrication (select dans un select), à l'entrée du programme (pour les choix sur la resolution.. ), c'est peut-être une mauvaise utilisation ?
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Ouaf-Ouaf a écrit :J'ai definis des pointeurs comme globaux, par contre pas de shared.
C'est l'un ou/et l'autre de toute façon ?
oui
Ouaf-Ouaf a écrit :J'ai des elements de memoire parfois.. .. imaginatifs, mais il m'as semblé lire içi que dans le cas d'un SELECT, un schmilblick que je serais incapable de nommer (frustration suprème), "causait des problèmes sur les addresses".
On peut avoir des problèmes de pile (stack) si on quitte de façon inatendue une boucle de contrôle ou une imbrication du type SELECT/CASE/ENDSELECT en utilisant un GOTO ou JMP plutôt qu'un BREAK.
Anonyme

Message par Anonyme »

Des pointeurs sont surement déclaré dans tes includes , et , tu dois surement essayé d'accéder à ce pointeur avant le fameux ( includeflie "" )
Vois les includes comme des "macros" , il faut bien que tu comprennes le concept.


Exemple :


Inc.pbi
MaVariable.l = 412
debug "Je suis dans l'include!"
Main.pb
debug MaVariable ; Renvois 0
includefile "Inc.pbi"
debug MaVariable; Renvois 412
l'include est donc équivalent à ( dans main.pb) :
debug MaVariable ; Renvois 0
MaVariable.l = 412
debug "Je suis dans l'include!"
debug MaVariable; Renvois 412
Avatar de l’utilisateur
Ouaf-Ouaf
Messages : 212
Inscription : dim. 11/juil./2004 9:07

Message par Ouaf-Ouaf »

Merci pour les precisions.

Je n'utilise aucune methode de sortie speciale, donc pour les SELECT au moins je suis fixé.

@CPL :

Le message d'erreur que j'ai si je ne declare pas le pointeur à temps est plutôt :
The following variable doesn't have a 'structure' : *Variable
C'est pour ça que le message d'erreur que j'ai eu m'as surpris.

Je me suis demandé si ce n'etait pas lié à l'ordre de compil' des includes, qui par exemple ne reconnaissent un macro que si il fait partit de la même feuille.

C'est peut-être un problème tout bête d'organisation des includes par pure.
J'aurais eventuellement dus sauver et redemarrer le compilo..
Peut-être même verifier les programmes en tâche de fond, m'est arrivé d'avoir des compilations "crashées" qui continuaient à tourner discretement :0 en bouffant des ressources.

+
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Si tu utilises des declare pour déclarer des procedures et qu'un ou des paramètres des procedure utilisent une structure que tu as créé, il faut que cette structure soit déclarée avant de mettre les declare sinon PB ne connait pas la structure, le compilateur ne fait qu'une passe et tu auras un message comme tu le décris. C'est bien une erreur de compilation et pas d'exécution.

C'est aussi valable pour les interfaces.

A+
Denis
Avatar de l’utilisateur
Ouaf-Ouaf
Messages : 212
Inscription : dim. 11/juil./2004 9:07

Message par Ouaf-Ouaf »

Les pointeurs qui possaient problème n'utilisaient pas des structures que j'ai créé, mais les types classiques du style .byte, .word..
Global *Pixs_X.word = AllocateMemory( 2 ) : *Tils_X.byte = AllocateMemory( 1 )
Global *Pixs_Y.word = AllocateMemory( 2 ) : *Tils_Y.byte = AllocateMemory( 1 )

*Pixs_X\w = 800+RESX*2 : *Tils_X\b = *Pixs_X\w / 66 ; Taille d'une ligne en Tiles
*Pixs_Y\w = 600+RESY*2 : *Tils_Y\b = *Pixs_Y\w / 24 ; Taille d'une colonne en Tiles
J'essaye de plutot faire attention à l'organisation pour pas me perdre dans mon code, mais bon j'etais en pleine reorganisation donc un truc m'as surement echappé...
L'esentiel est que maintenant ça roule. :p
Répondre