World: r3wp
[!REBOL3 Extensions] REBOL 3 Extensions discussions
older newer | first last |
Oldes 5-Dec-2010 [1815x7] | When I have func's arg: void *pixels which should be pointer to allocated binary buffer, how to provide it from the REBOL side? |
Using just RXA_SERIES(frm, 1) does not work. | |
RL_GET_STRING(RXA_SERIES(frm, 1), 0 , (void**)&pixels); doesn't work as well... I think we need RL_GET_BINARY macro... | |
hm... it must be something like: | |
REBYTE *pixels = ((REBYTE *)RL_SERIES((RXA_ARG(frm,7).series), RXI_SER_DATA)); | |
but still miss something important. | |
I'm so stupid! I was testing on wrong data all the time.. the last one is correct:) | |
Andreas 5-Dec-2010 [1822] | Fine that it works :) |
Oldes 5-Dec-2010 [1823x3] | I just would like to know if it's possible for example to change the series tail on C side (and to avoid a need to init the series on REBOL side). |
because now I must do for example this: pixels: make binary! num insert/dup pixels #{00} num before I can use the value in C | |
(I can use it in C without the insert, but I get empty script back to REBOL - there must be updated the TAIL) | |
Andreas 5-Dec-2010 [1826] | Would have to try again, but as far as I remember, RL_SET_VALUE would update the tail. |
Oldes 6-Dec-2010 [1827x2] | When I have func which require something like: double *distortion so it modifies the value of existing REBOL variable, how to do it? |
I know I could just do it with different approach, but I'm still in a learning phase. | |
Cyphre 6-Dec-2010 [1829] | I think you cannot modify such rebol value directly. You have to return it by the command! function. |
Oldes 6-Dec-2010 [1830] | That's the approach I was thinking about. It probably makes a sense as REBOL internal storage may differ. |
BrianH 6-Dec-2010 [1831] | For one thing, REBOL storage is made up of 128bit variant value slots. |
Oldes 6-Dec-2010 [1832] | But I would like to know, if I can just change the provided variable without returning it back as a command result. (as it's possible with series). |
Cyphre 6-Dec-2010 [1833] | yes, for example you never know where the decimal! is in the memory...it can be even just on the stack so or can be GCed so I think it is unsafe to just modify it on the C side and then rely that it'll be reflected on the REBOL side without explicit returned value. |
BrianH 6-Dec-2010 [1834] | All value slots are either in blocks, objects or function contexts (using the generic terms). There are no free value slots. |
Cyphre 6-Dec-2010 [1835] | Oldes, the different situation is for series values (string, image, block...) though. You can directly modify them and use RL_Protect_GC() to make sure GC won't mess with your changes. |
BrianH 6-Dec-2010 [1836] | And you don't have to worry about the GC collecting a double since it will always be in a value slot, so all you have to do is protect the series or context it is in. |
Cyphre 6-Dec-2010 [1837] | Brian, I'm not sure about that. IIRC the value slot of double passed as command! arg is just on the 'function command frame' at the time the command! is executed so it is a copy of the real value you are refering to. |
BrianH 6-Dec-2010 [1838] | He was asking about changing the original. The only way to do that is to pass a reference to the series or context that contains the original value slot. |
Oldes 6-Dec-2010 [1839] | if the frame is just a copy, is it possible to get the original? |
Cyphre 6-Dec-2010 [1840] | yes, that's correct. I though he want's to do something like: d: 0.0 change-decimal d probe d == 1.234 |
BrianH 6-Dec-2010 [1841] | The frame is just another set of value slots that the values are copied into. You can only get the original by passing a reference to the value slot container. There are no free value slots. |
Oldes 6-Dec-2010 [1842] | yes.. that's what I wanted to do:) |
Cyphre 6-Dec-2010 [1843x2] | (whic is not possible) |
yes, that won't work for you | |
Oldes 6-Dec-2010 [1845] | ok |
Cyphre 6-Dec-2010 [1846x4] | because the arg passed to the command function is just a copy of the real value |
you need to return it | |
or as Brian said you could do: d: [0.0] change-decimal d probe d/1 == 1.234 | |
(but you should be using the protext_GC function to be safe) | |
Oldes 6-Dec-2010 [1850x2] | better to avoid it. |
but it a little bit complicates the automatic building of wrappers for functions like that. btw... at this moment I can build imageMagick extension by parsing it's doc (~4500 lines of C code:). Just must solve a few functions where it's using this approach to return multiple values and add some validity checks to make the extension safer. | |
Cyphre 6-Dec-2010 [1852] | Brian: actually the values on the 'command frame' are 'free value slots' as they are not part of any series...they are just in plain fixed size array. But this is probably just playing with words ;) |
BrianH 6-Dec-2010 [1853] | They are in the command frame :) |
Cyphre 6-Dec-2010 [1854x3] | ok :) |
Oldes: I don't think you can do it different way since REBOL has no c-like pointers. | |
The only way is to generate rebol wrapper func which will pass the args in a block! or object! imo. | |
Andreas 6-Dec-2010 [1857] | (Or binary! :) |
Oldes 6-Dec-2010 [1858x3] | ok.. no problem.. I was just asking as I'm learning. It's just something like educative free time project for me as I don't need it.. I use maybe 20 functions of IM in real life. |
(and I could use Jocko's extension for the rest if needed of course) | |
Next question.. when I have: case CMD_MagickGetImageColors: { if(current_wand) { RXA_INT32(frm, 1) = MagickGetImageColors( current_wand); RXA_TYPE(frm, 1) = RXT_INTEGER; } return RXR_VALUE; } While compilation using GCC I get this warning: use of cast expressions as lvalues is deprecated The command is working, just would like to know if I can improve it somehow. The function is defined as: size_t MagickGetImageColors(MagickWand *wand) | |
Andreas 6-Dec-2010 [1861x2] | That's due to how RXA_INT32 is defined. |
Use RXA_INT64 instead, and the warning will go away. | |
Oldes 6-Dec-2010 [1863] | Right.. that's it. |
Oldes 7-Dec-2010 [1864] | Having: double mean, standard_deviation; What I must do to get REBOL block with these two values in it? |
older newer | first last |