[C#] Arraylist verdwijnt

Pagina: 1
Acties:

  • Ruupje
  • Registratie: September 2005
  • Niet online
Hoi,

Ik moet voor mijn eindwerk een applicatie schrijven die wat data inleest van de seriële poort en die daarna verwerkt. Nu heb ik even een heel raar probleem. In mijn verwerkingsfunctie heb ik een ArrayList met de positie van elke sync byte uit de input array. Om zo te kunnen bepalen waar de pakketten precies zitten.

Nu als ik mijn code gewoon laat lopen krijg ik een "index out of bounds" exception. Het rare hierbij is dat ik bij mijn arraylist variabele dan de melding krijg:

"Cannot obtain value of local or argument '_syncpos' as it is not available at this instruction pointer, possibly because it has been optimized away." Hij laat die blijkbaar gewoon verdwijnen ofzo 8)7

Nuja als je kijkt naar de index waarde staat er ook 73 en mijn array heeft maar 72 posities dus de exception is wel juist, maar van waar haalt die de waarde 73 als de array waaruit die gehaald moet worden verdwenen is?

Screenshot staat hier: http://www.uitstoot.be/ruben/1.jpg

Het wordt nog vreemder, als ik nu daar een breakpoint zet, gaat alles gewoon goed, index waarde is 2 , zoals het moet zijn, en mijn arraylist is er gewoon nog.

Screenshot staat hier: http://www.uitstoot.be/ruben/2.jpg

Weet er iemand misschien hoe dit allemaal kan?

blinkycursor.net


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 17-11 21:53
Ruupje schreef op vrijdag 30 mei 2008 @ 11:31:

...

Nuja als je kijkt naar de index waarde staat er ook 73 en mijn array heeft maar 72 posities dus de exception is wel juist, maar van waar haalt die de waarde 73 als de array waaruit die gehaald moet worden verdwenen is?

Screenshot staat hier: http://www.uitstoot.be/ruben/1.jpg

Het wordt nog vreemder, als ik nu daar een breakpoint zet, gaat alles gewoon goed, index waarde is 2 , zoals het moet zijn, en mijn arraylist is er gewoon nog.

Screenshot staat hier: http://www.uitstoot.be/ruben/2.jpg

Weet er iemand misschien hoe dit allemaal kan?
Wat wil je hier nu mee zeggen? In het eerste geval is de array lengte 72 waar je positie 73 wil uitlezen. Dus ja, dat gaat fout. In het tweede geval gaat het goed omdat je index 2 en je input lengte 9....

stp - PSN ID: stp_4


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Zo te zien is je arraylist op dit moment een non-generic. Ik weet niet of het gaat helpen maar probeer is

C#:
1
ArrayList<Int32> syncpos = new ArrayList()<Int32>;


Dan heb je generics, hoef je niet meer zo lelijk te casten naar Ints (ik dacht dat dat vanzelf ging, automatich unboxing, en autoboxing) en op die manier is het wat moeilijker dat je Arraylist wordt weg geoptimaliseerd. Het is niet direct een antwoord op je vraag, maar wie weet kan het wel helpen. Zelf heb ik nog nooit zo'n optimalisatie melding gekregen, heb je toevallig je build of debug instellingen aangepast?

[ Voor 46% gewijzigd door roy-t op 30-05-2008 11:41 ]

~ Mijn prog blog!


  • Ruupje
  • Registratie: September 2005
  • Niet online
roy-t schreef op vrijdag 30 mei 2008 @ 11:41:
[...]


Zo te zien is je arraylist op dit moment een non-generic. Ik weet niet of het gaat helpen maar probeer is

C#:
1
ArrayList<Int32> syncpos = new ArrayList()<Int32>;


Dan heb je generics, hoef je niet meer zo lelijk te casten naar Ints (ik dacht dat dat vanzelf ging, automatich unboxing, en autoboxing) en op die manier is het wat moeilijker dat je Arraylist wordt weg geoptimaliseerd. Het is niet direct een antwoord op je vraag, maar wie weet kan het wel helpen. Zelf heb ik nog nooit zo'n optimalisatie melding gekregen, heb je toevallig je build of debug instellingen aangepast?
Dankje voor de tip rond die generics, dat wist ik nog niet. :*) Ja dat van die build instellingen dacht ik ook eerst, dus ben ik daar gaan kijken maar code optimalisatie staat gewoon af.

[ Voor 18% gewijzigd door Ruupje op 30-05-2008 12:01 ]

blinkycursor.net


  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Ik weet het niet zeker maar volgens mij gebeurd er het volgende:

De var_syncpos wordt weg geoptimaliseerd omdat je in de scope van de if alleen maar de count var gebruikt. Dus waarschijnlijk optimaliseert hij dat voor die scope naar een variabele welke de count waarde van _syncpos bevat.
Als syncpos namelijk echt leeg was dan had je een null pointer exception gekregen en geen index out of bounds exception.

Dat vervolgens die index out of bounds exception optreed is duidelijk. Je probeert index 73 op te halen terwijl er maar 72 in zitten (0 -- 72).

Edit: Voor de duidelijkheid, de optimalisatie is dus niet wat hier het probleem veroorzaakt.

[ Voor 7% gewijzigd door D-Raven op 30-05-2008 12:06 ]


Verwijderd

roy-t schreef op vrijdag 30 mei 2008 @ 11:41:
[...]


Zo te zien is je arraylist op dit moment een non-generic. Ik weet niet of het gaat helpen maar probeer is

C#:
1
ArrayList<Int32> syncpos = new ArrayList()<Int32>;


Dan heb je generics, hoef je niet meer zo lelijk te casten naar Ints (ik dacht dat dat vanzelf ging, automatich unboxing, en autoboxing) en op die manier is het wat moeilijker dat je Arraylist wordt weg geoptimaliseerd. Het is niet direct een antwoord op je vraag, maar wie weet kan het wel helpen. Zelf heb ik nog nooit zo'n optimalisatie melding gekregen, heb je toevallig je build of debug instellingen aangepast?
Volgens mij bedoel jij List<int> i.p.v. ArrayList<Int32>.

  • Ruupje
  • Registratie: September 2005
  • Niet online
Verwijderd schreef op vrijdag 30 mei 2008 @ 12:00:
[...]
Volgens mij bedoel jij List<int> i.p.v. ArrayList<Int32>.
Jep idd, maar dat had ik zelf ook even snel uitgevist. Moet nu even dringend naar school, zal straks even kijken naar wat Deathraven zei. Alvast heel erg bedankt!

blinkycursor.net


  • ProGo
  • Registratie: Januari 2000
  • Laatst online: 15:52
D-Raven schreef op vrijdag 30 mei 2008 @ 11:59:

Dat vervolgens die index out of bounds exception optreed is duidelijk. Je probeert index 73 op te halen terwijl er maar 72 in zitten (0 -- 72).
Dit moet 71 zijn.

  • Beretta1979
  • Registratie: Maart 2007
  • Laatst online: 12-11 00:18
Je zet daar een hele hoop casts, probeer dat te vermijden, dat is een anti pattern. Het gebruik van generics zal daarbij helpen.
Je error message is possibly, de compiler heeft die helemaal niet weg ge optimized je kunt de waarde niet zien omdat die exception is op getreden.

PSN: Beretta1979


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 01:08
Waar is dit allemaal voor nodig?
C#:
1
_syncpos[_syncpos.Count -1] + 2

Stel je array heeft 72 elementen, dan is het resultaat hiervan dus 73. Je probeert dus uit de array input een element te haen op positie 73, wat dus inhoudt dat deze array (minstens) 74 groot moet zijn, en een IndexOutOfBoundsException is het gevolg. Verder gebruik je de waarde van "index" niet, maar doe je gewoon 2x dezelfde code.
Het wordt nog vreemder, als ik nu daar een breakpoint zet, gaat alles gewoon goed, index waarde is 2 , zoals het moet zijn, en mijn arraylist is er gewoon nog.
Leuk dat index 2 is, maar je gebruikt 'm nergens. Heb je deze index niet toevallig nodig om een waarde uit de input-array te halen?

[ Voor 48% gewijzigd door sig69 op 30-05-2008 12:50 ]

Roomba E5 te koop


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Hij haalt uit _syncpos het laatste element (de integer) en bij deze waarde (dus niet de index) wordt twee opgeteld.

Het zou 74 zijn als _syncpos[_syncpos.Count -1 + 2] werdt gebruikt. Volgens mij krijgt hij dan ook niet de exception op _syncpos, maar op input, de byte array waarmee _syncpos wordt gevuld in de foreach loop. Echter _syncpos en input behoren even groot te zijn.

If it isn't broken, fix it until it is..


  • Beretta1979
  • Registratie: Maart 2007
  • Laatst online: 12-11 00:18
Niemand_Anders schreef op vrijdag 30 mei 2008 @ 13:17:
Hij haalt uit _syncpos het laatste element (de integer) en bij deze waarde (dus niet de index) wordt twee opgeteld.

Het zou 74 zijn als _syncpos[_syncpos.Count -1 + 2] werdt gebruikt. Volgens mij krijgt hij dan ook niet de exception op _syncpos, maar op input, de byte array waarmee _syncpos wordt gevuld in de foreach loop. Echter _syncpos en input behoren even groot te zijn.
Neen niet echt ... _syncpos bevat de indexen (binnen de index array) van alle bytes die gelijk aan 84 zijn (dat zijn de sync ? bytes)...
Die +2 geeft natuurlijk de exception aangezien dat als de laatste of voorlaatste byte in input gelijk is aan 84 je out of bounds gaat.

PSN: Beretta1979


  • Ruupje
  • Registratie: September 2005
  • Niet online
sig69 schreef op vrijdag 30 mei 2008 @ 12:44:
Waar is dit allemaal voor nodig?
C#:
1
_syncpos[_syncpos.Count -1] + 2

Stel je array heeft 72 elementen, dan is het resultaat hiervan dus 73. Je probeert dus uit de array input een element te haen op positie 73, wat dus inhoudt dat deze array (minstens) 74 groot moet zijn, en een IndexOutOfBoundsException is het gevolg. Verder gebruik je de waarde van "index" niet, maar doe je gewoon 2x dezelfde code.

[...]

Leuk dat index 2 is, maar je gebruikt 'm nergens. Heb je deze index niet toevallig nodig om een waarde uit de input-array te halen?
ja die index is gewoon om te testen, om de uitkomst van die bereking makkelijk te kunnen zien. Heb de (int)'s ondertussen weggedaan. Ok hij wordt dus niet weggegooid ofzo das al goed :) Nu nog even de fout oplossen :p
Beretta1979 schreef op vrijdag 30 mei 2008 @ 15:04:
[...]

Neen niet echt ... _syncpos bevat de indexen (binnen de index array) van alle bytes die gelijk aan 84 zijn (dat zijn de sync ? bytes)
Inderdaad

[ Voor 13% gewijzigd door Ruupje op 30-05-2008 18:55 ]

blinkycursor.net


  • Laurens-R
  • Registratie: December 2002
  • Laatst online: 29-12-2024
Je zet daar een hele hoop casts, probeer dat te vermijden, dat is een anti pattern.
Ehrm kan iemand mij uitleggen wat hiermee bedoeld wordt?

Ik zelf zat meer te denken aan de extra kosten vanwege conversie etc en gewoon de duidelijkheid van code...

maar wat is dus een antipattern?

edit: ben er zelf al achter. Juist het feit dat het onduidelijk is en dat het niet voldoet aan de OO princiepes maakt het een antipattern!

[ Voor 18% gewijzigd door Laurens-R op 31-05-2008 17:51 ]

Pagina: 1