mehrdimensionales Array erstellen und Werte wieder auslesen ?!?

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Morrison.

    mehrdimensionales Array erstellen und Werte wieder auslesen ?!?

    Hallo,

    ich bräuchte mal wieder ein bissl hilfe von Euch! Und zwar brauche ich ein Array welches mir 1. den Index speichert und zum Index vier Integer-Werte!

    Ich befülle das Array in einer Schleife und er soll mir praktisch die Loops der Schleife und noch vier andere Werte speichern können!

    Jetzt habe ich aber Probleme bei der Deklarierung UND beim späteren Auslesen des Arrays.

    Hab was von List Of Arrays gehört, Mehrdimensionalen Arrays, aber in VB.NET kenn ich mich nicht so aus weil ich erst kürzlich von AutoIt auf VB.Net umgestiegen bin..wäre schön wenn jemand ein kleines Beispiel parat hätte! thx

    8-)
    Aha! :P

    Sagt mir nichts, hört sich aber interessant an!

    Hab gelesen das man das mit ner Struct lösen kann was zugleich performanter ist! Wäre schön wenn mir da jemand nen Ansatz reichen könnte.. 8-)

    Iwie so??

    VB.NET-Quellcode

    1. Structure Simple
    2. Public _position As Integer
    3. Public _exists As Boolean
    4. Public _lastValue As Double
    5. End Structure
    6. Module Module1
    7. Sub Main()
    8. Dim s As Simple
    9. s._position = 1
    10. s._exists = False
    11. s._lastValue = 5.5
    12. Console.WriteLine(s._position)
    13. End Sub
    14. End Module


    Das ist jetzt aber nur eindimensional, oder?

    bräuchte das für jeden Index mit vier Werten!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Morrison“ ()

    Naja, Klasse sagt mir schon was, aber ich bin in der OOP noch nicht so firm!

    Werd versuchen das jetzt erstmal so zu lösen:

    VB.NET-Quellcode

    1. Dim loops as Integer = 0
    2. Dim aMatchesCount(loops, 4) as Integer
    3. For x = 0 to width - 1
    4. for y = 0 to height - 1
    5. ReDim aMatchesCount(loops, 4)
    6. aMatchesCount(loops, 0) = matches
    7. aMatchesCount(loops, 1) = counts
    8. aMatchesCount(loops, 2) = x
    9. aMatchesCount(loops, 3) = y
    10. next
    11. next
    ach, kagge..das funzt alles nicht..beim ReDim werden die vorherigen Einträge gelöscht, oder? Und ein Preserve schmeisst mir nen Fehler aus...

    Besser mit nem ListArray arbeiten??

    Hat wer Rat?

    OK, hab ne ReDimEx für verlustfreies Re-Dimensionieren!! :rolleyes:

    VB.NET-Quellcode

    1. Public Sub ReDimEx(ByRef MyArray(,) As Integer, _
    2. ByVal iDimX As Integer, _ByVal iDimY As Integer)
    3. Dim MyTempArray(,) As Integer
    4. Dim I As Integer
    5. Dim J As Integer
    6. MyTempArray = MyArrayReDim MyArray(iDimX, iDimY)
    7. For I = LBound(CType(MyTempArray, Array), 1) To UBound(CType(MyTempArray, Array), 1)For J = LBound(CType(MyTempArray, Array), 2) To UBound(CType(MyTempArray, Array), 2)
    8. If I <= iDimX And J <= iDimY Then
    9. MyArray(I, J) = MyTempArray(I, J)
    10. End IfNext J
    11. Next I
    12. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Morrison“ ()

    Ehrlich gesagt bin ich mir nicht mehr sicher, was du überhaupt machen willst. Dieser Code macht überhaupt keinen Sinn und entspricht auch nicht wirklich dem, was du oben beschrieben hast. Ich kann dir nur ne konkrete Lösung geben, wenn die Aufgabenstellung genau ist.
    Also ich habs soweit eig. gelöst..was mir jetzt noch fehlt ist die Abfrage des Arrays!

    Hab jetzt ein Array mit aMatchCount(loops, 4) deklariert und mit der ReDimEx erweitere ich jeweils die erste Dimension des Arrays bei jedem neuen Eintrag ins Array. Jeder Eintrag setzt sich aus den vier Werten Count, Match, x, y zusammen und die erste Dimension ist praktisch mein Index!

    Wie kann ich jetzt aber per Schleife die Werte des Arrays in eine ListBox schreiben?

    Ich denke wieder mit zwei Schleifen:

    einmal mit for x to aMatchCount.UpperBound(0)

    und dann mit y = 0 to 3

    für die vier Werte, oder? mom!



    Also:

    VB.NET-Quellcode

    1. Dim chars As String = Nothing
    2. For s As Integer = 0 To aMatchesCount.GetUpperBound(0)
    3. For t As Integer = 0 To 3
    4. chars = chars & " " & aMatchesCount.GetValue(s, t).ToString
    5. Next
    6. Form2.ListBox1.Items.Add(chars)
    7. chars = Nothing
    8. Next



    Ja, weiss nich..hab wie gesagt vom OOP nich so die Ahnung! Aber wenn jemand noch was mit Struct anbieten kann wäre ich sehr dankbar, weil ich brauch was performantes!

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Morrison“ ()

    Sollte so funktionieren, wobei dus dir damit (mal wieder) eigentlich viel zu schwer machst, wo doch das Framework so viele schöne Möglichkeiten der Datenverwaltung bietet.
    Bei dem Code blick ich auf die Schnelle jedefalls nicht mehr durch, erinnert eher an irgend nen Lowlevel-Array-Rumgehacke als an VB. :P
    @Artentus: Genau dafür könnte man ja diese vermaledeiten Tupels doch nutzen oder(d.h. wenn man keine Strukturen nutzen wollte)? :D

    VB.NET-Quellcode

    1. Dim l As New List(Of Tupel(Of Integer, Integer, Integer, Integer))
    2. l.Add(New Tupel(Of Integer, Integer, Integer, Integer)(0, 1, 2, 3))

    Sieht dann halt nicht so schön aus, aber wäre eine Möglichkeit.
    @Higlav
    Dadurch macht man sich aber auch die Möglichkeit des DataBidnings zunichte, weil man da nicht ToString überschreiben kann und die Listbox nur ein Displaymember hat.
    Sone kleine Klasse anzulegen dauert 2 Minuten und 15 Zeilen Code, oder man lässt sich das gleich ganz automatisch vom Dataset-Designer anlegen.
    Der TE nutzt sogar noch Arrays und kennt das OOP-Konzept nicht. Ihm da jetzt schon zu Databinding zu raten ist momentan evtl. ein wenig zu hoch für ihn.
    Also DataBinding ist eigentlich einfach, da muss man kaum ne Zeile Code schreiben sondern kann sich alles schön zusammenklicken. Mmn sollte man das gleich von Anfang an lernen, weil man damit funktionelle GUIs und Datenmodelle in sehr kurzer Zeit und mit wenig Aufwand anlegen kann. Gerade bei geringen Sprachkenntnissen verhindert das, dass man irgend was zusammenranzt.
    Hat jemand vielleicht nen Beispiel für so´ne Klasse für mehrdimensionale Arrays? Oder nen Link zu einer Seite, pls..ärger mich jetzt schon länger mit diesen blöden Arrays rum!

    Ich muss nämlich einmal ein mehrdimensionales Array erstellen und das dann nochmal "säubern", sprich ungültige Einträge rausfiltern und löschen und mit meinen Basic wissen komm ich immer durcheinander, bzw. garnicht erst ans Ziel! ;(
    Ich hab dir gesagt, du bist mit deinen Arrays auf dem totalen Holzweg. Falls du dich doch dazu überreden lässt, es jetzt ordentlich zu machen:
    [VB 2010] DatasetOnly: DB-Programmierung ohne Datenbank
    [VB.NET] Daten laden, speichern, verarbeiten - einfachste Variante
    [VB.NET] die vier Views auf Video
    Erstellen, Entfernen, Filtern, Sortieren, Anzeigen, Speichern - alles kein Problem und mit im Vergleich zu deinem bisherigen Vorgehen sehr geringem Aufwand.
    Das scheint mir alles viel zu kompliziert..besser gesagt mit Kanonen auf Spatzen schiessen!

    Ich wollt eigentlich nur in zwei Schleifen (x * Y) die Koordinaten von einem Bild in einem Array speichern.

    Also ich habe ein Bild und möchte von diesem Bild einige Pixel in ein Array speichern.

    Und dann noch mit ner Datenbank arbeiten, die dann noch auf Festplatte auslagert, erscheint mir übertrieben!

    Wollte das eig. mit ner Structure lösen, iwie.. ?(
    Moin,

    ich würde das mit einer Klasse bevorzugen, aber mit einer Struktur funktioniert das auch. Ich hab dir zwei Beispiele erstellt, einmal mit einer Structure und einmal mit einer Klasse, da kannste dich dran orientieren. Man könnte da auch mit LockBits rangehen, wäre performanter, aber ich glaube das wäre für dich im Moment noch unverständlich.

    mit einer Structure:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private PixelDaten As New List(Of PixelInfo)
    3. Private Bmp As New Bitmap(Image.FromFile("D:\1.jpg"))
    4. Public Structure PixelInfo
    5. Public Position As Point
    6. Public Alpha As Integer
    7. Public Rot As Integer
    8. Public Gruen As Integer
    9. Public Blau As Integer
    10. End Structure
    11. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. For i = 0 To Bmp.Width - 1
    13. For ii = 0 To Bmp.Height - 1
    14. Dim farbe As Color = Bmp.GetPixel(i, ii)
    15. PixelDaten.Add(New PixelInfo With {.Position = New Point(i, ii), .alpha = farbe.A, .Rot = farbe.R, .Gruen = farbe.G, .Blau = farbe.B})
    16. Next
    17. Next
    18. Dim infoarray() As PixelInfo = PixelDaten.ToArray
    19. End Sub
    20. End Class

    mit einer Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private PixelDaten As New List(Of PixelInfo)
    3. Private Bmp As New Bitmap(Image.FromFile("D:\1.jpg"))
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. For i = 0 To Bmp.Width - 1
    6. For ii = 0 To Bmp.Height - 1
    7. Dim farbe As Color = Bmp.GetPixel(i, ii)
    8. PixelDaten.Add(New PixelInfo(New Point(i, ii), farbe.A, farbe.R, farbe.G, farbe.B))
    9. Next
    10. Next
    11. Dim infoarray() As PixelInfo = PixelDaten.ToArray
    12. End Sub
    13. End Class

    VB.NET-Quellcode

    1. Public Class PixelInfo
    2. Public Property Position As Point
    3. Public Property Alpha As Integer
    4. Public Property Rot As Integer
    5. Public Property Gruen As Integer
    6. Public Property Blau As Integer
    7. Public Sub New(p As Point, a As Integer, r As Integer, g As Integer, b As Integer)
    8. Position = p
    9. Alpha = a
    10. Rot = r
    11. Gruen = g
    12. Blau = b
    13. End Sub
    14. End Class

    Klasse oder direkt nen Dataset anlegen?!
    Warum kein Dataset erstellen? Ne Klasse macht für mich erst dann wirklich sinn, wenn ich auch Funktionen darin auslagere... oder?!

    Vllt denke ich da zu datenbänkerisch... Aber ich täte nen Dataset anlegen und dort die Werte speichern oO
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Also mit dem LockBits ist genau womit ich im Moment arbeite..ich poste mal mein gesamtes Werk!

    Bin mal gespannt was da kommt! :D

    Und worum es mir geht ist folgendes:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub fpALL()Dim loops As Integer = 0
    2. Dim myColor As Color
    3. Dim iSource As BitmapiSource = CType(PicViewer1.Image, Bitmap)
    4. Dim matches As Integer = 0Dim count As Integer = 0
    5. Dim x, y As Integer
    6. 'Get Bitmap from Desktop
    7. Dim bounds As Rectangle
    8. Dim screenshot As System.Drawing.Bitmap
    9. Dim graph As Graphicsbounds = Screen.PrimaryScreen.Bounds
    10. screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)graph = Graphics.FromImage(screenshot)
    11. graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)Dim maxRange As Integer = PicViewer1.Image.Width * PicViewer1.Image.Height
    12. 'Prüfen ob Image richtiges PixelFormat hat ggf. konvertierenDim pFSize As Integer = Bitmap.GetPixelFormatSize(iSource.PixelFormat)
    13. If pFSize <> 32 OrElse iSource.PixelFormat = PixelFormat.Indexed ThenFastPix.ConvertFormat(iSource)
    14. End If
    15.  Using fp As New FastPix(screenshot)
    16. Using sIMG As New FastPix(iSource)For x = 0 To screenshot.Width - 1For y = 0 To screenshot.Height - 1
    17. myColor = fp.GetPixel(x, y)
    18. If sIMG.GetPixel(0, 0) = myColor Then
    19. 'Form2.ListBox1.Items.Add("MATCH! at: " & x & "*" & y)
    20. matches += 1
    21. 'MessageBox.Show(CStr(iSource.Width * iSource.Height))For i As Integer = 0 To iSource.Width - 1
    22. For j As Integer = 0 To iSource.Height - 1
    23. If fp.GetPixel(x + i, y + j) = sIMG.GetPixel(i, j) Then
    24.  
    25. 'ListBox füllen
    26. 'Form2.ListBox1.Items.Add(count & ": Match " & matches & " at: " & (x + i) & "*" & (y + j))
    27. ReDimEx(aMatchesCount, loops, 4)
    28. aMatchesCount(loops, 0) = count 'Zähler Pixelanzahl
    29. aMatchesCount(loops, 1) = matches 'Zähler für Zusammenhänge
    30. aMatchesCount(loops, 2) = (x + i)
    31. aMatchesCount(loops, 3) = (y + j)
    32. count += 1
    33. loops += 1
    34. Else
    35. count = 0
    36. End If
    37. Next
    38. Next
    39. End If
    40. Next
    41. Next
    42. End Using
    43. End Using
    44. 'Array säubern
    45. Dim counter, looped As IntegerDim cMatch As Integer = 1
    46. Dim aArray(counter, 4) As IntegerDim looking As Integer = 1
    47. 'MessageBox.Show(CStr(iSource.Width * iSource.Height))For s As Integer = 0 To aMatchesCount.GetUpperBound(0)
    48. 'Wenn Neuanfang des maxLoops(Höhe*Breite)
    49. If looped = 0 Then
    50. ReDimEx(aArray, counter, 4)
    51. aArray(counter, 0) = aMatchesCount(s, 0)
    52. aArray(counter, 1) = cMatch '(s, 1)
    53. aArray(counter, 2) = aMatchesCount(s, 2)
    54. aArray(counter, 3) = aMatchesCount(s, 3)
    55. counter += 1
    56. ElseIf aMatchesCount(s, 0) = aMatchesCount(s - 1, 0) + 1 And _
    57. aMatchesCount(s, 0) < maxRange Then
    58. ReDimEx(aArray, counter, 4)
    59. aArray(counter, 0) = aMatchesCount(s, 0)
    60. aArray(counter, 1) = cMatch '(s, 1)
    61. aArray(counter, 2) = aMatchesCount(s, 2)
    62. aArray(counter, 3) = aMatchesCount(s, 3)
    63.  
    64. counter += 1
    65. Else
    66. looking += 1MessageBox.Show(CStr(looking))
    67. 'counter += 1
    68. End If
    69. End If
    70. If aMatchesCount(s, 0) = maxRange - 1 Then
    71. cMatch += 1
    72. End If
    73. looped += 1
    74. Next
    75. 'MessageBox.Show("looped: " & CStr(looped) & " / " & CStr(aMatchesCount.GetUpperBound(0)))
    76. 'ListBox mit ArrayDaten füllen
    77. Dim chars As String = NothingFor s As Integer = 0 To aArray.GetUpperBound(0)
    78. For t As Integer = 0 To 3chars = chars & " " & aArray.GetValue(s, t).ToString
    79. Next
    80. Form2.ListBox1.Items.Add(chars)
    81. chars = Nothing
    82. Next
    83.  
    84.  End Sub


    P.S.: Das GetPixel ist nicht die Funktion von .Image sondern von FastPix.vb welches LockBits wrapped!

    Ihr könnt Euch mit "Speichern" ein eigenes Image auf den Desktop speichern und dieses dann mit "Source laden" laden..dann auf "Image suchen" und ich will die Fundstellen haben..mpf.. :?:
    Dateien
    • Lupe.rar

      (139,01 kB, 160 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Morrison“ ()