FastFiber

Waarom local variabels declareren OPGELOST : niet gedeclareerd is global

Gestart door delangstevandestraat, vr 06 12 2013, 13:25:42

Vorige topic - Volgende topic

delangstevandestraat

Jiha, het is vrijdag (toevallig) en ik er heb er weer zin in...

Toch nog eventjes de hersenen laten werken, (ik ben niet blond hee) :wink:

Ik weet en snap het verschil tussen global en local variables, maar waarom moet een locale variable gedeclareerd worden?

Een lisp werkt net zo goed als je dit niet doet? maar wat zijn de mogelijke gevolgen  :?:

groetjes ...
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)


EddyBeerke

Simpel gezegd kun je twee lisp-routines gebruiken met dezelfde vars.
In lisp1 zit (setq a "Dit is variable a").
Terwijl in lisp2 dit staat (setq a 1)
1 - Dit zou een foutmelding kunnen veroorzaken.
2 - Tenzij je het nodig vindt dat AutoCAD het geheugen van windows mag vast houden met allemaal informatie die je later toch iet meer gebruikt, moet je geen variable declareren.
Anders... wel declareren en lekker het geheugen schoon houden en fouten voorkomen.
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

delangstevandestraat

Dag Eddy,

Uit de link van Stephan vind ik:

CiteerLocal variables retain their value only as long as the function that defined them is running. After the function finishes running, the local variable values are automatically discarded, and the system reclaims the memory space the variable used. This is known as automatic garbage collection, and is a feature of most LISP development environments, such as VLISP. Local variables use memory more efficiently than global variables.

Dan wordt het geheugen toch automatisch 'lekker schoon' gehouden ?

Tot nu toe heb ik ook altijd locale var's gedeclareerd, maar ook al enkele keren vastgesteld dat ik er hier en daar eentje vergeten ben, toch blijven de routine's altijd goed werken...

Uiteindelijk maakt het niet hoor hoe het moet, maar iets doen "omdat het al altijd zo is geweest" daar stel ik dan vragen bij en probeer het kritisch te analyseren, om het te snappen en bij te leren...

Ik stam ook wel af van de apen :-) maar ben toch iets slimmer (hoop ik)

:-)

CiteerZet tien apen in een kamer. Hang een banaan aan het plafond en zet een ladder neer waarmee je aan de banaan kan. Zorg ervoor dat de banaan uitsluitend via die ladder to bereiken is. Breng vervolgens een systeem tegen het plafond aan dat in de hele kamer ijswater begint to sproeien, zodra de ladder wordt beklommen. De apen hebben al heel snel door dat ze de ladder niet moeten beklimmen en zullen de banaan laten voor wat ze is.

Schakel het sproeisysteem met ijswater uit en zet een nieuwe aap in de kamer. Deze laatste zal de banaan zien en proberen om de ladder to beklimmen maar hij  zal, zonder to begrijpen waarom, een aframmeling van de andere apen krijgen.

Voer de operatie opnieuw uit met een nieuwe aap en ook hij zal worden afgerost. En degene die het hardst slaat, zal die aap zijn die voor hem binnenkwam en werd afgerammeld.

Ga zo verder totdat er alleen nog nieuwe apen zijn. Dan zal je  zien dat geen enkele aap de ladder nog zal proberen to beklimmen.

En als eentje van hen ook maar een seconde met de gedachte speelt om dat wel to doen, zal hij als de gesmeerde bliksem een aframmeling van de anderen krijgen.

Het ergste is dat geen enkele aap echter zal weten waarom men niet naar de banaan mag gaan !
[/color]
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

bart

Lokale variabele gebruik je voor  bewerkingen binnen een lisp
Als er geen behoefte is deze te onthouden of het onthouden de zaken juist ongewild ingewikkelder maakt.
Hoe vaker je stukjes code hergebruikt hoe groter de kans op fouten


Globale variabele bieden meer mogelijkheden je kan bijvoorbeeld een lisp op verschillende momenten meerdere keren laten uitvoeren binnen 1 tekening
Waarbij je de waarde terugvraagt en indien ze gelijk zijn alleen op enter hoeft te drukken
Zodat je niets steeds de complete gegevenlijst hoeft in te vullen maar alleen de gewijzigde.


Over het geheugen zou ik me vandaag de dag niet zoveel zorgen meer maken


Domme vragen bestaan niet.
Domme antwoorden wel.

m.vr. groet Bart

HofCAD

#5
Beste Delangstevandestraat,

Een leuk verhaal van die apen, zelfs een blondje begrijpt dit.
Het probleem van lokale en globale variabelen geldt ook voor
functies.
Ter demonstratie zitten in de bijlage 4 Lisp programma's.

Laad in een nieuwe tekening alleen Run1.lsp
Men laadt daarbij het sub programma @prog
en het hoofdprogramma run1.
In het sub programma @prog wordt een lijn getekend.
Type in het commando RUN1.
Het resultaat is een rode lijn.

Laad in dezelfde tekening nu ook Run2.lsp
Men herdefinieerd het sub programma @prog
en men krijgt nu een hoofdprogramma run2.
In het veranderde sub programma @prog wordt een cirkel getekend.
Type in het commando RUN1.
Het resultaat is een rode cirkel.
Type in het commando RUN2.
Het resultaat is een gele cirkel.

Laad in dezelfde tekening nu ook Run3.lsp
Omdat het sub programma @prog in het hoofdprogramma Run3
zit, wordt @prog nog niet geherdefinieerd.
Het sub programma @prog is echter niet lokaal gedefinieerd.
In het sub programma @prog wordt een ellips getekend.
Type in het commando RUN1.
Het resultaat is een rode cirkel.
Type in het commando RUN3.
Het resultaat is een groene ellips.
Type in het commando RUN1.
Het resultaat is een rode ellips.

Laad in dezelfde tekening nu ook Run4.lsp
Omdat er een sub programma @prog lokaal gedefinieerd in het
hoofdprogramma Run4 zit, wordt de globale @prog daardoor nooit geherdefinieerd.
In het lokale sub programma @prog wordt een rechthoek getekend.
Type in het commando RUN1.
Het resultaat is een rode ellips.
Type in het commando RUN4.
Het resultaat is een cyaan rechthoek.
Type in het commando RUN1.
Het resultaat is een rode ellips.


Conclusie: Als je in een artificial intelligence Lisp een programma iets
wil aanleren, moet je sub programma’s niet lokaal definiëren.

Met vriendelijke groet, HofCAD CSI.
ACADcadabra

EddyBeerke

Citaat van: delangstevandestraat op di 10 12 2013, 10:25:08
Ik stam ook wel af van de apen :-) maar ben toch iets slimmer (hoop ik)
Gelukkig stam ik niet van de apen af, en ben toch slimmer  :lachen:
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

delangstevandestraat

@hofcad

Leuk, en ik snap het nog ook ...

Maar je zoekt dit bewust door iedere keer zelfde benamingen van functie te gebruiken.

En nergens variabelen, laat staan locale...

Dus blijf ik een beetje op mijn honger zitten (en aangezien ik mijn figuur niet graag verknoei :-) ....)

En blijf ik hunkeren naar antwoorden
CiteerIk weet en snap het verschil tussen global en local variables, maar waarom moet een locale variable gedeclareerd worden?
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

EddyBeerke

Citaat van: delangstevandestraat op wo 11 12 2013, 13:57:23
Ik weet en snap het verschil tussen global en local variables, maar waarom moet een locale variable gedeclareerd worden?
Als je de variabele niet declareerd dan is het een globale var.

Voorbeeld:

(defun c:test1 ()
  (setq a "test1")
  (princ)
)

De var "a" is niet gedeclareerd en is hiermee globaal in de tekening aanwezig en te gebruiken door andere routines.


(defun c:test2 ( / a)
  (setq a "test2")
  (princ)
)

De var "a" is wel gedeclareerd en is hiermee niet meer in de tekening aanwezig nadat de lisp klaar is en daardoor niet te gebruiken door andere routines omdat de var niet meer bestaat.
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

delangstevandestraat

Haja,

Dat verklaart alles...

Bedankt T eddybeerke.

Ge zijd een schatje :-)
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

EddyBeerke

Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

FastFiber