Hi again, > ... > Following your explanation and example, I tried this and thought it would work > then, but it also failed:
> GNU Guile 2.2.4.1-cdb19 > Enter `,help' for help. > scheme@(guile-user)> ,use (system foreign) > scheme@(guile-user)> (define str-1 "Hello") > scheme@(guile-user)> (define str-2 "there!") > scheme@(guile-user)> (make-c-struct (list '* '*) (list (string->pointer > str-1) > (string->pointer str-2))) $2 = #<pointer 0x55ae02e57830> > scheme@(guile-user)> (parse-c-struct $2 (list '* '*)) > $3 = (#<pointer 0x55ae02f9e3c0> #<pointer 0x55ae02f8b050>) > scheme@(guile-user)> (map pointer->string $3) > $4 = ("" "`\v?\x02?U") Here are another couple of examples: scheme@(guile-user)> ,use (system foreign) scheme@(guile-user)> (define str-1 "Hello") scheme@(guile-user)> (define str-2 "there!") scheme@(guile-user)> (make-c-struct (list '* '*) (list (string->pointer str-1) (string->pointer str-2))) $2 = #<pointer 0x55844635a0b0> scheme@(guile-user)> (parse-c-struct $2 (list '* '*)) $3 = (#<pointer 0x558445edf610> #<pointer 0x558445edf630>) scheme@(guile-user)> (map pointer->string $3) $4 = ("Hello" "there!") But then: scheme@(guile-user)> str-1 $5 = "Hello" scheme@(guile-user)> str-2 $6 = "there!" scheme@(guile-user)> (map pointer->string $3) $7 = ("?\\?q\x7f" " ??E?U") scheme@(guile-user)> (map pointer->string $3) $8 = ("?\\?q\x7f" " ??E?U") I guess that what the GC recollected are the pointers, or even $3, the list Let's hold on it then: scheme@(guile-user)> (define c-struct (make-c-struct (list '* '*) (list (string->pointer str-1) (string->pointer str-2)))) scheme@(guile-user)> (parse-c-struct c-struct (list '* '*)) $9 = (#<pointer 0x558445edf400> #<pointer0x558445ef8df0>) scheme@(guile-user)> (map pointer->string $9) $10 = ("\x02" "0??E?U") Not good either. Let's hold on the parse-c-struct to then: scheme@(guile-user)> (define parsed (parse-c-struct c-struct (list '* '*))) scheme@(guile-user)> parsed $16 = (#<pointer 0x558445edf400> #<pointer 0x558445ef8df0>) scheme@(guile-user)> (map pointer->string $16) $17 = ("0??E?U" "?\x01?F?U") scheme@(guile-user)> (map pointer->string parsed) $18 = ("\x03" "?\x01?F?U") Didn't do it either Ok, let's hold-on to the pointers (which I thought would not be necessary after holding-on c-struct and/or parsed): scheme@(guile-user)> (define p1 (string->pointer str-1)) scheme@(guile-user)> (define p2 (string->pointer str-2)) scheme@(guile-user)> (make-c-struct (list '* '*) (list p1 p2)) $19 = #<pointer 0x5584467a5d70> scheme@(guile-user)> (parse-c-struct $19 (list '* '*)) $20 = (#<pointer 0x5584468b0190> #<pointer 0x5584468b4430>) scheme@(guile-user)> p1 $21 = #<pointer 0x5584468b0190> scheme@(guile-user)> p2 $22 = #<pointer 0x5584468b4430> scheme@(guile-user)> (map pointer->string $20) $23 = ("Hello" "there!") That worked, but I wonder if this is what is expected from us (users)? Cheers, David
pgpKXUPmluVas.pgp
Description: OpenPGP digital signature