Manueller Zähler
Re: Manueller Zähler
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.
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.
- Vermilion
- Beiträge: 1846
- Registriert: 08.04.2006 16:00
- Computerausstattung: Apple iMac (2010) & HP Notebook
- Wohnort: Heidekreis
Re: Manueller Zähler
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
Ich hätte an der Stelle eigentlich das beliebig erweiterbare System genommen, dass es mit Link-Listen gibt. Kommt sogar ohne Struktur aus.
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.
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
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Manueller Zähler
Ich verstehe das Argument nicht. Was ist an Strings denn nicht beliebig erweiterbar?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.
Re: Manueller Zähler
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.
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
- unkommentierter Quellcode = unqualifizierter Müll
Re: Manueller Zähler
Hallo.
Ich habe auch mal ein wenig "gespielt". Smile.
Variante 1 : Dezimal
Variante 2 : Binär
MfG: BSP
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
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
PB 5.31 (x86) & (x64) Win10
Re: Manueller Zähler
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
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
PB 5.31 (x86) & (x64) Win10
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: Manueller Zähler
Bignum in einem der älteren PBOSL Pakete.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.
[bobobo dazu:
http://pbosl.purearea.net/index.php?site=Libs
dort in den 3.94er Sources
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.