World: r4wp
[#Red] Red language group
older newer | first last |
Kaj 2-Jul-2013 [9152] | How do you mean? Initialising means assigning a value |
Bo 2-Jul-2013 [9153] | What I mean is this: file1: make-c-string 128 append-string append-string file1 "dir/" "file.txt" |
Kaj 2-Jul-2013 [9154x2] | But you did assign a value there: a memory block of 128 bytes |
The only problem with using it as a target is that it may not be initialised as an empty string. For that, it needs to hold a null byte marker | |
Bo 2-Jul-2013 [9156] | In my tests, it did not work. How do I initialize it with a null byte marker? Like this? file1: make-c-string 128 file1: #"^(00)" append-string append-string file1 "dir/" "file.txt" |
Kaj 2-Jul-2013 [9157] | file1/1: #"^(00)" |
PeterWood 2-Jul-2013 [9158] | There is also a pre-defined constant "null-byte" available: file1/1: null-byte |
Bo 2-Jul-2013 [9159] | Oh no! Just found a bug in the Linux-ARM version of Red/System. It has to do with string handling, but I haven't isolated yet. Will post here once I do. |
Kaj 2-Jul-2013 [9160] | If you're lucky, it may be fixed in the dyn-lib-emitter branch |
Bo 2-Jul-2013 [9161x2] | It appears to have something to do with pointers and 'append-string. |
Consider the following code snippet: print-line file1 append-string file1 "/img00.bin" print-line file1 On Windows, it outputs: to-process/2013-06-29-20-18-55.h264 to-process/2013-06-29-20-18-55.h264/img00.bin The exact same code on Linux-ARM outputs: to-process/2013-06-29-20-19-06.h264 /img00.bin/2013-06-29-20-19-06.h264 | |
Kaj 2-Jul-2013 [9163] | Odd. The append somehow considers the string empty on ARM, but it doesn't close the appended part with a null byte, either |
Bo 2-Jul-2013 [9164] | That's what I was thinking. |
Kaj 2-Jul-2013 [9165] | Could you print the string lengths, as well? |
Bo 2-Jul-2013 [9166] | How does one do that? |
Kaj 2-Jul-2013 [9167] | length? file1 |
Bo 2-Jul-2013 [9168] | That's too much like Rebol. |
Kaj 2-Jul-2013 [9169x2] | We could distort it :-) |
The append is done by the C library, so if it doesn't append a null byte, that would explain it | |
Bo 2-Jul-2013 [9171x3] | OK. That's just weird. With the following code snippet: print-line [file1 " " length? file1] append-string file1 "/img00.bin" print-line [file1 " " length? file1] We get these results on Linux-ARM: 36process/2013-06-29-20-18-55.h264 /img00.bin 4613-06-29-20-18-55.h264 |
It looks like the problem is happening before the 'append-string. | |
Here is a more complete snippet ending with what I posted above: file1: make-c-string 128 copy-string file1 "to-process/" append-string file1 first-line file3: make-c-string 128 copy-string file3 file1 print-line [file1 " " length? file1] append-string file1 "/img00.bin" print-line [file1 " " length? file1] The above works perfectly on Windows. | |
Kaj 2-Jul-2013 [9174] | Did you update the binding yet? I've reversed the argument order of COPY |
Bo 2-Jul-2013 [9175x2] | No |
With the updated ANSI.reds, I get the following error when compiling now: *** Compilation Error: argument type mismatch on calling: copy-string *** expected: [integer!], found: [c-string!] *** in file: %motion-detect.reds *** at line: 47 *** near: [ append-string file1 first-line file3: as c-string! allocate 128 ] | |
Kaj 2-Jul-2013 [9177x2] | Sorry, messed that up |
Fixed it | |
Bo 2-Jul-2013 [9179x3] | Now I get this beautiful output: ¢÷¶¢÷¶ÿÿÿÿð£÷¶ð£÷¶ 20 ¢÷¶¢÷¶ÿÿÿÿð£÷¶ð£÷¶/img00.bin 30 ¢÷¶¢÷¶/img00out.bin *** Runtime Error 1: access violation *** at: B6EC5C0Ch |
I must be doing something wrong... | |
At least the lengths are showing up in the right place... | |
Kaj 2-Jul-2013 [9182] | It seems that the 36 is one too high. Does it also print that on Windows? |
Bo 2-Jul-2013 [9183x2] | Here's Windows: ¢÷¶¢÷¶ÿÿÿÿð£÷¶ð£÷¶ 20 ¢÷¶¢÷¶ÿÿÿÿð£÷¶ð£÷¶/img00.bin 30 ¢÷¶¢÷¶/img00out.bin *** Runtime Error 1: access violation *** at: B6EC5C0Ch |
Sorry, here's Windows: +?3+?3 6 +?3+?3/img00.bin 16 x?3 8?3/img00out.bin *** Runtime Error 1: access violation *** at: 77C47AB4h | |
Kaj 2-Jul-2013 [9185] | Did you reverse copy-string file3 file1 ? |
Bo 2-Jul-2013 [9186x3] | No. That would probably be important. |
But with it reversed, it looks strange. It's the opposite of the order of 'append-string, 'find-string and all those other operations now. | |
Do I also reverse 'copy-string-part? | |
Kaj 2-Jul-2013 [9189x4] | Yes, I think it's a more natural order. You copy or move from to |
Here on Intel Linux I get: | |
to-process/2013-06-29-20-18-55.h264 35 to-process/2013-06-29-20-18-55.h264/img00.bin 45 | |
Without the reversal, you were overwriting file1 with random memory from file3 | |
Bo 2-Jul-2013 [9193x2] | Yes, I can see that now. |
Works fine on Windows again, but on Linux-ARM I'm still getting messed up: 36process/2013-06-29-20-19-37.h264 /img00.bin 4613-06-29-20-19-37.h264 | |
Kaj 2-Jul-2013 [9195x2] | Everything points to null endings lacking |
Is that on Arch Linux? | |
Bo 2-Jul-2013 [9197] | No, I'm using Raspbian Wheezy right now. |
Kaj 2-Jul-2013 [9198] | Odd, that's probably just the GNU C library |
Bo 2-Jul-2013 [9199] | Based on Debian, so probably. |
Kaj 2-Jul-2013 [9200] | Try adding an explicit null marker after each append |
Bo 2-Jul-2013 [9201] | OK. Currently 42C (108F) outside my house. My small window air conditioner can't keep up. My fingers are slipping on the keys. |
older newer | first last |