Findet auch mehrere Vorkommen des Suchwertes in Arrays.
Die Besonderheit: Sucht in Arrays des Typs Integer, Longint, Quadint, Float, Single, String und Widestring.
Es kann ein dynamisches Array sein oder ein festes Array bis zu 3 Dimensionen.
Der Suchwert muss mit dem Arraytyp übereinstimmen.
Der 3. Parameter ist entweder -1 für alle Vorkommen, oder die gewünschte maximale Anzahl.
Die Dimensionen (wenn vorhanden) werden mit Kommata getrennt. Die Fundstellen werden durch Semikola getrennt.
Code
Declare int wuerfel[25,25], string s
$I c:\XProfan\Projekte\Include\MultiIndexOf.inc
cls
wuerfel[3,8] = 17
wuerfel[12,12] = 17
wuerfel[17, 3] = 17
wuerfel[24,25] = 17
Print "wuerfel[3,8] = 17"
Print "wuerfel[12,12] = 17"
Print "wuerfel[17, 3] = 17"
Print "wuerfel[24,25] = 17"
Print " "
s = MultiIndexOf( wuerfel[], 17,-1 ) : print s $ " -- Len: " $ Len(s,";")
Print " "
s = MultiIndexOf( wuerfel[], 17, 1 ) : print s $ " -- Len: " $ Len(s,";")
Print " "
s = MultiIndexOf( wuerfel[], 17, 2 ) : print s $ " -- Len: " $ Len(s,";")
Print " "
s = MultiIndexOf( wuerfel[], 17, 3 ) : print s $ " -- Len: " $ Len(s,";")
Print "\nLastIndexOf:"
s = MultiIndexOf( wuerfel[], 17,-1 ) : print SubStr$(s, Len(s,";"), ";") $ " -- Idx: " $ Len(s,";")
waitend
Alles anzeigen
Code: MultiIndexOf.inc
' Autor: Michael Wodrich
' XProfan X3.1
Proc MultiIndexOf // liefert alle Indizes mit Semikolon getrennt in Textform (Dimensionen mit Komma getrennt)
Declare string PT, int PC : PT = PType$(1) : PC = %PCount
Var int MaxFunde = 0
Select Left$(PT,2)
CaseOf "%[" // Integer (Int)
Parameters int arr[], Wert, MaxFundeI
MaxFunde = MaxFundeI
CaseOf "&[" // Longint (Long)
Case PC = 2 : Parameters long arr[], Wert
Case PC = 3 : Parameters long arr[], Wert, int MaxFundeL
Case PC = 3 : MaxFunde = MaxFundeL
CaseOf "Q[" // Quadint (Quad)
Parameters quad arr[], Wert, int MaxFundeQ
MaxFunde = MaxFundeQ
CaseOf "![" // Float (Double)
Parameters float arr[], Wert, int MaxFundeF
MaxFunde = MaxFundeF
CaseOf "S[" // Single
Parameters single arr[], Wert, int MaxFundeS
MaxFunde = MaxFundeS
CaseOf "$[" // String
Parameters string arr[], Wert, int MaxFundeStr
MaxFunde = MaxFundeStr
CaseOf "W[", "µ[" // Widestring (Wide)
Parameters wide arr[], Wert, int MaxFundeW
MaxFunde = MaxFundeW
Otherwise
Parameters long arr[], Wert, int MaxFundeL
MaxFunde = MaxFundeL
EndSelect
Declare int i, j, k, dimen, max_1, max_2, max_3
var int start_1 = 0
var int start_2 = 0
var int start_3 = 0
var int found = 0
var int Funde = 0
var string Erg = "-1"
If InStr("[",PT) > 0 // nur Array erlaubt
If InStr("[]",PT) > 0 // dynamisches Array
max_1 = SizeOf(arr[]) - 1
For i, start_1, max_1
If arr[i] = Wert
If MaxFunde <> 0
Inc Funde
If Erg = "-1" : Erg = Str$(i) : Else : Erg = Erg $ "; " $ Str$(i) : EndIf
If MaxFunde <> -1 : If Funde >= MaxFunde : found = 1 : BREAK : EndIf : EndIf
Else
Erg = Str$(i) : found = 1 : BREAK
EndIf
EndIf
EndFor
Else // dimensioniertes Array arr[n {,n {,n}}]
Dimen = Len(PT) - Len(Translate$(PT, ",", "")) + 1
PT = Del$(PT,1,2)
PT = Del$(PT,Len(PT),1)
max_1 = val(SubStr$(PT, 1, ","))
max_2 = val(SubStr$(PT, 2, ","))
max_3 = val(SubStr$(PT, 3, ","))
Select Dimen
CaseOf 1 // arr[n]
For i, start_1, max_1
If arr[i] = Wert
If MaxFunde <> 0
Inc Funde
If Erg = "-1" : Erg = Str$(i) : Else : Erg = Erg $ "; " $ Str$(i) : EndIf
If MaxFunde <> -1 : If Funde >= MaxFunde : found = 1 : BREAK : EndIf : EndIf
Else
Erg = Str$(i) : found = 1 : BREAK
EndIf
EndIf
EndFor
CaseOf 2 // arr[n,n]
For i, start_1, max_1
For j, start_2, max_2
If arr[i,j] = Wert
If MaxFunde <> 0
Inc Funde
If Erg = "-1" : Erg = Str$(i) + "," + Str$(j) : Else : Erg = Erg $ "; " $ Str$(i) + "," + Str$(j) : EndIf
If MaxFunde <> -1 : If Funde >= MaxFunde : found = 1 : BREAK : EndIf : EndIf
Else
Erg = Str$(i) + "," + Str$(j) : found = 1 : BREAK
EndIf
EndIf
EndFor
Case found : BREAK
EndFor
CaseOf 3 // arr[n,n,n]
For i, start_1, max_1
For j, start_2, max_2
For k, start_3, max_3
If arr[i,j,k] = Wert
If MaxFunde <> 0
Inc Funde
If Erg = "-1" : Erg = Str$(i) + "," + Str$(j) + "," + Str$(k) : Else : Erg = Erg $ "; " $ Str$(i) + "," + Str$(j) + "," + Str$(k) : EndIf
If MaxFunde <> -1 : If Funde >= MaxFunde : found = 1 : BREAK : EndIf : EndIf
Else
Erg = Str$(i) + "," + Str$(j) + "," + Str$(k) : found = 1 : BREAK
EndIf
EndIf
EndFor
Case found : BREAK
EndFor
Case found : BREAK
EndFor
EndSelect
EndIf
EndIf
Return Erg
EndProc
Alles anzeigen