World: r3wp
[Red] Red language group
older newer | first last |
Kaj 18-Jun-2011 [2109] | No, because there's one exception: the type that ALLOCATE and FREE choose to use |
Dockimbel 18-Jun-2011 [2110] | You've lost me...what type are you talking about? |
Kaj 18-Jun-2011 [2111] | They currently use c-string! I'm not sure that's the clearest one. It's unintuitive to me, as if the type returned is very specific and comes with a zero byte at the end |
Dockimbel 18-Jun-2011 [2112] | That is why I have not put c-string! but byte-ptr!. |
Kaj 18-Jun-2011 [2113] | I know, but that gets lost during compilation. What the compiler complains about is that you have to cast to and from c-string! |
Dockimbel 18-Jun-2011 [2114x2] | Do I really need to add a new [pointer! [byte!]] to the compiler just to make this error message looks nicer? |
(I mean adding a new datatype in the compiler). | |
Kaj 18-Jun-2011 [2116] | I think that would be very useful, but that's the more fundamental pointer discussion. I'm now just concerned about making casts the least confusing |
Dockimbel 18-Jun-2011 [2117x2] | I pretty sure that some ppl would complain that [pointer! [byte!]] is exactly the same as c-string!...;-) |
I don't get what is the issue with casting (expect the error message)? | |
Kaj 18-Jun-2011 [2119] | Sure, but I mean, we had two definitions of a generic pointer: integer! or pointer! [integer!]. Why confuse it with c-string! now? |
Dockimbel 18-Jun-2011 [2120x7] | expect => except |
Well, I have already answered that question above. I am sorry if that change breaks existing code. Once again, the C void pointer is a very confusing concept that should not be used outside of C language. If you refer to a C void pointer without any context, it is just a memory address, so integer! (or handle!) would be the closest corresponding concept. If you refer to a C function returning a void pointer like malloc(), the closest transposition in Red/System would be ALLOCATE returning a byte! pointer. | |
Malloc() allocates a memory region that granularity is by default a byte (until you cast is to something else). | |
So, in summary, there is no 1 to 1 transposition of the C void pointer concept in Red/System, it is 1 to 2 (or more), depending on the context. | |
If you would write a C function such as: void *bar() { return((void *)&foo);) where foo would be another function. If I had to make a binding to this function from Red, I would use integer! (or preferably the handle! macro) to define the return value. | |
Six months ago, I wanted to introduce an address! type to be the equivalent of C void pointer. It would have worked as an integer!. But as it would have been only used to in C binding definitions, I thought it would be a waste to have a first-class datatype just for that, when integer!, pointer! [...], or a macro could do the same job. | |
If [pointer! [byte!]] could do the job and make C coders happy, I will add it to Red/System. | |
Kaj 18-Jun-2011 [2127x5] | I'm not concerned with all that here. Let me make this very concrete. In runtime/common.reds, changing |
#define byte-ptr! c-string! | |
to | |
#define byte-ptr! pointer [integer!] | |
Would solve all my current concerns | |
Dockimbel 18-Jun-2011 [2132] | Well, this is certainly not the right definition a byte! pointer. :-) Can't you wait until monday when all the current issues regarding NULL and documentation will be fixed? |
Kaj 18-Jun-2011 [2133x3] | We have been aware that pointer [integer!] does not accurately describe a pointer [byte!] but you don't want to implement that in the current development cycle and that's fair enough. It's only a cosmetic problem right now |
Originally I though binary! was going to fulfill this role, but it was removed | |
Will the NULL enhancement change the types handled by ALLOCATE and FREE to one generic pointer definition? Let's stop calling it void, but instead variant, which it really is | |
Dockimbel 18-Jun-2011 [2136] | Binary!: you're right, that was an option I considered at the beginning. But I thought that it would be even more confusing for REBOL coders. |
Kaj 18-Jun-2011 [2137x2] | It felt very natural to me |
We're in a morass now ;-) | |
Dockimbel 18-Jun-2011 [2139x4] | Think about ppl that would have complained about LENGTH? not working on binary! type. ;-) |
No, that would not change the types of ALLOCATE and FREE, I would only change them to pointer! [byte!] when it will be available. | |
There is no generic pointer in Red/System. | |
Even if binary! was there, it would work as a byte! pointer. | |
Kaj 18-Jun-2011 [2143x3] | I thought so, so ALLOCATE and FREE will still deliver types that I wouldn't expect from them, and that effectively introduce an extra definition of a variant pointer |
The LENGTH? example is interesting, because people will now use it on an allocated binary, expecting that it's zero-terminated, and even if it is, the expected length will be off by one | |
Or much more if there's a zero somewhere in the middle | |
Dockimbel 18-Jun-2011 [2146] | You're extrapolating from the error message. The definition says "byte-ptr!" not "c-string!". |
Kaj 18-Jun-2011 [2147x2] | Yes, that's a fundamental problem with a preprocessor |
But the more tangible problem is that currently, you don't have to cast when you allocate a string, and that will change when a proper byte pointer is introduced | |
Dockimbel 18-Jun-2011 [2149] | Right, but this is an alpha, not a v1. Maybe I should postpone the beta announcement by a month or two? |
Kaj 18-Jun-2011 [2150x2] | You don't have to, because the fix is only half a line, and I don't need it before Monday |
Anyway, I've brought forward my concerns; that's all I can do | |
Dockimbel 18-Jun-2011 [2152] | Well, thanks for the feedback, I will think about all the possible options. |
Kaj 18-Jun-2011 [2153x2] | OK, thanks |
I see you're using byte! definitions for C functions that take integer! parameters. Is that guaranteed to be interpreted as an integer? | |
Dockimbel 18-Jun-2011 [2155] | Are you referring to memset() wrapper? |
Kaj 18-Jun-2011 [2156] | Yes. What's the conversion applied there? |
Dockimbel 18-Jun-2011 [2157x2] | No conversion at all. The memset case is a old C oddity that never got fixed. It should have a byte in the declaration instead of int. The algorithm in memset uses a byte and not an int, so the Red/System binding is not only safe, but also cleaner than the C one. The memset oddity is explained there: http://stackoverflow.com/questions/5919735/why-does-memset-take-an-int-instead-of-a-char |
Jocko, answering your questions: - is this correct ? Yes, I tested it here, works flawlessly. - how and where de-allocate the c-string ? Same as in C, when you don't need it anymore. So in your code example, it would be after "print res". - why the end-string symbol is not added automatically ? Red/System is a low-level language, it treats c-string! as C does with string, the trailing zero is only a convention. If ReadConsole() doesn't add a trailing zero, only the programmer knows if and where it should be added. Red/System can only add automatically trailing zero on literal c-string! because, in that case, it can easily guess where the c-string! ends. | |
older newer | first last |