PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Strings sind nicht lang genug



Elektronik303
31.03.2007, 02:27
Hi,

ich hab folgenen code, mit dem ich text eingeben kann, nur irgendwann nach dem ca. 250ten Zeichen das ich eingebe kommt der gesamte eingegebene text auf dem display verstreut angezeigt.



$lib "lcd4busy.lbx" 'ersetzt die Standard LCD Bibliothek
$regfile = "m644def.dat"
$crystal = 8000000
$baud = 19200

Config Lcd = 16 * 2
Const _lcdport = Portc
Const _lcdddr = Ddrc
Const _lcdin = Pinc
Const _lcd_e = 1
Const _lcd_rw = 2
Const _lcd_rs = 3
Dim A As Integer
Dim B As String * 1
Dim Zeile As String * 999
Dim Zeichen As Integer
Dim Fzeichen As Integer
Dim Chapter As Integer
Config Keyboard = Pind.5 , Data = Pind.6 , Keydata = Keydata
Initlcd
Cursor Off Noblink
Cls
Config Pind.7 = Output
Portd.7 = 1 'Beleuchtung

Zeile = ""
A = 0
B = ""
Zeichen = 0
Cursor On Noblink
Do


A = Getatkbd()

If A > 0 And A <> 7 And A <> 42 And A <> 8 Then
Cls
If A = 121 Then
A = 122
Elseif A = 122 Then
A = 121
End If

B = Chr(a)
Zeile = Zeile + B
End If

If A = 42 Then
Cursor Off Noblink
Chapter = 16
Do
A = Getatkbd()
If A = 54 Then Chapter = Chapter + 5
If A = 52 And Chapter > 16 Then Chapter = Chapter -5
Locate 1 , 1
Lcd Left(zeile , Chapter)
Loop Until A = 13
Cls
Lcd "Wait..."
Waitms 100
Cls
A = 0
Cursor On Noblink
End If


If A = 7 Then
Cls
Zeile = ""
End If

If A = 8 Then
Zeichen = Len(zeile) - 1
Zeile = Left(zeile , Zeichen)
Cls
End If

Locate 2 , 1
Fzeichen = 999 - Len(zeile)
Lcd "F. Zeichen:" ; Fzeichen
Locate 1 , 1
If Len(zeile) > 16 Then Lcd Right(zeile , 15)
If Len(zeile) <= 16 Then Lcd Zeile

Loop


Keydata:
' Shift-Taste nicht gedrückt
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

' Shift-Taste gedrückt
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0



Kann der String nur maximal 250 Zeichen lang sein oder liegts am Display oder woran sonst??? Wahrscheinlich hört es bei 255 Zeichen auf und es liegt daran das Bits nur bis 255 gehen, aber wie könnte ich es dann umgehen?

Mfg

Elektronik303

Ratber
31.03.2007, 07:59
Kann der String nur maximal 250 Zeichen lang sein oder liegts am Display oder woran sonst???

Ein Blick in die Bascom-Hilfe hätte die Frage schon längst vollständig beantwortet.

Unter "Language Fundamentals" steht "String (up to 254 bytes)......" ;)
Bacom checkt beim Compilieren zwar ob der String ins Ram paßt aber nicht ob die Längenangabe auch gültig ist sonst hättest du beim Compilieren eine Fehlermeldung bekommen.
Ich habs mal als Anmerkung an MCS gemailt


Wahrscheinlich hört es bei 255 Zeichen auf und es liegt daran das Bits nur bis 255 gehen,

Richtig,die Grenze liegt darin das 8 Bit (1 Byte) als Längenangabe genutzt wird.

In der Bascom-Hilfe geht der obige Satz weiter mit

"....Strings are stored as bytes and are terminated with a 0-byte. A string dimensioned with a length of 10 bytes will occupy 11 bytes.
"

Damit ist dann auch schon fast erklärt warum ein String von den maximal 256 Byte nur 254 Zeichen lang sein kann.
1 Zeichen für "Ende" (0-Byte) und ein weiteres vermutlich für Verwaltungszwecke.



aber wie könnte ich es dann umgehen?

Wenn du also unbedingt deine 999 Zeichen haben möchtest dann kannst du sie entweder auf 4 oder mehr Strings aufteilen ,ein Array draus machen oder du verwaltest sie gänzlich eigenständig indem du sie manuell speicherst.

MartinFunk
31.03.2007, 09:59
Wie währe es wenn du eine 16bit variable nehmen würdest?

Martin

Ratber
31.03.2007, 10:27
Wie währe es wenn du eine 16bit variable nehmen würdest?

Martin

??

Ich glaub du bist auf dem falschen Dampfer

Der Zähler für Stringvariablen ist ein interner Zähler.
8-bittig ist er weil die Entwickler bei MCS es eben so festgelegt haben.

MartinFunk
31.03.2007, 10:39
Oh sorry, :oops:
hab mich da verdenkt.

Martin

Elektronik303
31.03.2007, 11:08
Ich kann ja mal ne Mail zu den Entwicklern schicken und mich beschweren ;-) Ne also dann muss ich das wohl aufteilen. Danke!

Ratber
31.03.2007, 12:01
@Martin


Oh sorry, Embarassed
hab mich da verdenkt.

Macht ja nix.


@Elektronik


Ich kann ja mal ne Mail zu den Entwicklern schicken und mich beschweren

Ja,mach ruhig.
Je mehr Leute sich was wünschen desto warscheinlicher wird es gemacht.
Ich bin auch immer Frei mit Ideen.



Ne also dann muss ich das wohl aufteilen.

Ich würde Arrays nehmen.

Da du ja eh jedes Zeichen einzeln einliest kann man das schön mit 2 Zählern machen.

Edit: immer diese Schreibfehler

Elektronik303
31.03.2007, 14:34
Hmm dann mach ichs mit Arrays ;-) Mail hab ich grad geschickt ^^