Das Board ist doch dazu da, dass man dem anderen hilft. Die Smileys waren ja auch nur dekoration.
Alle buchstaben miteinander verknüpfen?
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
Code: Alles auswählen
; -- beliebig anpassbar ----------------------------
#Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
#PassLength = 3
; --------------------------------------------------
Define i.l, PassPos.l
Define OutputString.s{#PassLength}
Dim CharPos.l(#PassLength - 1)
For i = 0 To #PassLength - 1
CharPos(i) = 1
Next
; -- Beispiel für andere Startzeichen --------------
; CharPos(0) = 3 ; <= setzt die erste Stelle auf "C"
; CharPos(1) = 2 ; <= setzt die zweite Stelle auf "B"
; --------------------------------------------------
Repeat
OutputString = ""
For i = 0 To #PassLength - 1
OutputString + Mid(#Chars,CharPos(i),1)
Next
Debug OutputString
PassPos = 0
Repeat
If CharPos(PassPos) < Len(#Chars)
CharPos(PassPos) + 1
Break
ElseIf PassPos < #PassLength - 1
PassPos + 1
Else
Break 2
EndIf
ForEver
For i = 0 To PassPos - 1
CharPos(i) = 1
Next
ForEverEdit: Code etwas verbessert
Mfg DerProgger
Zuletzt geändert von Sicro am 01.08.2007 16:25, insgesamt 2-mal geändert.
in einem Projekt sinnvolle Kommentare und aussagekräftige VariablennamenPureBasic4.0 hat geschrieben:Ein neues Projekt möchte ich nicht anfangen, weil wenn dann eure antwort da
ist, weiß man nicht mehr, welche Variable, welche LinkedList für was gedacht
war...
zu verwenden ist keine Schande. Dann ist die Chance auch grösser, selbst
nach längerer Auszeit sich schnell wieder in das Projekt einarbeiten zu
können.
Grüße ... Kiffi
a²+b²=mc²
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
@DerProgger: Habe den Code jetzt mal getestet. Das Problem ist aber ,dass die Länge des Strings variabel sein soll. Und da dein Code den String von vorne her aufbaut (nicht wie der Code von Stargate) kann ich ihn leider nicht benutzen. 
@all: Ich bräuchte einen Code, bei dem die Länge des zu erstelllenden Strings variabel ist und in das man einfach wieder einsteigen kann, ohne, dass man wieder von vorne anfangen muss.
@all: Ich bräuchte einen Code, bei dem die Länge des zu erstelllenden Strings variabel ist und in das man einfach wieder einsteigen kann, ohne, dass man wieder von vorne anfangen muss.
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Das kannst du doch ganz einfach erweitern, in dem du die Konstante "PassLength" in eine Variable umänderst, den gesamten Code in eine Prozedur packst, die Prozedur in einer Schleife aufrufst und bei jedem Schleifendurchlauf die PassLength-Variable - die als Parameter der Prozedur übergeben wird - immer um eins erhöhst.PureBasic4.0 hat geschrieben:Das Problem ist aber ,dass die Länge des Strings variabel sein soll.
Auch dies hättest du einfach lösen können, in dem du die ZeilePureBasic4.0 hat geschrieben: Und da dein Code den String von vorne her aufbaut (nicht wie der Code von Stargate) kann ich ihn leider nicht benutzen.
Code: Alles auswählen
For i = 0 To #PassLength - 1Code: Alles auswählen
For i = #PassLength - 1 To 0 Step -1Mein Code war keine fertige Lösung...
Mfg DerProgger
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
@DerProgger: Danke. So ungefähr habe ich den Code heute nacht auch umgeschrieben. Jetzt ist mein Problem, dass er sehr langsam ist. Stargate's Code war mit ca. 250000 Schleifendurchläufen/s ziemlich schnell. Dein Code schafft nur 80000
.
Ich habe jetzt diese Zeile:
durch diese:
ersetzt. Doch leider will das nicht so richtig funktionieren. Was mache ich falsch? Wie könnte man den Code performancemäßig noch aufbessern?
//edit: Habe Len(MyAlphabet$) entfernt und durch eine Variable ersetzt, die die Länge von MyAlphabet$ enthält.
Ich habe jetzt diese Zeile:
Code: Alles auswählen
OutputString$ + Mid(MyAlphabet$,CharPos(i),1)Code: Alles auswählen
OutputString$ + PeekS(@MyAlphabet$+CharPos(i),1)//edit: Habe Len(MyAlphabet$) entfernt und durch eine Variable ersetzt, die die Länge von MyAlphabet$ enthält.
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Code: Alles auswählen
#MaxPassLength = 3
#Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
#FirstChar = 'A'
#LastChar = '9'
Define *PassPointer = AllocateMemory((#MaxPassLength + 2) * SizeOf(Character))
Define *CharsPointer = AllocateMemory((Len(#Chars) + 1) * SizeOf(Character))
Define *CharsPos = AllocateMemory(#MaxPassLength)
Define *Pass.Character, *Chars.Character
Define PlacePos.l, i.l, z.l, Output.s, StringLength.l, StartTime.l
If Not *PassPointer Or Not *CharsPointer Or Not *CharsPos
If *PassPointer: FreeMemory(*PassPointer): EndIf
If *CharsPointer: FreeMemory(*CharsPointer): EndIf
If *CharsPos: FreeMemory(*CharsPos): EndIf
End
EndIf
PokeS(*CharsPointer,#Chars)
; ===================================
; Starte an beliebiger Zeichenfolge
; 1. Stelle: g
PokeB(*CharsPos + 2,32)
PokeC(*PassPointer + 2,'g')
; 2. Stelle: B
PokeB(*CharsPos + 1,1)
PokeC(*PassPointer + 1,'B')
; 3. Stelle: C
PokeB(*CharsPos,2)
; ====================================
;StartTime.l = ElapsedMilliseconds()
Repeat
PlacePos = 0
Repeat
*Pass = *PassPointer + PlacePos
If *Pass\c <> #LastChar
PokeB(*CharsPos + PlacePos,PeekB(*CharsPos + PlacePos) + 1)
*Chars = *CharsPointer + PeekB(*CharsPos + PlacePos) - 1
*Pass\c = *Chars\c
Break
Else
For i = 0 To PlacePos
PokeB(*CharsPos + i,1)
*Pass = *PassPointer + i
*Pass\c = #FirstChar
Next
PlacePos + 1
If PlacePos = #MaxPassLength
Break 2
EndIf
EndIf
ForEver
;Debug PeekS(*PassPointer)
Output = ""
StringLength = MemoryStringLength(*Pass)
For z = StringLength - 1 To 0 Step -1
*Pass = *PassPointer + z
Output + Chr(*Pass\c)
Next
Debug Output
ForEver
;MessageRequester("RunTime",Str(ElapsedMilliseconds() - StartTime) + " ms")
FreeMemory(*PassPointer)
FreeMemory(*CharsPointer)
FreeMemory(*CharsPos)Das Umdrehen benötigt ziemlich viel Zeit, wie du merken wirst, wenn du den Code mal auskommentierst.
Es besteht zwar die Möglichkeit, den String bereits richtig rum zu bearbeiten, aber so muss der String jedesmal komplett um eine Stelle nach rechts verschoben werden, damit das nächste Zeichen vor diesem String gesetzt werden kann. Das habe ich nicht ausprobiert, aber das wird denk ich auch nicht schneller gehen.
Edit: Code etwas verbessert
Mfg DerProgger
Zuletzt geändert von Sicro am 04.08.2007 16:11, insgesamt 5-mal geändert.
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
- PureBasic4.0
- Beiträge: 785
- Registriert: 29.10.2006 17:26
- Wohnort: 127.0.0.1
@DerProgger: Wie kann ich jetzt wieder nach einer Pause an genau derselben Stelle weitermachen, wo ich aufgehört habe? Habe schon versucht, #MaxPassLength, #FirstChar und #LastChar zu verändern, aber das Programm beginnt immer bei A und hört bei 9 auf (mit MaxPassLength = 1). Angenommen ich habe das Programm bei Ba7 beendet, den Fortschritt gespeichert und will jetzt weitermachen. Wie geht das? 
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64