Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.Net] Errore
Forum - C# / VB.NET - [VB.Net] Errore "Index was out of range"

Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 19:21
Martedì, 07/08/2012
Ciao a tutti, stò creando una nuova versione del programma Animage, l'ho quasi terminata però mi sono bloccato qui: ho una funzione che "non funziona" :asd:, questa funzione si occupa del caricamento di un progetto nel programma, però dà un errore, cioè
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

La funzione è questa:
Codice sorgente - presumibilmente VB.NET

  1. Function carica(ByVal url As String)
  2. Dim stream As String
  3. Dim no, u, l, d, s, tmp As New List(Of String)
  4. Dim ret As New List(Of oggetto)
  5. Dim segmenti As New List(Of segmento)
  6. stream = New IO.StreamReader(url).ReadToEnd 'importa il file selezionato
  7. tmp.AddRange(stream.Split("|")) 'lo divide in più frammenti e li inserisce in tmp
  8. For n = 0 To tmp.Count - 2 Step 4
  9. no.Add(tmp.Item(n))
  10. u.Add(tmp.Item(n + 1))
  11. d.Add(tmp.Item(n + 2))
  12. l.Add(tmp.Item(n + 3))
  13. s.Add(tmp.Item(n + 4))
  14. Next
  15. For n = 0 To no.Count - 1
  16. If Not s.Item(n) = Nothing Then
  17. segmenti.Clear()
  18. tmp.Clear()
  19. tmp.AddRange(s.Item(n).Split("-")) 'divide la stringa numero n della lista segmenti e inserisce i frammenti in tmp
  20. For o = 0 To tmp.Count - 1
  21. If Not tmp.Item(o) = "" Then
  22. segmenti.Add(New segmento(New Point(tmp.Item(o).Split("+")(0).Split("*")(0), tmp.Item(o).Split("+")(0).Split("*")(1)), New Point(tmp.Item(o).Split("+")(1).Split("*")(0), tmp.Item(o).Split("+")(1).Split("*")(1)))) 'genera i segmenti di un determinato oggetto e li inserisce in segmenti
  23. End If
  24. Next
  25. End If
  26. ret.Add(New oggetto(no.Item(n), u.Item(n), New Size(d.Item(n).Split("*")(0), d.Item(n).Split("*")(1)), l.Item(n), segmenti)) 'ricostruisce l'oggetto da inserire nella lista e lo inserisce
  27. Next
  28. Return ret
  29. End Function


Queste sono le strutture Oggetto e Segmento:
Codice sorgente - presumibilmente VB.NET

  1. Public Structure oggetto
  2. Dim nome, url As String
  3. Dim dimensione As Size
  4. Dim livello As Integer
  5. Dim segmenti As List(Of segmento)
  6. Sub New(ByVal n As String, ByVal u As String, ByVal d As Size, ByVal l As Integer, ByVal s As List(Of segmento))
  7. nome = n
  8. url = u
  9. dimensione = d
  10. livello = l
  11. segmenti = s
  12. End Sub
  13. End Structure
  14. Structure segmento
  15. Dim inizio, fine As Point
  16. Sub New(ByVal i As Point, ByVal f As Point)
  17. inizio = i
  18. fine = f
  19. End Sub
  20. End Structure


Il problema si presenta se apro il seguente file:
"sfondo|C:\foto1.jpg|800*600|0|400*279+397*281-397*281+400*282-400*282+399*279-399*279+391*278-391*278+396*281-|logo|D:\Documents and Settings\PC\Desktop\C:\foto2.jpg|150*150|1|193*214+420*85-420*85+573*355-573*355+371*466-371*466+181*291-|"
Ora vi farò una breve descrizione della struttura del file per farvi capire meglio cosa significano tutte queste stringhe separate dal carattere |.
Il file è strutturato nel seguente modo:
1. Nome dell'oggetto     'Serve per identificare un oggetto preciso fra molti altri oggetti
2. Indirizzo dell'immagine     'non credo ci sia bisogno di spiegazioni :)
3. Dimensioni oggetto     'sono le dimensioni dell'oggetto, larghezza e altezza sono separate da un *
4. Segmenti     'Un segmento è formato da 2 punti, quindi 4 cifre, le coordinate di un punto vengono separate da un *, i punti di un segmento da un + e i segmenti da un -
Queste stringhe vengono divise da un |.

P.S. Scusate per la lunghezza di questo post, ho cercato di essere il più chiaro possibile.


A gent fann tant e' signur, e ppo s' fottn e mllun! (www.youtube.com/watch?v=N6xUYGo0Log)
PM Quote
Avatar
Ultimo (Member)
Expert


Messaggi: 513
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 19:55
Martedì, 07/08/2012
Codice sorgente - presumibilmente VB.NET

  1. For n = 0 To tmp.Count - 2 Step 4
  2. no.Add(tmp.Item(n))
  3. u.Add(tmp.Item(n + 1))
  4. d.Add(tmp.Item(n + 2))
  5. l.Add(tmp.Item(n + 3))
  6. s.Add(tmp.Item(n + 4))
  7. Next



è probabile che superi l'indice della lista tmp :yup:


Ultimo (Hai voluto la bicicletta ? ....)

Studiare LINQ, WPF, ASP.NET MVC, Entity Framwork, C#, Blend, XAML, Javascript, HTML5, CSS .....(tanta roba)

https://www.dropbox.com/s/c2aots5x4urgbhf/setup_game_sudoku ...
PM Quote
Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 20:44
Martedì, 07/08/2012
Testo quotato

Postato originariamente da Ultimo:
...
è probabile che superi l'indice della lista tmp :yup:


Grazie della risposta, ora ho provato con
Codice sorgente - presumibilmente VB.NET

  1. For n = 0 To tmp.Count - 4 Step 4
  2. no.Add(tmp.Item(n))
  3. u.Add(tmp.Item(n + 1))
  4. d.Add(tmp.Item(n + 2))
  5. l.Add(tmp.Item(n + 3))
  6. s.Add(tmp.Item(n + 4))
  7. Next



e questo codice non presenta più problemi, ho risolto anche un altro problema, indatti con il codice precedente se aprivo il file:
Nome|C:\img.png|214*220|1|132*292+256*33-256*33+352*307-352*307+404*68-404*68+460*332-|
Il codice non presenta alcun errore, se invece aprivo il file precedente, avveniva il seguente errore alla riga 22.
Index was outside the bounds of the array.

Allora ho modificato:
Codice sorgente - presumibilmente VB.NET

  1. For o = 0 To tmp.Count - 1
  2. If Not tmp.Item(o) = "" Then
  3. segmenti.Add(New segmento(New Point(tmp.Item(o).Split("+")(0).Split("*")(0), tmp.Item(o).Split("+")(0).Split("*")(1)), New Point(tmp.Item(o).Split("+")(1).Split("*")(0), tmp.Item(o).Split("+")(1).Split("*")(1)))) 'genera i segmenti di un determinato oggetto e li inserisce in segmenti
  4. End If
  5. Next


Con
Codice sorgente - presumibilmente VB.NET

  1. For o = 0 To tmp.Count - 2
  2. segmenti.Add(New segmento(New Point(tmp.Item(o).Split("+")(0).Split("*")(0), tmp.Item(o).Split("+")(0).Split("*")(1)), New Point(tmp.Item(o).Split("+")(1).Split("*")(0), tmp.Item(o).Split("+")(1).Split("*")(1)))) 'genera i segmenti di un determinato oggetto e li inserisce in segmenti
  3. Next



Solo che si elimina un problema ma se ne presenta uno nuovo, infatti se apro il file:
sfondo|D:\Documents and Settings\All Users\Documenti\Immagini\Immagini campione\Tramonto.jpg|800*600|0|400*279+397*281-397*281+400*282-400*282+399*279-399*279+391*278-391*278+396*281-|logo|D:\Documents and Settings\PC\Desktop\logo.png|150*150|1|193*214+420*85-420*85+573*355-573*355+371*466-371*466+181*291-|
avviene un errore alla riga 26, cioè Conversion from string "D:\Documents and Settings\PC\Des" to type 'Integer' is not valid. ma non capisco come si generi questo errore! :_doubt:
Come posso risolvere?
Grazie :) .

Ultima modifica effettuata da Uno sciame di API il 07/08/2012 alle 21:02


A gent fann tant e' signur, e ppo s' fottn e mllun! (www.youtube.com/watch?v=N6xUYGo0Log)
PM Quote
Avatar
Ultimo (Member)
Expert


Messaggi: 513
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 10:53
Mercoledì, 08/08/2012
Testo quotato

Postato originariamente da Uno sciame di API:

Testo quotato

Postato originariamente da Ultimo:
...
è probabile che superi l'indice della lista tmp :yup:


Grazie della risposta, ora ho provato con
Codice sorgente - presumibilmente VB.NET

  1. For n = 0 To tmp.Count - 4 Step 4
  2. no.Add(tmp.Item(n))
  3. u.Add(tmp.Item(n + 1))
  4. d.Add(tmp.Item(n + 2))
  5. l.Add(tmp.Item(n + 3))
  6. s.Add(tmp.Item(n + 4))
  7. Next



e questo codice non presenta più problemi, ho risolto anche un altro problema, indatti con il codice precedente se aprivo il file:
Nome|C:\img.png|214*220|1|132*292+256*33-256*33+352*307-352*307+404*68-404*68+460*332-|
Il codice non presenta alcun errore, se invece aprivo il file precedente, avveniva il seguente errore alla riga 22.
Index was outside the bounds of the array.

Allora ho modificato:
Codice sorgente - presumibilmente VB.NET

  1. For o = 0 To tmp.Count - 1
  2. If Not tmp.Item(o) = "" Then
  3. segmenti.Add(New segmento(New Point(tmp.Item(o).Split("+")(0).Split("*")(0), tmp.Item(o).Split("+")(0).Split("*")(1)), New Point(tmp.Item(o).Split("+")(1).Split("*")(0), tmp.Item(o).Split("+")(1).Split("*")(1)))) 'genera i segmenti di un determinato oggetto e li inserisce in segmenti
  4. End If
  5. Next


Con
Codice sorgente - presumibilmente VB.NET

  1. For o = 0 To tmp.Count - 2
  2. segmenti.Add(New segmento(New Point(tmp.Item(o).Split("+")(0).Split("*")(0), tmp.Item(o).Split("+")(0).Split("*")(1)), New Point(tmp.Item(o).Split("+")(1).Split("*")(0), tmp.Item(o).Split("+")(1).Split("*")(1)))) 'genera i segmenti di un determinato oggetto e li inserisce in segmenti
  3. Next



Solo che si elimina un problema ma se ne presenta uno nuovo, infatti se apro il file:
sfondo|D:\Documents and Settings\All Users\Documenti\Immagini\Immagini campione\Tramonto.jpg|800*600|0|400*279+397*281-397*281+400*282-400*282+399*279-399*279+391*278-391*278+396*281-|logo|D:\Documents and Settings\PC\Desktop\logo.png|150*150|1|193*214+420*85-420*85+573*355-573*355+371*466-371*466+181*291-|
avviene un errore alla riga 26, cioè Conversion from string "D:\Documents and Settings\PC\Des" to type 'Integer' is not valid. ma non capisco come si generi questo errore! :_doubt:
Come posso risolvere?
Grazie :) .



credo tu stia cercando di convertire una stringa in un integer o viceversa :yup:

per esempio (stringa pippo in un integer) :om:


Ultimo (Hai voluto la bicicletta ? ....)

Studiare LINQ, WPF, ASP.NET MVC, Entity Framwork, C#, Blend, XAML, Javascript, HTML5, CSS .....(tanta roba)

https://www.dropbox.com/s/c2aots5x4urgbhf/setup_game_sudoku ...
PM Quote
Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 15:31
Mercoledì, 08/08/2012
Ho risolto! :D
Invece di usare quel codice, ho fatto così:
Per salvare il file serializzo la lista degli oggetti e la salvo su di un file;
Per aprire il file, deserializzo il file e inserisco il risultato nella lista. :)

Ultima modifica effettuata da Uno sciame di API il 08/08/2012 alle 16:03


A gent fann tant e' signur, e ppo s' fottn e mllun! (www.youtube.com/watch?v=N6xUYGo0Log)
PM Quote