Seite 2 von 2
Re: Manueller Zähler
Verfasst: 10.08.2011 01:19
von ullmann
Super, vielen Dank.
Ich habe überlegt, wo du den Aufbau der Character-Struktur her hast - und bin dann darauf gekommen, dass man im Strukturverzeichnis auf die Struktur auch doppelklicken kann. Das wusste ich bisher noch nicht. Ein Test bei Word und Byte ergibt tatsächlich, dass diese auch Strukturen sind. Ich dachte bisher, dass der Basistyp ausgeschrieben (z.B. .Byte statt .b) auch ein Basistyp ist, aber in Wirklichkeit handelt es sich hier um Strukuren. Damit wäre NicTheQuick's *char.Character Definition soweit klar.
Re: Manueller Zähler
Verfasst: 10.08.2011 11:02
von Vermilion
Danke für die Hilfe.

Der code von NicTheQuick hat mir sehr geholfen. Das ist um einiges kompakter als das Gepfusche was ich verbrochen habe.

Re: Manueller Zähler
Verfasst: 11.08.2011 18:48
von KatSeiko
Ich hätte an der Stelle eigentlich das beliebig erweiterbare System genommen, dass es mit Link-Listen gibt. Kommt sogar ohne Struktur aus.
Code: Alles auswählen
Global NewList zahl.s{1}()
AddElement(zahl())
zahl() = "1"
Procedure Increment()
FirstElement(zahl())
If zahl() = "9"
zahl() = "0"
If NextElement(zahl())
zahl() = Str(Val(zahl())+1)
Else
AddElement(zahl())
zahl() = "1"
EndIf
Else
zahl() = Str(Val(zahl())+1)
EndIf
EndProcedure
Procedure Ausgeben()
LastElement(zahl()) ;Nötig weil wir arabische Zahlen haben
text.s = zahl()
While PreviousElement(zahl()) ;Wir gehen also von hinten nach vorne..
text = text + zahl()
Wend
Debug text
EndProcedure
For i = 1 To 12
Increment()
Next
Ausgeben() ;Sollte "13" ergeben
End 42
Da muss man noch etwas schrauben, damit rekursiv jedes Element auf "Wenn 9" überprüft wird. Aber im Großen und Ganzen ist dieses System eigentlich sicher für Zahlen bis der Speicher voll ist.
Re: Manueller Zähler
Verfasst: 12.08.2011 03:06
von NicTheQuick
KatSeiko hat geschrieben:Ich hätte an der Stelle eigentlich das beliebig erweiterbare System genommen, dass es mit Link-Listen gibt. Kommt sogar ohne Struktur aus.
Ich verstehe das Argument nicht. Was ist an Strings denn nicht beliebig erweiterbar?
Re: Manueller Zähler
Verfasst: 13.08.2011 07:29
von 7x7
Ich glaube mich erinnern zu können, dass es von Rings(?) sogar mal hier eine komplettes Stringarithmetikpaket gab. Habe jetzt aber leider keinen Link dazu.
Re: Manueller Zähler
Verfasst: 13.08.2011 11:04
von BSP
Hallo.
Ich habe auch mal ein wenig "gespielt". Smile.
Variante 1 : Dezimal
Code: Alles auswählen
Global a$=Chr(Asc("0")-1)
; Damit die Anzeige auch schön bei NULL beginnt.
stelle=Len(a$)-1
anz_stellen=3
Procedure Hochzaehlen(stelle)
If stelle>=0
a=PeekA(@a$+stelle)+1
If a>Asc("9")
a=Asc("0")
ueberlauf=1
EndIf
PokeA(@a$+stelle,a)
EndIf
ProcedureReturn ueberlauf
EndProcedure
If OpenWindow(1,0,0,400,70,"Zählen",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
txtgadg=TextGadget(1,0,10,WindowWidth(1),40,"0")
SetGadgetFont(1,LoadFont(1,"",30))
;For z=1 To anz_stellen
Repeat
Repeat
If WindowEvent()=#WM_CLOSE
Break 2
EndIf
If Not (WindowMouseX(1)=-1 Or WindowMouseY(1)=-1)
; Maus muss im Window sein
If Hochzaehlen(stelle)
stelle-1
Else
stelle=Len(a$)-1
SetGadgetText(1,a$)
Delay(1) ; Damit das Gadget nicht so blinkt
EndIf
EndIf
Until stelle<0
a$="1"+a$
ForEver
;Next
EndIf
;Repeat:Until WaitWindowEvent()=#WM_CLOSE
End
Variante 2 : Binär
Code: Alles auswählen
Global a$="0"
;Global a$=Space(63);64*64*64)
;a$=ReplaceString(a$,Space(1),"1")
stelle=Len(a$)-1
;anz_stellen=3
Procedure Hochzaehlen(stelle)
If stelle>=0
a=PeekA(@a$+stelle)+1
If a>Asc("1")
a=Asc("0")
ueberlauf=1
EndIf
PokeA(@a$+stelle,a)
endif
ProcedureReturn ueberlauf
EndProcedure
If OpenWindow(1,0,0,800,170,"Zählen",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
txtgadg=TextGadget(1,0,10,WindowWidth(1),40,"0")
SetGadgetFont(1,LoadFont(1,"",30))
edigadg=EditorGadget(2,0,60,WindowWidth(1),WindowHeight(1)-60)
SetGadgetFont(2,LoadFont(2,"",16))
;For z=1 To anz_stellen
Repeat
Repeat
If WindowEvent()=#WM_CLOSE
Break 2
EndIf
If Not (WindowMouseX(1)=-1 Or WindowMouseY(1)=-1)
If Hochzaehlen(stelle)
stelle-1
Else
stelle=Len(a$)-1
SetGadgetText(2,a$)
Delay(1) ; Damit das Gadget nicht so blinkt
SetGadgetText(1,StrU(Val("%"+a$)))
Delay(1) ; Damit das Gadget nicht so blinkt
EndIf
EndIf
Until stelle<0
a$="1"+a$
ForEver
;next
EndIf
End
MfG: BSP
Re: Manueller Zähler
Verfasst: 13.08.2011 18:45
von BSP
Nochmals Hallo.
Das es bei meinen "Spielereien" keine Proteste gab,
wundert mich sehr.
Hatte ich die "Stelle" doch glatt zu weit herunter gezählt.
Habs aber nun verbessert.
Habe in der Procedure nun:
If stelle>=0
eingebaut.
MfG: BSP
Re: Manueller Zähler
Verfasst: 13.08.2011 19:13
von DarkDragon
7x7 hat geschrieben:Ich glaube mich erinnern zu können, dass es von Rings(?) sogar mal hier eine komplettes Stringarithmetikpaket gab. Habe jetzt aber leider keinen Link dazu.
Bignum in einem der älteren PBOSL Pakete.
[bobobo dazu:
http://pbosl.purearea.net/index.php?site=Libs
dort in den 3.94er Sources