PDA

View Full Version : Why is my string getting trounced?



hinv
11-24-2010, 05:11 AM
Hi,

I found a problem with my program that I cannot figure out. I admittedly don't have a good grasp of the scope of variables in spin, so that may be it, but in the below code dstring keeps getting set to what I type in through the getline function. Any help would be appreciated.

OBJ
ser : "FullDuplexSerial"
dt : "datatransfer" ' The datatransfer object
key : "combokeyboard"
lcd : "jm_lcd4_ez"

PUB Start | time, okay, ofreq, duty, seconds, period, ontime, offtime, whole, frac, dstring

''Test Parallax Serial Terminal number entry and display.
ser.start(31, 30, 0, 9600)

''start the keyboard
key.start(26)
dira[enable]~~ 'set the enable pin direction (pin 1 on LM293)

''Start the LCD
okay := lcd.init(0, 16, 1)


repeat
ser.tx(13)
dstring := String("0.00")
repeat until ofreq > 99 and ofreq < 50_000_01
ser.str(String("Frequency: "))
lcd.scrollstr(1, 1, 16, 250, @askfreq)
lcd.moveto(12,1)
lcd.cursor(2)
dstring := getline
ser.str(String("Dstring: "))
ser.str(dstring)
ser.dec(StrLen(dstring))
ser.tx(13)
ofreq := StrToFreq(dstring)
ser.str(String("Ofreq: "))
ser.Dec(ofreq)
ser.tx(13)
repeat until duty > 4 and duty < 96
ser.str(String("Duty: "))
lcd.scrollstr(1, 1, 16, 250, @askduty)
lcd.moveto(15,1)
lcd.cursor(2)
duty := StrToDec(getline)
repeat until seconds > 0 and seconds < 601
ser.str(String("Seconds: "))
lcd.scrollstr(1, 1, 16, 250, @asksecs)
lcd.moveto(14,1)
lcd.cursor(2)

''why is dstring getting set to what I type in for duty?
ser.str(String("Dstring: "))
ser.str(dstring)
ser.tx(13)

seconds := StrToDec(getline)

''why is dstring getting set to what I type in for seconds?
ser.str(String("Dstring: "))
ser.str(dstring)
ser.tx(13)

PRI getline | i, c
i := 0
repeat
'repeat while (c := ser.rxcheck) < 0 'use serial
c := key.getkey 'use keyboard
if c == Bsp
if i > 0
ser.tx(8) 'send a real backspace
i--
elseif c == Cr
ser.tx(c) ' If serial console, use CR/LF
ser.tx(Lf)
tline[i] := 0
tp := @tline
return tp
elseif i < linelen-1
ser.tx(c)
lcd.out(c)
tline[i++] := c

PUB StrToDec(stringptr) : value | char, index

'' Converts a zero terminated string representation of a decimal number to a value

value := index := 0
repeat until ((char := byte[stringptr][index++]) == 0)
if char => "0" and char =< "9"
value := value * 10 + (char - "0")
if byte[stringptr] == "-"
value := - value

Mike Green
11-24-2010, 05:21 AM
You're not showing everything.

Remember that "getline" always returns the address of "tline" where the input line gets stored. Each time you call "getLine", the array "tline" gets used again and changed to whatever you enter.

When you assign "getline" to something else like "dstring", you're only making a copy of the address of the string (in "tline"), not a copy of the string itself.

wjsteele
11-24-2010, 03:43 PM
You'll need to use one of the copy commands [bytecopy] to copy the string into your buffer instead of just assigning the variable.

Assigning the variable, like Mike says, is just copying the address... so in essense, you're overwriting the same memory space for all three instances of where you use it.

If you use something like bytecopy(@ofreq, @dstring, StrSize(@dstring)) you'll get a better result. Don't forget, you'll have to allocate enough space in ofreq to hold the new string, however.

Bill

hinv
11-25-2010, 03:14 AM
Yep, that's got to be it. I really didn't think through the string thing.

Attached is the full code. It works great using the serial port and the external numeric keypad.
I'm just trying to get a status screen working on the LCD to finish it up.

hinv
11-25-2010, 05:37 AM
Anybody know a good tutorial or example of handling strings in spin?

EmptyBit
12-03-2010, 08:24 PM
I was looking for tutorials myself and had not found any directly, although in the OBEX there are some great d/l's that show how strings are spin-nipulated. Should be good enough to use the concepts for many circumstances within your own code.

http://obex.parallax.com/objects/23/
http://obex.parallax.com/objects/502/
http://obex.parallax.com/objects/529/

$0