Passing text/strings as a byte ptr?

BlitzMax Forums/BlitzMax Beginners Area/Passing text/strings as a byte ptr?

SculptureOfSoul(Posted 2006) [#1]
[edit] Actually, you can ignore this. I've decided to bite the bullet and just go in and modify the String source to suit my needs.


Okay, so I'm working on implementing my own string type and I've got a question regarding the underlying way BMax is going to handle something.

Here's the beginning of my type


Now, if I do this
Global test$ = "This is only a test"
Global str:TString
str = TString.Constructor( test , test.length )
Print str.ReturnString()


The code does, for some reason, work. The line

Print str.ReturnString()

Does in fact return the expected text. However, modifying the m_data field has no effect whatsoever on the original string "test$'. This leads me to believe that when a string is passed into a function expecting a byte ptr (as Constructor() does), it converts itself to a normal C-string. That's fine.

What I'm curious about tho, is - if I simply pass an undefined and undeclared chunk of text into the function - how will that be handled. What will happen if I do this
str = TString.Constructor( "random text", 11 )


Calling ReturnString() works as expected. The code works. I'm just worried that when I pass in a character array, BMax is actually creating a String object out of it, and then calling .ToCString to return a byte ptr to the function.

I'm trying to avoid the extra copying and overhead of the ToCString() call, so if what I suspect above is actually happening, how might I pass some text into the function without the overhead?


SculptureOfSoul(Posted 2006) [#2]
Oh, and does anyone know why I can pass a string in to a function expecting a byte pointer, and it works - yet Bmax does not automatically convert a String to a byte pointer anywhere else...i.e.
str:string
bptr:byte ptr
bptr = string


returns the error "Unable to convert string to byte pointer."


Gabriel(Posted 2006) [#3]
Aren't Strings objects? If they are, it's my soapbox subject again, the old AnyObjectType->Byte Ptr implicit conversion in functions, even in SuperStrict. I still *really* think it's wrong to allow implicit type conversions like this in SuperStrict. Even more so when you apparently can't even do it explicitly. I thought the whole point of SuperStrict was to force the programmer to be explicit.


Dreamora(Posted 2006) [#4]
The correct version of above code:
str:string
bptr:byte ptr
bptr = string.toCString()  'or .toWString() if unicode


Reason is, as Gabriel mentions, that strings are objects and not array of char as in C


SculptureOfSoul(Posted 2006) [#5]
I'm aware that they're objects -but I feel like Gabriel

I still *really* think it's wrong to allow implicit type conversions like this in SuperStrict. Even more so when you apparently can't even do it explicitly.



What happens to the memory allocated by the implicit conversion after the function completes? What happens if that function got called 1000's of times?


Dreamora(Posted 2006) [#6]
I see, you start to see the point why Byte Ptr usage should be restricted to extern blocks instead of messing the garbage collector managed "world" with unmanaged data.