Seite 1 von 1

Argument nicht optional

Verfasst: Mo, 19.09.2005 10:55
von Christian K.
Kann mir einer bitte erklären wo mein Fehler liegt?
Ich bekomme immer die fehlermeldung: Argument nicht optional für die Zeile: IsBitSet = GetBitNum( nBits, nBitNum ) > 0

Hier der Code! Die BitManipultaionFunctions sind aus dem Englischem OOo Forum und sollten eigentlich problemlos laufen. Von mir, zum Testen der Funktionen stammt nur testBitFunction

Code: Alles auswählen

'############################################################
'   Bit manipulation functions.
'############################################################


' Return True if a particular bit in nBits is set.
' Bit 0 is the least significant bit.
'Function IsBitSet(nBits As Long, nBitNum As Integer ) As Boolean
 '  IsBitSet = GetBitNum( nBits, nBitNum ) > 0
'End Function


' Return a particular bit from nBits.
' Bit 0 is the least significant bit.
Function GetBitNum(ByVal nBits As Long, ByVal nBitNum As Integer ) As Long
   Do While nBitNum > 0
      nBitNum = nBitNum - 1
      nBits = Int( nBits / 2 ) ' shift right
   Loop
   GetBitNum = nBits Mod 2
End Function



' Set a particular bit in nBits.
' It does not matter what the previous status of the bit was,
'  end ends up as a 1 bit.
' Bit 0 is the least significant bit.
Function SetBit( ByVal nBits As Long, ByVal nBitNum As Integer ) As Long
   nBit = 1
   Do While nBitNum > 0
      nBitNum = nBitNum - 1
      nBit = nBit * 2 ' shift left
   Loop
   SetBit = nBits Or nBit
End Function



' Clear a particular bit in nBits.
' It does not matter what the previous status of the bit was,
'  end ends up as a 0 bit.
' Bit 0 is the least significant bit.
Function ClearBit( ByVal nBits As Long, ByVal nBitNum As Integer ) As Long
   Dim nBit As Long
   nBit = 1
   Do While nBitNum > 0
      nBitNum = nBitNum - 1
      nBit = nBit * 2 ' shift left
   Loop
   ClearBit = nBits And (Not nBit)
End Function 

Sub testBitFunction
	Dim nBit as Long
	nBit = "1001001011011"
	msgbox GetBitNum(nBit, 2)
End Sub

Verfasst: Mo, 19.09.2005 14:47
von Toxitom
Hey Christian,
Ich bekomme immer die fehlermeldung: Argument nicht optional für die Zeile: IsBitSet = GetBitNum( nBits, nBitNum ) > 0
Hmm, ich bekomme eine andere Fehlermeldung:

Überlauf! Unzulässiger Wert in Zeile : nBit = "1001001011011"

Na ja, ist als "Long" auch ein wenig groß! (Long von +2147483648 bis -2147483648).

Beim Durchschuene des Codes fällt mir noch ein weiterer Fehler auf:
Es müsste eigentlich heißen:

Code: Alles auswählen

 nBits = Int( nBits / 10 ) ' shift right  
statt / 2 -> sonst funktioniert es nicht!

Verbessert man das, so funktioniert der Code einwandfrei (Bit 0 ist das letzte Bit!)

Gruss
Thomas

Verfasst: Mo, 19.09.2005 15:11
von Christian K.
Also ich muss sagen auch mit der Anpassung an Double Zahlen und mit der Korrektur "/ 10" kommt bei mir teilweise immernoch echter Murks raus.

Bei mir ging es bei der Funktion darum bei 11 Checkboxen jeweils den Wert auf Ja/Nein zu ändern mit nur einem Eintrag in einer Datenbank. Deswegen kommt hier auch die Binärschreibweise zum einsatz! (Also 11 Stellen jeweils 1 = ja oder 0 = nein).
Da dieses Formular auch mehr als 11 Stellen bekommen wird, zeigte sich auch schnell dass diese Funktion nicht mit großen Binärzahlen umgehen kann!

Meine Lösung die ich jetzt gemacht habe lautet folgendermassen:
(Nur Codefragmente da alles den Rahmen dieses Threads sprengen würde!)

Code: Alles auswählen

Sub hakenSetzen(dualityDirekt)
	oDialog.getControl("lf1").state = machsKleiner(dualityDirekt) Mod 2
	oDialog.getControl("lf1e").state = (machsKleiner(dualityDirekt) / 10) Mod 2
	oDialog.getControl("lf2").state = (machsKleiner(dualityDirekt) / 100 ) Mod 2
	oDialog.getControl("lf3").state = (machsKleiner(dualityDirekt) / 1000 ) Mod 2
	oDialog.getControl("lf4").state = (machsKleiner(dualityDirekt) / 10000 ) Mod 2
	oDialog.getControl("lf5").state = (dualityDirekt / 100000) Mod 2
	oDialog.getControl("lf6").state = (dualityDirekt / 1000000) Mod 2
	oDialog.getControl("lf7").state = (dualityDirekt / 10000000) Mod 2
	oDialog.getControl("lf8").state = (dualityDirekt / 100000000) Mod 2
	oDialog.getControl("marktDeutsch").state = (dualityDirekt / 1000000000) Mod 2
	oDialog.getControl("marktEnglisch").state = (dualityDirekt / 10000000000) Mod 2

End Sub

Code: Alles auswählen

Function machsKleiner(ByVal binaer as Double) as Double
	While binaer > 100000
	binaer = binaer - (10 ^ (Len(binaer)-1))
	Wend
	machsKleiner = binaer	
End Function
Die Funktion "machsKleiner" existiert nur da bei Teilern < 10000 ein Datenüberlauf stattgefunden hat. Deswegen kürzt diese Funktion die ersten Stellen der 11 stelligen Binärzahl einfach weg und die Mod 2 Rechnung funktioniert wunderbar!
Vielleicht hilfts ja jemand anderem weiter :)