Spenzer Skrevet 2. november 2012 Del Skrevet 2. november 2012 Hei Tenkte jeg skulle prøve å sette opp et 2D array i VB, og dette er tydeligvis vanskeligere enn det jeg trudde det skulle være. Om jeg setter opp en string som ser slik ut: tekst1,tekst2,tekst3 tekst4,tekst5 Så fungerer det helt fint, den returnerer alle feltene og rad 2, felt 3 returneres tomt ettersom rad 1 har et felt 3 men ikke rad 2, men det hadde jeg forventet. Men problemet mitt er at om jeg har en string som ser slik ut: tekst1,tekst2 tekst3,tekst4,tekst5 Så får jeg følgende feilmelding: index was outside the bounds of the array Så om den første raden har 2 kolonner, så klarer den ikke å hente ut flere kolonner enn maks 2 i de andre radene heller. Funksjonen: Private Function TwoDimArrToString(text As String) As String(,) Dim array As String(,) = Nothing Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None) For i = 0 To lines.GetUpperBound(0) Dim fields = lines(i).Split(","c) If i = 0 Then array = New String(lines.GetUpperBound(0), fields.GetUpperBound(0)) {} End If For j = 0 To fields.GetUpperBound(0) array(i, j) = (fields(j)) Next Next Return array End Function Er veldig ny med 2D arrays, så kompetansen rundt dette område er ikke så høyt. Lenke til kommentar
GeirGrusom Skrevet 2. november 2012 Del Skrevet 2. november 2012 Du antar i koden at arrayet er rektangulært. I j loopen må du benytte GetUpperBounds(1) for å finne lengden på 2-dimensjon. 1 Lenke til kommentar
Spenzer Skrevet 2. november 2012 Forfatter Del Skrevet 2. november 2012 Du antar i koden at arrayet er rektangulært. I j loopen må du benytte GetUpperBounds(1) for å finne lengden på 2-dimensjon. Hei og takk for rask tilbakemelding. Om jeg endrer GetUpperBounds(0) til GetUpperBounds(1) i J loopen får jeg følgende feil: Matrisen har ikke så mange dimensjoner. Lenke til kommentar
GeirGrusom Skrevet 2. november 2012 Del Skrevet 2. november 2012 (endret) edit glem det Grunnen er at du ikke har definert størrelsen på arrayet, og glem det jeg skrev tidligere (jeg leste feil) Dersom du ikke vet hvor stort et array skal være på forhånd, brude du bruke List(Of T) istedet. Endret 2. november 2012 av GeirGrusom 1 Lenke til kommentar
Spenzer Skrevet 2. november 2012 Forfatter Del Skrevet 2. november 2012 (endret) edit glem det Grunnen er at du ikke har definert størrelsen på arrayet, og glem det jeg skrev tidligere (jeg leste feil) Dersom du ikke vet hvor stort et array skal være på forhånd, brude du bruke List(Of T) istedet. Men i mitt tilfelle er størrelsen på arrayet variabelt, jeg vet aldri hvor mange kolonner eller rader arrayet kommer til å inneholde. Er det noen måte å gjøre dette på da? Endret 2. november 2012 av Spenzer Lenke til kommentar
GeirGrusom Skrevet 2. november 2012 Del Skrevet 2. november 2012 (endret) Tja, du vet jo størrelsen, men du trenger enten List, eventuelt Jagged Arrays (Array av Arrays) Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None) Dim array As New String(1 To lines.Length)() For i As Integer = 1 To lines.Length array(i) = lines(i).Split(","c) Next Endret 2. november 2012 av GeirGrusom 1 Lenke til kommentar
GeirGrusom Skrevet 2. november 2012 Del Skrevet 2. november 2012 Ah jeg som blandet litt Visual Basic og C#: Dim array(1 To Lines.Length)() As String 1 Lenke til kommentar
Spenzer Skrevet 2. november 2012 Forfatter Del Skrevet 2. november 2012 Ah jeg som blandet litt Visual Basic og C#: Dim array(1 To Lines.Length)() As String Takk for at du gidder Geir Prøvde det du skrev nå, men om jeg ikke misforstår noe her, så vil det arrayet bli satt opp som et 1-dimensjonalt array? Noe som blir problematisk når jeg skal sette inn informasjonen i arrayet? Jeg er nok helt på villspor, men sånn ser det ut atm. Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None) Dim array(0 To lines.Length)() As String For i = 0 To lines.GetUpperBound(0) Dim fields = lines(i).Split(","c) array(i) = New String(fields.GetUpperBound(0)) {} For j = 0 To fields.GetUpperBound(0) array(i, j) = (fields(j)) Next Next Return array Lenke til kommentar
GeirGrusom Skrevet 2. november 2012 Del Skrevet 2. november 2012 For i = 0 To lines.GetUpperBound(0) Må vel være For i = 0 To lines.GetUpperBound(0) - 1 ? For løkken er inklusiv. 1 Lenke til kommentar
Spenzer Skrevet 2. november 2012 Forfatter Del Skrevet 2. november 2012 (endret) For i = 0 To lines.GetUpperBound(0) Må vel være For i = 0 To lines.GetUpperBound(0) - 1 ? For løkken er inklusiv. Er denne linjen som failer: array = New String(lines.GetUpperBound(0), fields.GetUpperBound(0)) {} Står følgende: Error 1 Value of type '2-dimensional array of String' cannot be converted to '1-dimensional array of 1-dimensional array of String' because 'String' is not derived from '1-dimensional array of String'. Endret 2. november 2012 av Spenzer Lenke til kommentar
GeirGrusom Skrevet 2. november 2012 Del Skrevet 2. november 2012 Men du vil da ikke endre hele arrayet, bare på indeks(i)? 1 Lenke til kommentar
Spenzer Skrevet 2. november 2012 Forfatter Del Skrevet 2. november 2012 Men du vil da ikke endre hele arrayet, bare på indeks(i)? Ja, men denne koden her gir meg samme feil :/ array(i) = New String(lines.GetUpperBound(0), fields.GetUpperBound(0)) {} Lenke til kommentar
GeirGrusom Skrevet 3. november 2012 Del Skrevet 3. november 2012 Ja, men denne koden her gir meg samme feil :/ array(i) = fields 1 Lenke til kommentar
Spenzer Skrevet 3. november 2012 Forfatter Del Skrevet 3. november 2012 Ja, men denne koden her gir meg samme feil :/ array(i) = fields Ok, da er jeg et steg nærmere målet Nå er problemet at den vil returnere arrayet som et 1 dimensjonalt array istedet for 2. Lenke til kommentar
GeirGrusom Skrevet 4. november 2012 Del Skrevet 4. november 2012 Det er fordi funksjonen vil ha en todimensjonal array, men det som er opprettet er en en dimensjonal array av arrays. Bytt returverdien til String()() i funksjonsdefinisjonen 1 Lenke til kommentar
Spenzer Skrevet 5. november 2012 Forfatter Del Skrevet 5. november 2012 (endret) Det er fordi funksjonen vil ha en todimensjonal array, men det som er opprettet er en en dimensjonal array av arrays. Bytt returverdien til String()() i funksjonsdefinisjonen Det ser ut til å fungere sånn halvveis nå, endret returverdien til String()() i funksjonsdefinisjonen samt følgende linje: array(i, j) = (fields(j)) til array(j) = (array(i)) Slik ser det ut når jeg kaller funksjonen: Dim TwoDimensionArr()() As String Dim MinString as String = "Rad01Kol01,Rad01Kol02" & vbNewLine & "Rad02Kol01,Rad02Kol02,Rad02Kol03" TwoDimensionArr = StringToTwoDimensionalStringArray(MinString) Dim bound0 As Integer = TwoDimensionArr.GetUpperBound(0) Dim bound1 As Integer = TwoDimensionArr.GetUpperBound(1) For i As Integer = 0 To bound0 For x As Integer = 0 To bound1 Dim value As String = TwoDimensionArr(i, x) If (value = Nothing) = False Then MsgBox("Row: " & i + 1 & " Column: " & x + 1 & " - Value: " & value) End If Next Next Det fungerer sånn ca. nå. Jeg får ut elementene på den første raden, i dette tilfellet: Rad01Kol01 og Rad01Kol02. Deretter får jeg følgende feil: Indeksen var utenfor matrisegrensen. EDIT: Forresten i funksjonen, skal det stå GetUpperBound(0) eller (1) på bound1? Ettersom det ikke lenger er et todimensjonalt array? Jeg tipper feilen forresten ligger i følgende linje: array(j) = (array(i)) Ettersom jeg bare erstatter innholdet i arrayet. Forsøkte også å gjøre slik: array = array(j)(array(i)) Endret 5. november 2012 av Spenzer Lenke til kommentar
GeirGrusom Skrevet 5. november 2012 Del Skrevet 5. november 2012 (endret) Private Function TwoDimArrToString(text As String) As String()() Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None) Dim array = New String(0 To lines.Length - 1)() For i = 0 To lines.GetUpperBound(0) - 1 array(i) = lines(i).Split(","c) Next Return array End Function Det er ikke noen UpperBounds(1) på jagged arrays, ettersom lengden på det innerste arrayet vil variere. Endret 5. november 2012 av GeirGrusom 1 Lenke til kommentar
Spenzer Skrevet 5. november 2012 Forfatter Del Skrevet 5. november 2012 (endret) Private Function TwoDimArrToString(text As String) As String()() Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None) Dim array = New String(0 To lines.Length - 1)() For i = 0 To lines.GetUpperBound(0) - 1 array(i) = lines(i).Split(","c) Next Return array End Function Det er ikke noen UpperBounds(1) på jagged arrays, ettersom lengden på det innerste arrayet vil variere. Det hjalp enda mer, nå er det vel bare siste steget igjen Jeg klarer nå å hente ut rad 1 samt alle kolonner, rad 2 samt alle kolonner, men den failer på siste raden. Slik ser funksjonen ut nå: Public Function StringToTwoDimensionalStringArray(text As String) As String()() Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None) Dim array(0 To lines.Length - 1)() As String For i = 0 To lines.GetUpperBound(0) - 1 array(i) = lines(i).Split(","c) Next Return array End Function Slik ser det ut når jeg kaller til funksjonen: Dim TwoDimensionArr()() As String TwoDimensionArr = StringToTwoDimensionalStringArray(MinString) For i As Integer = 0 To TwoDimensionArr.GetUpperBound(0) For x As Integer = 0 To TwoDimensionArr(i).GetUpperBound(0) MsgBox("Row: " & i + 1 & " Column: " & x + 1 & " - Value: " & TwoDimensionArr(i)(x)) Next Next EDIT: Får følgende feil Additional information: Objektreferanse er ikke satt til en objektforekomst. på følgende linje: For x As Integer = 0 To TwoDimensionArr(i).GetUpperBound(0) Endret 5. november 2012 av Spenzer Lenke til kommentar
Spenzer Skrevet 5. november 2012 Forfatter Del Skrevet 5. november 2012 (endret) Ok, etter litt testing fant jeg ut problemet, så nå fungerer det. Funksjonen ser nå slik ut: Public Function StringToTwoDimensionalStringArray(text As String) As String()() Dim lines = text.Split({Environment.NewLine}, StringSplitOptions.None) Dim array(0 To lines.Length)() As String For i = 0 To lines.GetUpperBound(0) array(i) = lines(i).Split(","c) Next Return array End Function Slik ser det ut når jeg kaller til funksjonen: Dim TwoDimensionArr()() As String TwoDimensionArr = StringToTwoDimensionalStringArray(MinString) For i As Integer = 0 To TwoDimensionArr.GetUpperBound(0) - 1 For x As Integer = 0 To TwoDimensionArr(i).GetUpperBound(0) MsgBox("Row: " & i + 1 & " Column: " & x + 1 & " - Value: " & TwoDimensionArr(i)(x)) Next Next Tusen takk for all hjelp GeirGrusom ! Endret 5. november 2012 av Spenzer Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå