Seite 2 von 2
Re: Rekursion
Verfasst: 28.10.2011 08:23
von Mr.L
STARGÅTE hat geschrieben:@Mr.L:
Bitte nutze immer Character (c) als Struktur für Zeichen.
Stimmt, habe ich nicht dran gedacht.
hier der angepasste Code
Code: Alles auswählen
EnableExplicit
#MAX_WORDLEN = 2
Global *AllowedChars = @"abcdefghijklmnopqrstuvwxyz0123456789"
Global GeneratedWord$ = Space(#MAX_WORDLEN)
Procedure GenerateWords(wordLen = 0)
If wordLen > #MAX_WORDLEN : ProcedureReturn : EndIf
Debug PeekS(@GeneratedWord$ , wordLen)
Protected.Character *CurrentChar = @GeneratedWord$ + wordLen
Protected.Character *nextChar = *AllowedChars
While *nextChar\c
*CurrentChar\c = *nextChar\c
GenerateWords(wordLen + SizeOf(Character))
*nextChar + SizeOf(Character)
Wend
EndProcedure
GenerateWords()
Re: Rekursion
Verfasst: 28.10.2011 12:10
von STARGÅTE
Nicht ganz, in PureBasic muss man sehr genau aufpassen, wann die Anzahl von Bytes erwünscht ist, und dann wirklich die Anzahl an Zeichen erwünscht ist.
Dein
wordLen gibt ja die Länge in Zeichen an, das heißt unter ASCII und Unicode immer die selbe Länge.
Genauso will PeekS, die Länge in Zeichen wissen, nicht in Byte.
Hier mal der funktionierende Code:
Code: Alles auswählen
EnableExplicit
#MAX_WORDLEN = 3 ; Zeichen
Global *AllowedChars = @"01"
Global GeneratedWord$ = Space(#MAX_WORDLEN)
Procedure GenerateWords(wordLen = 0)
If wordLen > #MAX_WORDLEN : ProcedureReturn : EndIf
Debug PeekS(@GeneratedWord$ , wordLen) ; Zeichen
Protected.Character *CurrentChar = @GeneratedWord$ + wordLen*SizeOf(Character) ; Bytes
Protected.Character *nextChar = *AllowedChars
While *nextChar\c
*CurrentChar\c = *nextChar\c
GenerateWords(wordLen + 1) ; Zeichen
*nextChar + SizeOf(Character) ; Bytes
Wend
EndProcedure
GenerateWords()
Hab mal nur 0 und 1 genommen, damit man es besser sieht ^^
Re: Rekursion
Verfasst: 28.10.2011 14:25
von NicTheQuick
Codusa hat geschrieben:@NicTheQuick
Wie bekomme ich eine Mindestlänge rein?
Meinst du so?
Code: Alles auswählen
Procedure Words(maxLen.i)
Protected Dim *word.Character(maxLen + 1)
Protected Dim result.c(maxLen + 1)
Protected i.i
;Hier werden die initialen Zeichen eingestellt
For i = 0 To maxLen - 1
*word(i) = ?Chars
result(i) = *word(i)\c
Next
While (Not *word(maxLen))
Debug PeekS(@result(0))
*word(0) + SizeOf(Character)
If (*word(0)\c = 0)
i = 0
While (*word(i)\c = 0)
If (Not *word(i + 1))
*word(i + 1) = ?Chars
Else
*word(i + 1) + SizeOf(Character)
EndIf
result(i + 1) = *word(i + 1)\c
*word(i) = ?Chars
result(i) = *word(i)\c
i + 1
Wend
Else
result(0) = *word(0)\c
EndIf
Wend
EndProcedure
DataSection
Chars:
Data.s "abcdefghijklmnopqrstuvwxyz0123456789"
EndDataSection
Words(2)
Verfasst: 28.10.2011 15:23
von Mr.L
Danke für die Erklärung, STARGÅTE.
Ich bin aber auch zu verpeilt, heute.

Re: Rekursion
Verfasst: 28.10.2011 19:59
von Codusa
NicTheQuick hat geschrieben:Codusa hat geschrieben:@NicTheQuick
Wie bekomme ich eine Mindestlänge rein?
Meinst du so?
Jup, Danke!
