Mettre une liste chainée en global, c possible?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

La 1ere fois que j'ai fait du basic c'était dans les années 80.
Basic interpreté.

Mais bon, je pense que quel que soit le langage, les variables locales ont toujours existées.
je repond a ça tout de suite !!

j'ai moi meme commencé le basic en 79 avec le Zx81 dont j'ai le livre sous les yeux , il n'y a pas de variable local dans ce basic !

j'ai le bouquin du basic du CANON X-07
pareil ! pas de variable local !! (pourtant les fonctions existe !!)
je peut faire des recherche sur d'autre micro , mais je risque d'en trouver beaucoup de cette epoque ou les variables local n'existait pas !!

pour l'exemple recursif laisse moi un peut de temps je te fait ça !



:)
Dernière modification par Backup le dim. 19/déc./2004 18:10, modifié 1 fois.
Lukky
Messages : 340
Inscription : dim. 25/janv./2004 12:22
Localisation : Morbihan

Message par Lukky »

Il est vrai que le tout global peut procurer un certain "confort".

Mais lorsque dans un programme on a besoin de 200 ou 300 variables différentes !!

Sachant que 80% d'entres elles sont utilisées uniquement dans des procédures/fonctions.

Que dans celle-ci 99% ne sont utilisées que temporairement uniquement pendant la durée de vie de ces même procédures.

L'intéret des variables locales, déclarées au début de la procédure apportent un confort bien supérieur à mon avis.

D'abord parce que dans les proc on ne fait joujou qu'avec quelques variables que l'on a sous les yeux en début de proc, on les voit, on sais exactement ce que l'on utilise et en sortie la on peut eventuellement remplir une variable globale avec le résultat de la proc.

Mais en début de prog on a juste quelques variables à gérer, les autres de moindre importance (temporaires, intermédiaires dans des calculs, etc..) ne nous intéresse que lorsque l'on travail justement dans une procédure et c'est seulement à ce moment que l'on a besoin de s'en occuper.

D'ou la clarté du code, un moindre risque avec l'effet de bord et je trouve que pour le debuggage on gagne encore en clarté car si on surveille une variable locale, ont est sur qu'elle ne sera pas modifiée ailleurs dans le code d'ou à mon avis un tracage simplifié.

J'ai actuellement un code qui doit contenir en tout (je viens de vérifer) + de 900 variables (bien sur bcp ont le même nom et sont dans des proc différentes pour des utilisations similaires). Seulement une vingtaine de celle-ci sont dans le corps du programme, les autres sont crées uniquement dans les proc ou elle sont necessaire.

En terme d'économie de mémoire la différence entre les deux méthodes dans le cas d'un grand nombre de variable est tout à fait faramineuse et parle pas de la lisibilité.

Evidemment si on se base sur des petits prog de quelques centaines de lignes l'intéret des locales ne saute peut-être pas aux yeux mais dans de gros programmes c'est vraiment necessaire.

Et je ne parle pas de la loi du petit programmeur qui condamne l'utilisation de variables globale par 10 coups de fouets pour chacunes d'entres elles.

C'est peut-être pour ça que Dobro en utilise autant.

JL
Quand on me gonfle trop j'éclate, sinon ça va !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

voici donc l'exemple attendu par Denis :

Code : Tout sélectionner


; exemple de recursivité global par Dobro !


Global dobro

dobro=3
Gosub Affiche

 Affiche:
    CallDebugger 
    Debug  dobro
    If dobro>0 
        dobro=dobro-1
        Gosub Affiche ; - - appel récursif avec condition d'arrêt
    Else 
        End
    EndIf
   
Return
    



@ lucky :

je suis d'accord avec toi !!
je me fait l'avocat du diable parceque au debut du post certain voudrai
mettre les tableaux en local !!
moi je demande a ce que le global soit le mode par defaut !!
je veux pas que le local devienne le mode par defaut ! c'est tout !

je ne denigre pas les variables locale surtout pour des longs listing
bien que personnellement je ne les utilises pas car j'utilise plus de variables globale et une technique d'ecriture qui fait que je ne confond pas 2 variables !
les ordinateurs ont changé et vouloir grapiller des octets n'a pas trop de sens de nos jour !
sauf pour la beauté du geste !!
et puis combien d'entre nous utilise 300 variable dans son aplication purebasic !! ??


je respect tout les programmeur et leur techniques ! , et ne veux pas entrer dans un debat du genre
les goto c'est moins bien que les gosub , les locals , les globals , les procedures contre les sous-programme ect .. (tous ça ce sont de tres vieux debats , qui avaient deja lieux dans hebdogiciel ! :D

je voudrai juste attirer l'attention sur le fait que pour les programmeurs debutant moyen comme moi , les global sont plus facile a mettre en oeuvre , et que la majorité d'entre nous executons des petit programmes ! (100 variables max !! ) apres tout les tableaux servent a diminuer le nombre !!

la notion de variable Local est interressante mais pas indispensable pour faire des programmes (jeux, utilitaires, sheareware de toute sorte !) !!

bien sur pour les pro qui ont a reutiliser des fonctions ou des procedures
les locals sont indispensables !!

a titre d'info mon synthe vocale fait 36992 lignes !! sans une seul variable local !! :D

j'espere avoir ete clair dans mes explications !!!











:D :D
Dernière modification par Backup le dim. 19/déc./2004 18:16, modifié 1 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Moi, je verrais bien des variables locales dont la portée serait limitée à la ligne ou elles sont utilisées.

a = 10
debug a

resultat du compilo : 0

a = 10 : debug a

resultat du compilo : 10

Ca serait pas bien, ça ????
:jesors:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

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

Message par Anonyme2 »

D'accord avec toi Lucky

Dobro, exact, tu as bien une variable globale dans ta procedure récursive mais elle sert de test de condition de sortie de l'appel.

Regarde l'exemple suivant que j'ai posté

http://purebasic.hmt-forum.com/viewtopic.php?t=1223

Ma sortie de récursivité se fait sur une variable (Enum) qui est obligatoirement locale car c'est cette variable qui va permettre de sortir de l'appel courant, après cette sortie le programme récupère la valeur de la même variable (pour son nom) qui n'est bien sur pas la même variable (c'est pas trop clair ?); d'autres variables locales utilisées sont en fait différentes au niveau de leurs adresses mémoire en fonction du niveau d'imbrication des appels et elles doivent être différentes pour que cela fonctionne et les variables locales se pretent à merveille à celà. On pourrait peut-être utiliser une liste chainée qui stockerait une adresse mémoire allouée à chaque tour de boucle et libéréer cette mémoire lorsque l'on en a plus besoin, c'est surement faisable. Donc bien sur que l'on peut utiliser des variable globales dans une procedure récursive (c'est le cas dans mon exemple) mais ce qui permet la récursivité (donc appel de procédure avec passage d'arguments utilisés dans la procédure) c'est bien l'utilisation de variables locales.


Je pense qu'on verra ça dans un tut sur l'ASM mais bon j'avance pas vite la-dessus et avec les fêtes, y a plein de choses à faire :D

Voici ce que dit la doc PB sur la récursivité
En PureBasic les procédures sont totalement récursives et peuvent s'appeler elles-mêmes. Lors de chaque appel à la procédure, les variables locales sont automatiquement initialisées avec la valeur 0. Pour accéder aux variables du programme principal, ils faut les partager en utilisant les mots clefs Shared ou Global (voir aussi: Protected et Static).
Dernière modification par Anonyme2 le dim. 19/déc./2004 20:15, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Dobro, exact, tu as bien une variable globale dans ta procedure récursive mais elle sert de test de condition de sortie de l'appel.

j'aurai pus utiliser une autre variable pour conditioner la sortie !

:lol: :lol: en fait j'ai rien compris a ton truc !! :lol: :lol:

c'est pas grave ! je voulais juste prouver que l'on peut faire de la recursivité sans utiliser des variables locals !

:lol: :lol:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

je me fait l'avocat du diable parceque au debut du post certain voudrai
mettre les tableaux en local !!
moi je demande a ce que le global soit le mode par defaut !!
je veux pas que le local devienne le mode par defaut ! c'est tout !
Dobro, le 'certain' c'est Flype. Et Flype il a pas demandé a ce que tout soit en local. C'est faux. Je considère aussi que les listes en global par défaut soit quelquechose de très confortable dans la majorité des cas. Tu as tout compris de travers. Tu dis faire l'avocat du diable, ok, mais pousse pas trop. T'as vu ton exemple de récursivité avec des gosub - return and co, désolé mais c'est pas comme çà qu'on programme de nos jours. Moi je pense plutot aux situations où il serait parfois intéressant de déclarer une liste ou un tableau en local. Je n'étais pas mais alors pas du tout en train de vouloir réinventer Purebasic. Mais imagine le cas où tu travailles sur un gros projet avec de multiples fichiers d'includes. Moi je préfère isoler les variables, listes, tableaux, etc... situés dans les fichiers includes de mon source principal, justement pour éviter les effets de bords dont parle très bien Denis. Et oui je sais parfaitement qu'en l'absence de local pour ces types de données il me suffit de leurs donner des noms différents. Merci je suis pas 'débile' et il y a longtemps que je l'ai compris, et cà jamais été de la flegme que de vouloir tendre vers une programmation plus 'propre'.
Pure permet une programmation propre mais parfois non alors il est bon de le dire POINT !

PS: chui pas faché, je dis juste ce que je pense là maintenant et c'est même plutot bien de pouvoir discuter de çà.
Image
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Dobro, le 'certain' c'est Flype.
ben non ! j'ai utilisé le sobriqué "certain" pour ne pas avoir a nommer !
car l'interet n'est pas de savoir qui , mais de connaitre l'intention !!

et par certains je sous-entendais Hardy , le soldat qui avait l'air d'accord avec hardy


Hardy qui a dit :
C'est sûr: avec des tableaux globaux, on peut s'emm... sévère pour faire de la récursivité...
Qui c'est qui demande à Fred d'arranger ça?

qui montre bien une volonté de (pour te citer) "REINVENTER" purebasic !!


quant a toi tu dit :
T'as vu ton exemple de récursivité avec des gosub - return and co, désolé mais c'est pas comme çà qu'on programme de nos jours.
t'es gentil mais dans ce cas si je poursui ton raisonement
plus personne ne programme en Basic non plus !!!
alors que fait tu ici !! retourne faire du C++ ou du C#

le basic a integré depuis longtemps des sous-programme !!
et personne ne peut dire qu'aujourd'hui on ne les utilises plus !!
la difference c'est que dans les autres language on appelle -ça autrement

les procedures (fonction) (une sorte de sous-programme)
les DLL sont des sous programme aussi que je sache !!!

car une fonction est un sous-programme aussi !
exemple historique ,avec le GFA BASIC qui nomait carrement les sous-programme "Procedure" !!!

tout est une question d'appelation !
cela n'a rien d'archaique que d'utiliser les sous programme
avec gosub label et return !! qui je te le rapelle est la forme la plus proche
de CALL et RET en assembleur ! (une reference pour beaucoup)

Et oui je sais parfaitement qu'en l'absence de local pour ces types de données il me suffit de leurs donner des noms différents. Merci je suis pas 'débile' et il y a longtemps que je l'ai compris, et cà jamais été de la flegme que de vouloir tendre vers une programmation plus 'propre

je n'ai rien dit de personnel a ton encontre !
j'ai argumenter pour repondre a Denis , pour m' expliquer que celon moi pouvais se passer des variables locals ! c'est tout !!

avant de repondre s'il te plait prend le temps de lire les topic depuis le debut au lieu de sortir de son context des bouts de phrase pour les transformer en attaque personel ! (je n'ai jamais pretendu que tu soit débile loin de la ! ) :D

et je le repete mon "Certains" n'etais la que pour eviter de citer quelqu'un qui l'aurai mal pris !
effet raté puisque tu l'a mal pris ! :D
sache que si j'ai envie de te traiter de débile , je vais pas y mettre la forme ! , ce sera direct live !



:lol:
PS: chui pas faché, je dis juste ce que je pense là maintenant et c'est même plutot bien de pouvoir discuter de çà.
ben c'est pas evident que tu n'ai pas ete faché , car ce que tu dit plus haut et le ton employé m'incite a penser le contraire ! :D

et je suis d'accord avec toi , c'est plutot bien de pouvoir en parler ! :D
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

On va pas s'battre pour une p'tite variable globale quand meme !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Dobro,

chacun pensant à sa manière (j'ai relu les posts) on ne parle pas forcément de la même chose.

Tu as raison, les commandes des premiers basic ignoraient le type de variables (il fallait aussi numéroter les lignes (quel basard...)), pour autant les types locaux et globaux existaient tout de même mais étaient transparent pour l'utilisateur.

Pour la récursivité, je maintiens ce que je dis ( qui clair comme du jus de chique ( :roll: ))

Ce qu'il y a de bien c'est qu'on ne s'ennuie jamais avec toi :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

De toute façon, quel que soit son type, une variable est TOUJOURS locale.

Elle ne sort jamais de l'ordinateur :lol:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Chris a écrit :De toute façon, quel que soit son type, une variable est TOUJOURS locale.

Elle ne sort jamais de l'ordinateur :lol:

:mrgreen:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

:lol: :lol: Chris j'adore ton humour ! :lol: :lol:

@Denis avec toi non plus , on s'ennuie pas ! et heureusement
depuis le temps le forum serai desert !! :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Pingtix a écrit :On va pas s'battre pour une p'tite variable globale quand meme !
t'inquiete pas ! ma specialité est de me battre avec tous le monde !! :lol: :lol:
c'est mon seul moyen d'exister car je suis nul en programation et en orthographe !

(mais d'apres mes copines je baise bien :D) ouf ! :lol: :lol:


au fait ! avouez que vous etes jaloux de mon nouveau logo !!

c'est un ecrase pattates breveté !! :D
Répondre