1. Artikel
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forum
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Paules-PC-Forum.de
  2. Forum
  3. Programmierung
  4. XProfan
  5. Anregungen und Bugreports

IndexOf(A[], W[, N])

  • H.Brill
  • 16. September 2022 um 13:14
  • H.Brill
    Stammuser
    Reaktionen
    483
    Beiträge
    1.178
    • 16. September 2022 um 13:14
    • #1

    Vielleicht noch ein Vorschlag für Version 5 :

    Könnte man IndexOf() so gestalten, daß bei String-Arrays die Genauigkeit der Suche

    mit angegeben werden kann ? Halt so ähnlich, wie bei db("Find",...) und db("Seek",...).

    Auch schön wäre, bei Zahlen-Arrays die Suche mit Operatoren zu gestalten, z.B.

    > 10 ' erste Zahl > 10 (auch >= )

    < 10 'erste Zahl < 10 (auch <= )

    usw.

    Vielleicht könnte auch ein Set("...",....) Befehl das Ganze steuern. Ohne geht es

    wie gehabt und mit Set() mit obiger Erweiterung. Ich denke da an Set("RegEx", N),

    wo eingeschaltet, Instr() usw. mit reg. Ausdrücken funktionieren und ausgeschaltet

    halt ganz normal.

    Oder daß RegEx auch bei IndexOf() und String-Arrays funktioniert.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    Einmal editiert, zuletzt von H.Brill (16. September 2022 um 13:40)

  • H.Brill
    Stammuser
    Reaktionen
    483
    Beiträge
    1.178
    • 24. September 2022 um 13:31
    • #2

    Ach ja, was bringt mir IndexOf() beim mehrdimensionalen Array für Positionen ?

    Code
    Declare String a[4,4,4]
    Cls
    a[0,0] = "A"
    a[0,1] = "B"
    a[0,2] = "C"
    a[0,3] = "D"
    a[1,0] = "10"
    a[1,1] = "20"
    a[1,2] = "30"
    a[1,3] = "40"
    a[2,0] = "+"
    a[2,1] = "-"
    a[2,2] = "*"
    a[2,3] = "/"
    
    WhileLoop 0, 3
      Print a[0, &LOOP], a[1, &LOOP], a[2, &LOOP]
    EndWhile
    Print
    Print IndexOf(a[], "C")
    Waitkey
    Alles anzeigen

    Normalerweise müßte da eine Fehlermeldung kommen, da nicht eindimensional.

    Auch SizeOf() reagiert da irgendwie komisch drauf.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • p. specht
    Premium-Mitglied
    Reaktionen
    986
    Beiträge
    5.665
    • 27. September 2022 um 01:38
    • #3

    Du hast ein 5 x 5 x 5 - Array definiert, das - anders als in der Mathematik - bei 0 beginnt und [Kolumne, Zeile, Ebene] abgespeichert wird. Die Indizes beziehen sich dabei auf das N.te Element der ALS LISTE abgespeicherten Matrix.

    Wird beim Abfragen die Ebene weggelassen, wird dort automatisch 0 angenommen.

    "C" ist daher das 10. Element der als Speicherreihenfolge-Liste gespeicherten Matrix.

    0 1 2 3 4

    5 6 7 8 9

    10

    P.S.: Beim Checken der Dimensionen hilft TypeOf()

    HP255G7:Win10pro2.004,4*AMD Ryzen3200U@2.60GHz,6+2GB-RadeonVega/237GBSSD:intlDVDRW,3xUSB3 ext4TB-HDX,XProfanX3+Xasm/Xpse

  • H.Brill
    Stammuser
    Reaktionen
    483
    Beiträge
    1.178
    • 27. September 2022 um 07:43
    • #4

    Soweit bin auch schon gekommen, zumindest mal bei ! ,&, %, $, was gängig ist :

    Code
    typ1$ = pType$(1)
    p& = Len(typ1$, ",")
    Select typ1$
       p& = Len(typ1$, ",")
       If p& > 1
          If InStr("&", typ1$)
             Parameters a&[], w&, x&
             tp$ = Translate$(typ1$, "&", "")
             tp$ = Translate$(tp$, "[", "")
             tp$ = Translate$(tp$, "]", "")
             d& = Val(SubStr$(tp$, x&, ",")) 'welche Dimension ?
    Alles anzeigen

    Damit bekomme ich schon mal die Dimensionen 5,5,5 als String (tp$) und p& zeigt die Anzahl Dimensionen.

    Der Parameter x& soll dann angeben, welche Dimension mit w& durchsucht werden soll. Nun bin ich am

    überlegen, ob ich daraus Einzel-Arrays machen soll und dann mit IndexOf() suche. Bloß müßte ich da dann

    ein Array mit Arrays definieren. Oder halt eine verschachtelte Abfrage mit einer WhileLoop - Schleife. Das

    Problem ist, daß die Dimensionen ja unterschiedlich groß sein können (z.B.[8,5,3]). Oder werden die profanintern

    hintereinander gespeichert, also 16 Elemente ?

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • p. specht
    Premium-Mitglied
    Reaktionen
    986
    Beiträge
    5.665
    • 27. September 2022 um 14:39
    • #5

    Dimensionierst du das Array[8,5,3]? Dann wird eine 9 * 6 * 4 Elemente lange Liste im Speicher erzeugt, Der Index der Elemente errechnet sich so:

    Anzahl Spalten = AS = 9 , mit Spaltenindex S = 0 ... 8

    Anzahl Zeilen = AZ = 6, mit Zeilenindex Z = 0 ... 5

    LISTENINDEX DES SPEICHERELEMENTS = Index = S + Z * AS + E * (AS * AZ)

    <klugscheiß on> Umgekehrt kann man sich Spalte, Zeile und Ebene ein-eindeutig aus dem Listenindex errechnen, insoweit die Dimensionierung des Arrays bekannt ist. Dabei kann man auch fein manipulieren, etwa "Gestürzte Matrizen" erzeugen, ohne physisch umsortieren zu müssen.<klugscheiß off>

    HP255G7:Win10pro2.004,4*AMD Ryzen3200U@2.60GHz,6+2GB-RadeonVega/237GBSSD:intlDVDRW,3xUSB3 ext4TB-HDX,XProfanX3+Xasm/Xpse

  • p. specht
    Premium-Mitglied
    Reaktionen
    986
    Beiträge
    5.665
    • 27. September 2022 um 19:53
    • #6

    Die Rückrechnung aus dem Listenindex kann (XProfan 11.2a) zB so erfolgen:

    S = Index mod AS

    Z = Int(Index / AS) mod AZ

    E = Int(Index / (AS * AZ) )

    HP255G7:Win10pro2.004,4*AMD Ryzen3200U@2.60GHz,6+2GB-RadeonVega/237GBSSD:intlDVDRW,3xUSB3 ext4TB-HDX,XProfanX3+Xasm/Xpse

  • H.Brill
    Stammuser
    Reaktionen
    483
    Beiträge
    1.178
    • 28. September 2022 um 08:15
    • #7

    Mal ein Zwischenstand :

    IndexOf() funktioniert auch in der Version 11.2. Es wird bloß nicht in der Hilfe erwähnt.

    Wenn man sich mal die MoveArrToList() - Funktion zunutze macht, sieht man auch genau,

    wie die Arrays kopiert werden und was eigentlich IndexOf() bei mehrdimensionalen Arrays

    zurück gibt. Das Array wird dimensionsweise in die Listboxliste kopiert, Also a&[0,0], a&[1,0]

    usw. Danach folgt die nächste Dimension. Und so geht vermutlich auch IndexOf() vor.

    Code
    Declare a&[3,3], c&[3,3]
    
    a&[0,0] = 10
    a&[0,1] = 20
    a&[0,2] = 30
    a&[0,3] = 40
    a&[1,0] = 100
    a&[1,1] = 200
    a&[1,2] = 300
    a&[1,3] = 400
    a&[2,0] = 1000
    a&[2,1] = 2000
    a&[2,2] = 3000
    a&[2,3] = 4000
    a&[3,0] = 10000
    a&[3,1] = 20000
    a&[3,2] = 30000
    a&[3,3] = 40000
    
    Cls
    Print IndexOf(a&[], 400)
    Print
    Print SizeOf(a&[])
    Print MoveArrToList(a&[])
    'Listbox$("", 1)
    Print MoveListToArr(c&[])
    ClearList
    Print MoveArrToList(c&[])
    'Listbox$("",1)
    Waitkey
    Alles anzeigen

    Somit ist mir einiges klarer geworden. Somit kann man sich dann auch die genaue Position (spalte, index) ableiten.

    Ist nur schade, daß man die Dimensionen eines mehrdimensionalen Array nur mit pType$() bekommt.

    Vielleicht könnte RGH das

    @TypeOf(V#)

    so erweitern, daß man auch die Art ($,!,%,&) und die Dimensionen eines Arrays erfahren könnte. Also daß es

    sowas wie bei pType$() zurück liefert.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    2 Mal editiert, zuletzt von H.Brill (28. September 2022 um 08:26)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Windows 11

  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™