Page 1 of 1
[CG] Images.Put
Posted: Sat Mar 29, 2008 2:10 pm
by Yannick
Een paar onder de WINAK-ers hebben die trap opgelost die je soms krijgt bij Images.Put. Hoe los ik die op? Heb zelf al wat geprobeerd te klooien, maar gefaald
(ter info: mijn methode was die van de nils om te debuggen .. 'zet overal wat output bij' .. zomfg, where'z teh l33ts?

..)
Posted: Sat Mar 29, 2008 2:47 pm
by Norfolk
Output bijzetten is in vele gevallen een handige manier hoor. Als je een error boodschap krijgt die duidelijk is dan heb je er wat aan. Maar soms zal je programma vastlopen en blijven draaien zonder een error te geven. en begin dan maar te zoeken. Of nu zoals je Images.Put... Het is blijkbaar niet zo'n duidelijke error als je niet vind waar deze optreedt.
Output zetten is dus altijd een goede optie. In Oberon was er volgens mij nog een manier met F1 of iets dergelijk om te vinden waar de error gebeurde, maar ik weet niet meer hoe je dat moest doen.
Posted: Sat Mar 29, 2008 3:22 pm
by Yannick
Bij het compileren met optie \f (of \2f voor OO designs) dan voert hij uit tot hij de fout tegen komt op een gegeven program counter.
Weet ik. Maar nu is het een ASSERT fout, namelijk een preconditie. De preconditie bij Image.Put is dat de gegeven coordinaten (van een lijn, figuur, .. ?) tussen de nul en de image.height en image.width moeten liggen. Voordat Put wordt opgeroepen heb ik Out.Int's gezet die die width en height afprinten, maar tevergeefs, geen output at all. Vond ik wel raar maarjah.
Posted: Sat Mar 29, 2008 3:40 pm
by PieterK
Stap 1: Open Images.Mod
Stap 2: Zoek de procedure Put
Stap 3: Ge zult daar nen assert zien staan als preconditie. Zet voor die preconditie nen IF met dezelfde voorwaarde als die assert. (Zorg wel dat die IF de gehele procedure omvat)
Stap 4: Compileer
Stap 5: Sluit Oberon af en start Oberon opniew op (da moet want anders gebruikt ie nooit uw nieuwe versie)
Normaal zou da uw probleem moeten oplossen.
Posted: Sat Mar 29, 2008 5:36 pm
by Yannick
Haha, das idd de oplossing. Stom maar efficient die IF's.
Soms snap ik het gebruik van ASSERT's nie .. soms zijn IF's gewoon zoveel beter :/
Maar soit. Don't argue with Oberon code, right?
Super bedankt!
Grtzz
Posted: Sat Mar 29, 2008 5:50 pm
by Norfolk
Die assert staat er omdat de preconditie gevolgd moet worden... Blijkbaar doe je dus een fout tegen dat contract. Waarschijnlijk teken je buiten je image ofzo

Posted: Sat Mar 29, 2008 6:49 pm
by Teun
Ge kunt die asserts ook gewoon niet meecompileren. Ik geloof /a maar ben niet helemaal zeker.
Posted: Sat Mar 29, 2008 7:58 pm
by NecRock
Yannick wrote:Soms snap ik het gebruik van ASSERT's nie .. soms zijn IF's gewoon zoveel beter :/
Zoals hierbove gezegd kunde asserts gewoon niet meecompilere. Zo kunde, terwijl da ge een programma aan het ontwikkele bent, die asserts wel meecompileren zoda uw programma gewoon stopt als er ni aan de precondities voldaan wordt, maar als ge een finale versie hebt, waarin normaal altijd aan die precondities voldaan wordt, da checken achterwege laten. Da is handig als da controlleren een tamelijk dure operatie is, want dan is da altijd interessant als ge tijd kunt uitsparen door da gewoon ni te moeten doen.
Posted: Sat Mar 29, 2008 10:59 pm
by joeri
Al is het uiteraard niet de bedoeling om asserts te disablen, gewoon omdat aan die precondities niet voldaan is.
Posted: Sat Mar 29, 2008 11:10 pm
by Teun
Maar als die precondities fout erinstaan, dan mag da wel he. Ach ja, fouten opvangen in oberon is ni echt goed uitgedacht.
Posted: Sat Mar 29, 2008 11:47 pm
by NecRock
Nee, dan moet ge dervoor zorge da de precondities der juist in staan :p
Posted: Sun Mar 30, 2008 12:13 am
by Teun
Wel, maar dat is dus nen bug he in een module die ge krijgt en niet zelf moet schrijven.
Posted: Wed Apr 02, 2008 4:57 pm
by VFlicka
Het aanpassen van Images is eigenlijk enkel een workaround voor een bug die in Gfx zit. Die ASSERT is zeker nodig omdat anders buiten de image gekleurt wordt (in de vorige 2 woorden zit minstens 1 dt fout :s).
Als je de trap gaat bekijken zie je dus dat Gfx.Dot de procedure Images.Put oproept met verkeerde waarden. Volgens mij komt dit omdat Gfx eerst gaat kijken of de REAL in de image ligt, en dat pas afrond naar een integer.
Gfx.Dot is echter niet te vinden in Watson of in de code, dus je kan niet zelf je Drawline schrijven

Posted: Wed Apr 02, 2008 9:32 pm
by racekakje
PieterK wrote:Stap 1: Open Images.Mod
Stap 2: Zoek de procedure Put
Stap 3: Ge zult daar nen assert zien staan als preconditie. Zet voor die preconditie nen IF met dezelfde voorwaarde als die assert. (Zorg wel dat die IF de gehele procedure omvat)
Stap 4: Compileer
Stap 5: Sluit Oberon af en start Oberon opniew op (da moet want anders gebruikt ie nooit uw nieuwe versie)
Normaal zou da uw probleem moeten oplossen.
Ge kunt ook gewoon dien ASSERT verwijderen dan é, da komt op hetzelfde neer.
Maar, die ASSERT staat er wss met een reden, dus het is redelijk dom om die gewoon weg te doen.
Posted: Wed Apr 02, 2008 10:06 pm
by Sebastiaan
racekakje wrote:PieterK wrote:Stap 1: Open Images.Mod
Stap 2: Zoek de procedure Put
Stap 3: Ge zult daar nen assert zien staan als preconditie. Zet voor die preconditie nen IF met dezelfde voorwaarde als die assert. (Zorg wel dat die IF de gehele procedure omvat)
Stap 4: Compileer
Stap 5: Sluit Oberon af en start Oberon opniew op (da moet want anders gebruikt ie nooit uw nieuwe versie)
Normaal zou da uw probleem moeten oplossen.
Ge kunt ook gewoon dien ASSERT verwijderen dan é, da komt op hetzelfde neer.
Maar, die ASSERT staat er wss met een reden, dus het is redelijk dom om die gewoon weg te doen.
Maja normaal hoort die ASSERT niet te trappen bij het tekenen van eender wat. en het maakt toch niets uit of die ASSERT nu trapt of als je die ASSERT weghaalt en het programma trapt even verder op. (In oberon toch).
Als je de ASSERT weghaalt heb je nog de kans dat hij dan helemaal niet trapt.