AppleScript bug? Integer wordt op minimale waarde gezet

Ik loop tegen een AppleScript Studio-probleem op waar ik niet uitkom: op de één of andere manier wordt de waarde van een integer soms opeens op -2147483648 gezet — d.w.z. de minimale waarde die een integer kan hebben. Het gekke is dat dit op totaal onvoorspelbare momenten gebeurt: als ik meerdere keren precies dezelfde handelingen uitvoer,komt het de ene keer wel voor en de andere niet. Nog gekker is dat het zo te zien ook nog eens optreedt in functies die de waarde van de betreffende variabele(n) helemaal niet aanpassen, maar alleen uitlezen.

Als ik het nu nog eens probeer krijg ik ineens ook regelmatig de foutmelding: “-4.294967284E+9 kan niet in type integer worden omgezet. (-1700)”.

Dit gebeurt in een programma dat onder Tiger keurig werkte, maar sinds Leopard dit probleemgedrag vertoont, zonder dat er iets aan de betreffende code veranderd is. Ik krijg dus het vermoeden dat er iets mis is aan de AppleScript-interpreter in Leopard, maar kan daarover niks terugvinden op het Internet … Wat meer testen van precies hetzelfde programma onder Tiger levert tot nu toe op dat de fout daar inderdaad helemaal niet tevoorschijn lijkt te komen.

Weet iemand waar dit aan zou kunnen liggen, en hoe het op te lossen is?

Misschien is dit het proberen waard.

Sla de integer op als een string en wanneer je de integer weer nodig bent het dan pas om te zetten naar een integer. Ben benieuwd wat er dan gebeurt. Mocht het probleem zijn verholpen dan betekend dit daadwerkelijk dat er een fout in applescript blijkt te zitten. mocht je voortijdig een foutmelding krijgen betekend dit dat er ergens in je code toch een fout zit. Je zal namelijk zien dat er een foutmelding komt dat de string niet in het juiste type kan worden omgezet. Dat het op een willekeurige plek gebeurt kan het zijn dat je misschien de ‘on idle’ handler hebt geactiveerd en het hier op fout gaat. Maar heb je code niet gezien dus altijd lastig om te bepalen wat het kan zijn.

[quote:b939546bee="dj bazzie wazzie"]Sla de integer op als een string en wanneer je de integer weer nodig bent het dan pas om te zetten naar een integer. Ben benieuwd wat er dan gebeurt.[/quote:b939546bee] Ik moet erbij vermelden dat ik hierboven zowel onvolledig was als een foutje gemaakt heb :) De integers staan in een data source waar een outline view aan gekoppeld is; de functie waar het volgens mij in fout gaat, neemt waarden uit die data source, zet ze in variabelen, rekent daar wat mee, en zet dan in andere "velden" de uitkomst neer, zodat ze in de outline view komen te staan. Elk van de betrokken integers worden onder Leopard schijnbaar willekeurig eens in de zoveel tijd op -2147483648 gezet, maar met Tiger werkt alles gewoon zoals het hoort — dat heb ik expres nog even gecontroleerd een paar dagen geleden. (Nou ja, d.w.z. dat ik veel langer geprobeerd heb de fout voor te laten komen dan het kost onder Leopard, zonder dat ik de fout ook echt gezien heb.) Als ik de variabelen naar het log laat schrijven (onder Leopard) zie ik dezelfde waarden als in de outline view — dus mijn conclusie is dat het niet aan de control ligt die de waarden verhaspelt.

Maar die integer -> string -> integer methode ga ik inderdaad eens proberen, je weet maar nooit.

[quote:b939546bee=“dj bazzie wazzie”]Dat het op een willekeurige plek gebeurt kan het zijn dat je misschien de ‘on idle’ handler hebt geactiveerd en het hier op fout gaat.[/quote:b939546bee]
Die zit helemaal niet in het programma, dus daar zal het niet aan liggen :slight_smile:

[quote:b939546bee=“dj bazzie wazzie”]Maar heb je code niet gezien dus altijd lastig om te bepalen wat het kan zijn.[/quote:b939546bee]
Klik

Goed, ik heb het nu dus geprobeerd met de integer -> string -> integer methode, maar dat helpt niet … Met constructies als dit: [code:1:2fbe36e896]set numbersBonus to numbersBonus + ((((contents of data cell "NumbersBonus" of currentOption) as integer) as string) as integer)[/code:1:2fbe36e896] gaat het op precies dezelfde manier fout.

Maar als ik dit doe:

[code:1:2fbe36e896]set numbersBonus to numbersBonus + (contents of data cell “NumbersBonus” of currentOption) as integer as string as integer[/code:1:2fbe36e896]
dus zonder de meeste haakjes uit de vorige poging, verdwijnen de verkeerde getallen, maar krijg ik zo te zien in plaats daarvan de melding [i:2fbe36e896]"" kan niet in type number worden omgezet. (-1700)[/i:2fbe36e896].

Het wordt alleen nog gekker nu ik die constructie weer weggedaan heb en dus heb waarmee ik begon, namelijk:

[code:1:2fbe36e896]set numbersBonus to numbersBonus + (contents of data cell “NumbersBonus” of currentOption) as integer[/code:1:2fbe36e896]
blijf ik toch de [i:2fbe36e896]"" kan niet in type number worden omgezet. (-1700)[/i:2fbe36e896] foutmelding krijgen, in plaats van -2147483648 in het programma te zien… Als iemand er nog iets van snapt, zeg het dan a.u.b. :?

Door de waarden in het log weg te laten schrijven ben ik erachter dat dit alleen gebeurt wanneer één van de velden in de data source op 0 staat, maar wederom doet hij dit lang niet elke keer: bij precies dezelfde handelingen gebeurt het dan weer wel, en dan weer een aantal keer niet.

Ik zie u pas dat mijn vorige reply niet is doorgevoerd. Als je je programma runt met de objectalloc lijkt alles te werken. Soms krijg je een foutieve waarde in de velden maar herstelt zich weer zonder problemen

Een probleem dat ik vermoed maar niet zeker weet is dat het lijkt alsof er een thread draait bij het updaten. Wat er dus gebeurt is de oude waarde wordt weggegooit een een nieuwe er in geplaatst. Op dit moment draait de tweede thread. Deze kan op dat zelfde moment niet de waarde uitlezen.

Ik weet ook niet welke handlers je gebruikt maar als je outline view handlers gebruikt zou ik deze even loggen aan het begin en aan het eind zoals hieronder

[code:1:51cba96b71]on child of item theObject
log "Child of item starting…"
<<alle code uitvoeren>>
log "child of item done…"
end child of item[/code:1:51cba96b71]

Nu moet je in je log kijken of bepaalde handlers door elkaar draaien en misschien deze elkaar in de weg kunnen zitten.

Als dit het probleem is zul je moeten kiezen voor andere handlers of moet je je code wijzigen. Zit hier niet de fout dan kan je misschien wel stellen dat er een bug in de outline view zit voor applescript.

[quote:a5a739230f="Jakko Westerbeke"].

Het wordt alleen nog gekker nu ik die constructie weer weggedaan heb en dus heb waarmee ik begon, namelijk:

[code:1:a5a739230f]set numbersBonus to numbersBonus + (contents of data cell “NumbersBonus” of currentOption) as integer[/code:1:a5a739230f]
blijf ik toch de [i:a5a739230f]"" kan niet in type number worden omgezet. (-1700)[/i:a5a739230f] foutmelding krijgen, in plaats van -2147483648 in het programma te zien… Als iemand er nog iets van snapt, zeg het dan a.u.b. :?[/quote:a5a739230f]

Dit lijkt op een property fout. Wanneer je ‘clean all’ doet van je project zou ej hem even weer moeten draaien en kijken of dan de foutmelding weer als vanouds is.

[quote:6798e52620="dj bazzie wazzie"]Als je je programma runt met de objectalloc lijkt alles te werken.[/quote:6798e52620] Dan is mijn vraag: wat is de objectalloc, en hoe gebruik ik dat?

[quote:6798e52620=“dj bazzie wazzie”]Een probleem dat ik vermoed maar niet zeker weet is dat het lijkt alsof er een thread draait bij het updaten.[/quote:6798e52620]
Als dat het geval is heb ik dat in elk geval niet bewust erin geprogrammeerd …

[quote:6798e52620=“dj bazzie wazzie”]Ik weet ook niet welke handlers je gebruikt maar als je outline view handlers gebruikt zou ik deze even loggen aan het begin en aan het eind zoals hieronder[/quote:6798e52620]
Het probleem doet zich alleen niet voor bij het klikken op de outline view, maar bij gebruik van andere controls (text fields en steppers) die de waarde van items in de outline view veranderen. Maar misschien zit hier wel iets in … de stepper en text field synchroniseren elkaar, waarna de data source bijgewerkt wordt met de nieuwe waarde. Wat als die nu allebei elkaar updaten nadat er alleen op de stepper geklikt is, omdat het programma vindt dat de waarde in de text field veranderd is, en er daardoor soms iets door elkaar loopt?

wat proberen later

Nee, daar zit de fout ook niet in. Als ik alleen de stepper wat laat doen, krijg ik nog dezelfde fout.

[quote:6798e52620=“dj bazzie wazzie”]Zit hier niet de fout dan kan je misschien wel stellen dat er een bug in de outline view zit voor applescript.[/quote:6798e52620]
Ik neig toch sterk naar die uitleg, aangezien ik nog altijd geloof dat dit zich alleen onder Leopard voordoet … Een versie van het programma die het perfect deed voordat ik Leopard installeerde, geeft nu deze fouten; als ik exact hetzelfde programma kopieer naar een computer waar Tiger op draait, krijg ik ook geen fouten …

[quote:6798e52620=“dj bazzie wazzie”]Dit lijkt op een property fout. Wanneer je ‘clean all’ doet van je project zou ej hem even weer moeten draaien en kijken of dan de foutmelding weer als vanouds is.[/quote:6798e52620]
Nee, nog altijd de melding over de lege string, i.p.v. grote negatieve getallen.

[quote:b2ffaf65c4="Jakko Westerbeke"] Dan is mijn vraag: wat is de objectalloc, en hoe gebruik ik dat? [/quote:b2ffaf65c4] Deze staat in je developer map

[quote:b2ffaf65c4=“Jakko Westerbeke”]
Als dat het geval is heb ik dat in elk geval niet bewust erin geprogrammeerd …
Het probleem doet zich alleen niet voor bij het klikken op de outline view, maar bij gebruik van andere controls (text fields en steppers) die de waarde van items in de outline view veranderen. Maar misschien zit hier wel iets in … de stepper en text field synchroniseren elkaar, waarna de data source bijgewerkt wordt met de nieuwe waarde. Wat als die nu allebei elkaar updaten nadat er alleen op de stepper geklikt is, omdat het programma vindt dat de waarde in de text field veranderd is, en er daardoor soms iets door elkaar loopt?[/quote:b2ffaf65c4]

Wat ik hiermee bedoelde (heb ik ook wel eens gehad) dat je bijvoorbeeld bij een data item uitleest terwijl je die in een andere handler bijvoorbeeld leeggooid.

Te denken aan wanneer je een append zou gebruiken om gegevens in de outlineview te gooien. Bij het updaten van je outline view gaat het dan fout:
1 Eerst moet je de data source leeg gooien.
2 Dan gooi je de nieuwe gegevens in de data source
Bij stap 1 en 2 worden outline handlers aangeroepen wanneer je deze hebt aangevinkt in je interface builder. Maar bij stap 1 is de datasource leeg en kunnen er zich fouten voordoen. In het begin van mijn programmeren met applescritp gooide ik de hele datasource weg maar dan krijg je ook problemen in verband met de NSImageCell in je outline view.

Voor dat ik hier verder op inga moet ik wel weten hoe het precies werkt anders kan ik je geen plossing geven.

Sorry had nog steeds niet gezien dat je source code ook kon downloaden op je pagina... nu verdiep ik mij er even gelijk in :)

Wat ik als eerste even zou veranderen is dat het handiger is om misschien addUnitToCompany in een thread te maken. Nu is het met applescript eigenlijk niet mogelijk om dit te doen maar er zijn truukjes voor. je bent een controller nodig met een task manager en een wachtrij. Deze controller bepaald wanneer de thread wordt uitgevoerd terwijl de gebruiker net als nu 20 keer vooruit kan klikken en je programma loopt er achteraan.

Een simpelere oplossing is gewoon aan het begin van addUnitToCompany de add butten te disablen en aan het eind van deze functie weer te enablen. Nadeel is dat de gebruiker moet wachten totdat de unit is toegevoegd voordat hij een volgende kan toevoegen.

kortom:

[code:1:ac13585efb]on addUnitToCompany()
set enabled of button "add" of window "main" to false
… all je code hier tussen…
set enabled of button "add" of window "main" to true
end addUnitToCompany[/code:1:ac13585efb]

[quote:dc796233fe="dj bazzie wazzie"]Wat ik als eerste even zou veranderen is dat het handiger is om misschien addUnitToCompany in een thread te maken.[/quote:dc796233fe] Leuk, maar zo gevorderd ben ik absoluut niet in deze programmeeronzin ;) Om eerlijk te zijn zit ik serieus te denken aan de hele code eruit te mikken en te vervangen door Python, want de beperkingen van AppleScript Studio voor grotere programma's ben ik een beetje beu aan het raken. De twee grote problemen daarmee zijn alleen dat ik dan eerst PyObjC onder de knie zal moeten krijgen (dus een introductie voor Xcode 3 zou leuk zijn — ik kan er alleen voor 2 vinden en daarin gebeurendingen die niet meer lijken te kunnen … ), en dat ik daarna ook nog eens helemaal van voren af aan moet beginnen :(

[quote:dc796233fe=“dj bazzie wazzie”]Een simpelere oplossing is gewoon aan het begin van addUnitToCompany de add butten te disablen en aan het eind van deze functie weer te enablen.[/quote:dc796233fe]
Best kans dat ik dat er ook aan toevoeg.

[quote:a1a7ee8c24="Jakko Westerbeke"]Om eerlijk te zijn zit ik serieus te denken aan de hele code eruit te mikken en te vervangen door Python, want de beperkingen van AppleScript Studio voor grotere programma's ben ik een beetje beu aan het raken.[/quote:a1a7ee8c24]

No offence maar ten eerste ligt het niet per se aan applescript studio en ten tweede is dit geen groot programma. Kortom je programma kan lekker draaien en ook nog eens velen malen sneller als je zou willen. Zoals in elke script- of programmeertaal kom je dingen tegen die soms net even anders moeten dan in de standaard library/framework en zal ej dan zelf moeten programmeren.

Als je toch overstapt naar een andere taal waarom dan niet objective-c ge combineerd met applescript en kan je zo langzamerhand je programma steed meer objective-c code aan toevoegen.

[quote:74399e1cf5="dj bazzie wazzie"]No offence maar ten eerste ligt het niet per se aan applescript studio en ten tweede is dit geen groot programma.[/quote:74399e1cf5] Weet ik, maar het draaide op m'n oude iMac G5 eigenlijk net maar acceptabel snel (vond ik), wat volgens mij vooral door AppleScript komt, want mijn ervaring is dat zodra de functies wat langer worden en/of er wat lusjes in zitten, die taal nogal langzaam wordt. Plus die ellendige constructies om dingen aan te spreken ([i:74399e1cf5]tell a of b of c of d of e of f to …[/i:74399e1cf5] enz.), foutmeldingen waar je niks wijzer van wordt, rottige beperkingen waar ik elke keer tegenaanloop, enzovoorts …

[quote:74399e1cf5=“dj bazzie wazzie”]je programma kan lekker draaien en ook nog eens velen malen sneller als je zou willen.[/quote:74399e1cf5]
Als je veel meer van AppleScript weet dan ik waarschijnlijk wel, maar voordat we daar zijn …

[quote:74399e1cf5=“dj bazzie wazzie”]Als je toch overstapt naar een andere taal waarom dan niet objective-c ge combineerd met applescript en kan je zo langzamerhand je programma steed meer objective-c code aan toevoegen.[/quote:74399e1cf5]
Vooral omdat ik wel enigszins bekend ben met Python maar helemaal niet met welk C-dialect dan ook (ik kan ze een beetje lezen, maar dat is het ook wel).

Maar eigenlijk ben ik de hele zooi beu :frowning: Omdat ik er al langere tijd niet uitkom (alle goede hulp ten spijt) heb ik er eigenlijk gewoon geen zin meer in … Ik zie op tegen fout oplossen die niet fout zouden moeten zijn (want ik blijf erbij dat het onder Tiger wel goed werkt(e)), maar ik zie ook op tegen helemaal opnieuw beginnen. Hoewel er grote kans is dat dat alles ook aan het kloteweer van de laatste tijd kan liggen.

Ik kan er wel in komen hoor. Het is soms frustrerend hoe het soms loopt. Het is gewoon nadeel idd dat applescript niet in iedere systeemversie hetzelfde is. Zo heb ik alle software moeten updaten van naar mac os x 10.2 en elke versie daarna omhoog. Maar ik heb geen keuze om het anders te doen omdat ik voor mijn werk het in applescript klaar moet krijgen omdat er nog geen betere script taal is om bijvoorbeeld quarkXPress te automatiseren. Dus wordt je er in de loop der jaren steeds handiger mee waardoor je programma's stabieler wordt.

De tell blokken zijn idd soms verwarrend omdat er soms snelheid verschil in kan zitten. Soms moet je uit een tell blok stappen om code uit te voeren en weer een aparte functie van maken om snelheid te behouden. Ook wordt applescript trager bij iedere ‘else if’ die je toevoegd aan een if blok waardoor je de code moet gaan opsplitsen in meerder script bestanden zodat de de hoeveelheid if statements drastisch worden verlaagd. Ook maak ik het liefst veelvuldig gebruik van command line utilities en voeg ik deze samen met mijn project zodat de output van deze utilities op ieder systeem hetzelfde is. Om bijvoorbeeld een CSV bestand in een datasource te plakken heb ik daar een command line utility geschreven in C die een output geeft die ik direct kan appenden aan mijn datasource waardoor ik bestanden in een oogwenk in mijn tableview heb staan ook al zijn het meer dan 1000 records. Ook het uilezen van eigen preferences e.d. heb ik CM tools voor geschreven om tijd te besparen met applescript. En uiteraard de threading die ik heb schrijf voor applescript met een threading manager zoals het updaten van een table view, autosave of een voortgangs balk te hebben met een annuleer knop. Wanneer een gebruiker zo snel klikt dat er 2 keer of vaker dezelfde thread gedraaid moet worden negeer ik deze omdat het commando toch al in de wachtrij staat en voorkom ik dat mijn applescript vastloopt.

Goed dit zijn een paar dingen waar ik rekening mee hou om (grotere) applescript applicaties snel en stabiel te laten draaien.

Goed ik wist niet dat je bekend was met python maar als je van allebei niets of evenveel af wist zou ik objective-c gebruiken maar als python bekend is zou ik ook voor python zijn gegaan.