Are you sure that, now that each constant has a fixed integer value, the compiler is allowed to represent this internally as anything else than an int?
Check it out. If not, you know it's an int, so you could just typecast

2012/2/5 Álvaro Castro-Castilla <alvaro.castro.castilla@gmail.com>
This is the definition  in C:

typedef enum _cairo_format {
    CAIRO_FORMAT_INVALID   = -1,
    CAIRO_FORMAT_ARGB32    = 0,
    CAIRO_FORMAT_RGB24     = 1,
    CAIRO_FORMAT_A8        = 2,
    CAIRO_FORMAT_A1        = 3,
    CAIRO_FORMAT_RGB16_565 = 4
} cairo_format_t;


AFAIK, bindings in Gambit usually deal with this as an integer, but with C++ enabled, conversion is needed.




2012/2/5 Mikael <mikael.rcv@gmail.com>


2012/2/5 Álvaro Castro-Castilla <alvaro.castro.castilla@gmail.com>
Hi!

I open a new thread, because this is a deeper issue than the C++ enums conversion problem.

When I declare this:

(define CAIRO_FORMAT_RGB24 ((c-lambda () cairo-format-t "___result = CAIRO_FORMAT_RGB24;")))

or:
(define CAIRO_FORMAT_RGB24 (c-lambda () cairo-format-t "___result = CAIRO_FORMAT_RGB24;"))
and then call
(CAIRO_FORMAT_RGB24)

my program segfaults. It seems that just executing that c-lambda, returning an enum, fails. The enum is defined as:  (c-define-type cairo-format-t "cairo_format_t")

Ouch - your declaration makes Gambit identify, I think, cairo_format_t as a C structure, and tries to copy its contents fully. Hmm. If this is not how it really is, do (c-define-type cairo-format-t integer) or sth?

I don't understand why this segfaults: 1) I'm declaring the type 2) I'm returning the proper type. What's the problem?


Best regards,

Álvaro

_______________________________________________
Gambit-list mailing list
Gambit-list@iro.umontreal.ca
https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list