Verständnisproblem bei einem Jagged-Array

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Verständnisproblem bei einem Jagged-Array

    Ich habe ein mehrdimensionales Array welches so ausschaut:

    VB.NET-Quellcode

    1. Public IDSammlung(40, 9) As Integer
    2. Public Sub SetID(Track As Integer, Sektor As Integer, IDNummer As Integer)
    3. IDSammlung(Track, Sektor) = IDNummer
    4. End Sub
    5. Public Function GetID(Track As Integer, Sektor As Integer) As Integer
    6. Return IDSammlung(Track, Sektor)
    7. End Function


    VS sagt mir das ich ein Jagged-Array verwenden soll.
    Gegoogelt und docs.microsoft.com/de-de/dotne…language-features/arrays/ gefunden.
    Nun werde ich nicht ganz schlau aus den Beispielen, vorallem weil MS dort selbst ein mehrdimensionales Array verwendet.
    Wie wäre denn die richtige Schreibweise für meinen Code als Jagged-Array?
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    Schnellschuss:

    VB.NET-Quellcode

    1. Public IDSammlung(40)() As Integer
    2. Public Sub Init()
    3. 'das hier geht:
    4. For i = 0 To 40
    5. ReDim IDSammlung(i)(9)
    6. Next
    7. 'das nicht:
    8. ' Array.ForEach(IDSammlung, Sub(x) ReDim x(9))
    9. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @oobdoo Die andere Richtung wäree, ein eindimensionales Feld der Größe 40 * 9 und die Index-Rechnung in Deine Prozeduren GetID() und SetID() reinzupacken.
    Wenn das beliebig oft verwendet wird, ist die eigene Index-Rechnung schneller als Deine und wesaentlich schneller als in einem Jagged-Array.
    Ich mache Bildverarbeitung und die Pixel liegen in einem 1-D-Array.
    Das ist besonders dann interessant, wenn Du in C# mit unsafe arbeitest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke. :)

    So habe ich es jetzt am Laufen ohne das ne Meldung von VS erscheint.

    VB.NET-Quellcode

    1. Private IDSammlung(1)() As Integer
    2. Private Sub InitIDSammlung(Tracks As Integer, Sektoren As Integer)
    3. IDSammlung = New Integer(Tracks)() {}
    4. For i = 0 To Tracks - 1
    5. ReDim IDSammlung(i)(Sektoren)
    6. Next
    7. End Sub
    8. Public Sub SetID(Track As Integer, Sektor As Integer, IDNummer As Integer)
    9. IDSammlung(Track)(Sektor) = IDNummer
    10. End Sub
    11. Public Function GetID(Track As Integer, Sektor As Integer) As Integer
    12. Return IDSammlung(Track)(Sektor)
    13. End Function

    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:

    RodFromGermany schrieb:

    @oobdoo Bitte nicht den Post #3 ignorieren. ;)

    Es gibt einen weiteren Grund warum mir solche Lösungen eher Einfallen als eine Formel. :whistling:

    Beispiel:

    Arrayposition
    Track
    Sektor
    0
    0
    0
    1
    0
    1
    2
    0
    2
    3
    0
    3
    4
    0
    4
    5
    0
    5
    6
    0
    6
    7
    0
    7
    8
    0
    8
    9
    1
    0
    10
    1
    1
    11
    1
    2
    12
    1
    3
    13
    1
    4
    14
    1
    5
    15
    1
    6
    16
    1
    7
    17
    1
    8
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    359
    39
    8

    Die Arrayposition zu berechnen, dazu reicht es noch bei mir.

    AnzahlSektorenProTrack = 9
    Arrayposition = (Track*AnzahlSektorenProTrack)+Sektor


    Wenn ich jetzt nur die Arrayposition kenne und wollte per Formel Track und Sektor berechnen,
    dann bin ich mit meinen mathematischen Fähigkeiten schnell am Ende. :(

    Ist der Track und Sektor überhaupt berechenbar wenn man nur die Arrayposition kennt?
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    Ich kann es noch nicht ganz glauben, aber vermutlich habe ich die Gleichung mit zwei Unbekannten gelöst bekommen. 8|

    Die Gleichung von oben wäre: P = ( T * 9 ) + S

    P = Position im Array
    T = Track
    S = Sektor


    Zuerst löst man die Formel nach T auf und nimmt für S den maximal größten Wert der vorkommen kann.
    P
    in der Formel ist bekannt.

    T = AUFRUNDEN ( P - S ) / 9

    Ist T berechnet dann kann man die Formel nach S umstellen und den Sektor berechnen lassen.

    - S = ( T * 9 ) - P

    bzw.

    S = ABS ( ( T * 9 ) - P

    Um das Minus weg zu bekommen habe ich die ABS-Funktion (aus Excel) verwendet.
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:

    oobdoo schrieb:

    wenn P > 8 ist.
    Warum so kompliziert?
    Fang an mit einem Test-Array, wo Du sofort siehst, ob Deine Rechnung korrekt ist:

    Quellcode

    1. 1 2 3
    2. 4 5 6
    3. 7 8 9
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!