Toon posts:

[AS3] Te lange array?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0Henk 'm!

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
Na mijn vorige vraag over ActionScript, kwam ik er achter dat ik het totaal niet begrepen heb. Toen nog AS nu ben ik bezig met AS3, omdat dit natuurlijk de toekomst is. Ik wil graag een app maken voor mijn iPod Touch/iPad. Daarom moet ik ook wel gebruik maken van AS3. Ik maak gebruik van Adobe Flash Professional CS5.5. Ik wil graag een programmatje maken, dat je als je galgje aan het spelen bent alle mogelijke oplossingen kan vinden. Zo'n app kan ook handig zijn bij het oplossen van puzzels.

Dan nu het probleem. Ik heb een array gemaakt met iets meer dan 170.000 woorden. Ik dacht wel dat dat kon, omdat ik op deze website zag http://help.adobe.com/nl_...3e3d118a9b90204-7ee1.html, dat de lengte van een array tussen de 0 en 4.294.967.295 moet zitten. Als ik een klein deel van de 170.000 woorden gebruik dan doet mijn app het wel (voor het deel dat ik af heb). Wil ik dan alles of de helft (geprobeerd het maximum te vinden), dan geeft een heleboel errors, hier zie je er een paar:
code:
1
2
3
4
5
6
7
8
9
10
VerifyError: Error #1107: The ABC data is corrupt, attempt to read out of bounds.
ReferenceError: Error #1065: Variable TextInput is not defined.
ReferenceError: Error #1065: Variable TextArea_upSkin is not defined.
ReferenceError: Error #1065: Variable TextArea_disabledSkin is not defined.
ReferenceError: Error #1065: Variable UIScrollBar is not defined.
ReferenceError: Error #1065: Variable Button is not defined.
ReferenceError: Error #1065: Variable Button_upSkin is not defined.
ReferenceError: Error #1065: Variable Button_selectedUpSkin is not defined.
.... ect ... ect ... ect ....
ReferenceError: Error #1065: Variable CellRenderer is not defined.


Die errors zie ik niet als ik veel minder woorden gebruik. Omdat het weinig zin heeft als ik maar een klein deel van de 170.000 woorden gebruik, vraag ik hier om een oplossing. Ook wil ik graag weten of, de grote hoeveelheid data een probleem kan zijn op een iPod Touch(3G)/iPad(1). Ik neem aan dat het laden van de woorden via een XML-bestand niet veel uitmaakt (of is dat verkeerd gedacht?) Heeft iemand ook al zo'n probleem gehad? Het ligt niet aan een trage computer, want me pc is net 3 weken oud (Intel core i7 + 8GB DDR3).

Als iemand de woordenlijst wil hebben stuur een pm. Omdat ik ervan uitga dat het niet aan de code erom heen ligt, heb ik niet de broncode toegevoegd. Als iemand de bron-code wil zien, zeg het ff.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01-06 19:49
Blijkbaar zitten er beperkingen aan de grootte van arrays die in ActionScript bytecode kunnen voorkomen. Grote kans dat de grens bij 65535 of 32767 elementen zit, maar dat is lastig te zeggen aangezien je dat niet volledig getest hebt.

Een makkelijke workaround is om je woordenlijst in aparte arrays te definiëren en die at runtime samen te voegen. Waarschijnlijk moet je die array sowieso op de een of andere manier indiceren om er een beetje vlot in te kunnen zoeken.

De limiet van 4294967295 die je noemt geldt waarschijnlijk alleen at runtime. Het concrete probleem ondervind je echter bij het laden van de interpreter bytecode; het kan best zijn dat daar een andere limiet voor geldt.

[Voor 19% gewijzigd door Soultaker op 13-06-2011 02:24]


  • apNia
  • Registratie: Juli 2002
  • Laatst online: 03-06 09:52

apNia

Schreeuwen en Nibbits eten!

Kan je een voorbeeldje posten van hoe je de array met woorden declareert? De errormelding lijkt niks te maken te hebben namelijk met stings oid.

Kans is ook aanwezig dat hij je iPhone emuleert, waar wellicht andere max lengtes zijn van de arrays.

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 00:24

Ventieldopje

I'm not your pal, mate!

Het lijkt me eerder een geheugen probleem aangezien hij daarna z'n references niet meer kan vinden en dus waarschijnlijk uit het geheugen zijn gedrukt. Dat zal zeker een probleem worden op een ipad/iphone/idevice/snip.

Waarom niet gewoon een XML parser los laten op een XML bestand of gewoon regel voor regel uit een tekst bestand laden?

we hoeven een merk niet belachelijk te maken ;)

[Voor 10% gewijzigd door BtM909 op 15-06-2011 19:02]

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:09

crisp

Devver

Pixelated

Ik vraag me ook af hoe je denkt op een performante manier te kunnen gaan zoeken in een array met 170.000 woorden. Deed me denken aan deze blogposts van John Resig: http://ejohn.org/blog/dictionary-lookups-in-javascript/ http://ejohn.org/blog/javascript-trie-performance-analysis/ http://ejohn.org/blog/revised-javascript-dictionary-search/

Wellicht interessant om eens door te lezen :)

Intentionally left blank


  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
Oke, ja ik kwam er niet helemaal uit met het laden van een XML bestand, maar regel voor regel laden uit een tekst bestand is wel een goed idee!

code:
1
2
var woorden:Array = new Array();
woorden = ["woord1","woord2","...."[s][/s],"woord170000"];


Bedankt voor de link, zal het zeker gaan lezen. Maar mijn programmatie, wordt een enkele zoek actie, dus dan maakt het niet uit als het een seconde of 2-5 duurt. Dit is nieuw voor mij zoveel gegevens die de code moet doorzoeken.

Ik kom er niet echt uit met het laden van een .txt-file. De meeste voorbeelden gaan ze op het eerst frame naar actions. Maar ik heb een apart .as-file, ik neem aan dat dat ook mogelijk is?

Ik heb nu dit:
code:
1
2
3
4
var textLoader:URLLoader = new URLLoader();
var textReq:URLRequest = new URLRequest("woorden.txt");
textLoader.load(textReq);
trace(textLoader.data);


Maar de trace() zegt dan "undefined", dat wil zeggen dat de variabele niet gedeclareerd is (toch?), maar hoe moet ik dit dan aanpassen? Alvast bedankt voor een reactie!

[Voor 71% gewijzigd door martijn2008 op 13-06-2011 13:18]


  • Alfredo
  • Registratie: Maart 2007
  • Laatst online: 18-04 20:09
Kan je anders eens proberen de code te compileren met de Flex compiler (uit Flash Builder bijvoorbeeld)? Over het algemeen heb ik daar betere ervaringen mee dan die van Flash Professional. Of stuur me de broncode even, dan test ik het voor je uit.
Maar de trace() zegt dan "undefined", dat wil zeggen dat de variabele niet gedeclareerd is (toch?), maar hoe moet ik dit dan aanpassen? Alvast bedankt voor een reactie!
Je krijgt "undefined" als resultaat terug omdat de data nog niet is ingeladen. Daarvoor moet je eerst naar het Event.COMPLETE event luisteren.

JavaScript:
1
2
3
4
5
6
7
8
9
var textLoader:URLLoader = new URLLoader();
var textReq:URLRequest = new URLRequest("woorden.txt");
textLoader.addEventListener(Event.COMPLETE, textLoadedHandler);
textLoader.load(textReq);

function textLoadedHandler(event:Event):void
{
    trace(event.target.data);
}

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
Het werkt hartstikke bedankt, kan ik weer verder. Alleen eigenlijk toch nog 1 probleempje als ik de .ipa op mijn iPod Touch 3G wil zetten dan zegt iTunes dat het niet geschikt is. Zijn er ook nog goede emulators waarmee ik de .ipa kan testen op een meer iDevice-achtige manier. Nogmaals bedankt :D

Wat ik nog wel gek vindt is dat dit nu werkt, maar zo hoort het toch niet?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package 
{
    import fl.controls.*;
    import fl.events.ListEvent;
    import flash.display.*;
    import flash.events.*;
    import flash.text.*;
    import flash.utils.*;
    import fl.transitions.*;
    import flash.net.*;
    import flash.xml.*;
    import flash.filters.*;

    public class WoordZoeker extends Sprite
    {
        var myList:List;
        var woorden:Array = new Array();

        public function WoordZoeker()
        {
            myList = new List();
            myList.move(0,25);
            myList.rowCount = 4;
            myList.setSize(320, 455);
            var invoer:String;
            
            var textLoader:URLLoader = new URLLoader();
            var textReq:URLRequest = new URLRequest("woorden.txt");
            textLoader.addEventListener(Event.COMPLETE, textLoadedHandler);
            textLoader.load(textReq);
            function textLoadedHandler(event:Event):void
            {
                var textBestand:String = event.target.data;
                woorden = textBestand.split(",");

            // geeft alle woorden weer
            var i:int = 0;
            for (i=0; i<woorden.length; i++)
            {
                myList.addItem( { label:woorden[i] } );
            }
            addChild(myList);// einde weergeven

            Zoek.addEventListener(MouseEvent.CLICK, actie);
            // checken op het indrukken van knop;
        }
        }
        //de button ZOEK
        function actie(e:MouseEvent):void
        {
            myList.removeAll();
            myList.addItem( { label:"je hebt geklikt" } );
            var invoer:String;
            invoer = input.text;
            myList.addItem( { label:invoer } );
        }

    }
}

Ik vind de plaats van de "function textLoadedHandler(event:Event):void" gek, vinden jullie dat ook?

[Voor 73% gewijzigd door martijn2008 op 14-06-2011 20:43]


  • Caelorum
  • Registratie: April 2005
  • Laatst online: 01:20
martijn2008 schreef op dinsdag 14 juni 2011 @ 20:37:
Ik vind de plaats van de "function textLoadedHandler(event:Event):void" gek, vinden jullie dat ook?
Jup, ik vind het zelfs vreemd dat het werkt mja. Lekker functies uit functies laten, dan zal het ook wel werken en ziet het er beter uit.

  • Alfredo
  • Registratie: Maart 2007
  • Laatst online: 18-04 20:09
Door functies te nesten, limiteer je de scope van die functie tot zijn parent. In dit geval gaat dat, je koppelt de listener aan het event in dezelfde functie. Maar omdat je het eigenlijk niet nodig hebt, zou ik dat ook niet doen. Zet hem er dus gewoon buiten.
En vergeet niet je event listeners terug te verwijderen als je ze niet meer nodig hebt (removeEventListener() method).

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 16-05 22:53
martijn2008 schreef op dinsdag 14 juni 2011 @ 20:37:
Wat ik nog wel gek vindt is dat dit nu werkt, maar zo hoort het toch niet?
[...]
Ik vind de plaats van de "function textLoadedHandler(event:Event):void" gek, vinden jullie dat ook?
Ja, zo hoort het niet. Maar: nee, het is niet zo gek. ActionScript is een variant van ECMAScript, waar functies 'first class citizens' zijn. Functies zijn gewoon waardes van het type 'Function' die aan een variable toegekend kunnen worden. Koppel dat aan de function/variable hoisting in deze familie talen en wat er eigenlijk staat (d.w.z. hoe het onder de kap verwerkt wordt) is:

Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
public function WoordZoeker
{
  var textLoadedHandler:Function = function(event:Event){
   /* ... */
  }

  /* ... */

  textLoader.addEventListener(Event.COMPLETE, textLoadedHandler);  
}


Overigens moet je er ook voor zorgen dat je het ErrorEvent.IOERROR afhandelt. Doe je dat niet dan krijgt iedereen die een debug Flash Player geinstalleerd heeft en van je applet weg navigeert terwijl de loader nog met een request bezig is, een crash dialog met stack trace te zien met alle gevolgen vandien. In het bijzonder in Firefox wil daarmee nog wel eens de hele browser locken dankzij de afschuwelijk geprogrammeerde plugin code aan de kant van Adobe.
Alfredo schreef op woensdag 15 juni 2011 @ 00:06:
En vergeet niet je event listeners terug te verwijderen als je ze niet meer nodig hebt (removeEventListener() method).
Het is in de regel beter om er een gewoonte van te maken listeners met een weak reference toe te voegen. Je hoeft dan niet expliciet bij te houden welke listeners achteraf nog verwijderd moeten worden om een geheugenlek te voorkomen.

In dit specifieke geval moet je echter wel even op letten dat er een referentie naar de URLLoader blijft bestaan, zodat de loader niet door de garbage collector opgeruimd kan worden terwijl het request nog lopende is. Als ik me goed herinner waren er nl. bepaalde Flash runtime versies waar dit probleem speelt.

Je zou hier dus een strong reference kunnen gebruiken en later de event listener met de hand verwijderen of je zou een referentie naar de loader vast kunnen houden als private field v/d class.

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
Ik weet niet of het handig is om nu in dit topic verder te gaan, maar ik krijg het ipa-bestand niet op mijn iPod Touch 3G in ieder geval niet via iTunes. Kan dit komen doordat ik niet zelf een account heb bij het Apple Developpers Center? Heeft iemand anders hier ook problemen mee gehad?
Ik krijg deze melding:
code:
1
2
De App WoordenZoeker is niet op de iPod iMartijn geïnstaleerd, 
omdat de app niet compatibel is met deze iPod.

[Voor 20% gewijzigd door martijn2008 op 25-06-2011 14:30]


  • Dipsausje
  • Registratie: Februari 2006
  • Niet online
martijn2008 schreef op zaterdag 25 juni 2011 @ 14:26:
Ik weet niet of het handig is om nu in dit topic verder te gaan, maar ik krijg het ipa-bestand niet op mijn iPod Touch 3G in ieder geval niet via iTunes. Kan dit komen doordat ik niet zelf een account heb bij het Apple Developpers Center? Heeft iemand anders hier ook problemen mee gehad?
Ik krijg deze melding:
code:
1
2
De App WoordenZoeker is niet op de iPod iMartijn geïnstaleerd, 
omdat de app niet compatibel is met deze iPod.
Ja je moet een app die niet in de AppStore staat volgens mij apart signen voor je iDevice, en daar heb je inderdaad een iOs dev-account voor nodig, de gratis Apple dev-account is volgens mij onvoldoende.

offtopic:
De flash debug player moet Adobe sowieso eens goed gaan debuggen, normaal internetten is er niet bij als je die geinstalleerd hebt...

Acties:
  • 0Henk 'm!

  • martijn2008
  • Registratie: December 2009
  • Laatst online: 21-08-2022
Oke, want ik had van internet een .p12-bestand en een .mobileprovision-bestand gedownload, om het .ipa-bestand te kunnen maken. Dus dan ga ik nu opzoek hoe je zo'n app kan signen, bedankt. Ik vind 100$ gewoon echt te veel als hobby, wat voorlopig ook maar 1-mailig is. Beetje jammer dat Apple er zo mee omgaat, ik snap wel dat als je een app in de store wilt laten plaatsen, dat dat voor hun geld kost (controleren, administratie, hosten, ect). Ik heb deze stappen gevolgd: http://ipodtoucher55.blog...ne-apps-in-flash-cs5.html ,dus dan zou de app toch gesigned moeten zijn?

[Voor 56% gewijzigd door martijn2008 op 26-06-2011 14:47]

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee