Me gustaría llamar a una función C api de Fortran. La función C acepta una matriz de bytes:Fortran: ¿Cómo almacenar el valor 255 en un byte?
void image(const void *bitmap, int w, int h);
donde tres bytes sucesivos en *bitmap
representan un tripple de color RGB y se interpretan como unsigned char
en C. I desea inicializar el mapa de bits en Fortran y cuidar de dibujo dentro de C . definición actual en Fortran utiliza
integer*1 rgbImage(6,2)
para inicializar una imagen de 2x2 por ejemplo, pero compilador no aceptar la asignación
rgbImage(1,1) = 255
para obtener el color rojo. He visto indicios de usar BYTE
, UNSIGNED*1
, LOGICAL*1
para bytes individuales sin signo, pero gfortran (gcc 4.4 o 4.6 de MacPort bajo Mac OS X) no está contento con ninguno de ellos. Probablemente podría escapar engañando y asignando valor -1
en lugar de 255
, pero eso es muy incómodo de usar. La bandera del compilador -fno-range-check
ayudó a compilar el código, pero podría no estar disponible en otros compiladores de Fortran y considero que es una solución desagradable (todavía quisiera ver otra advertencia). Los valores 'FF'X
o '11111111'B
también se reconocen como enteros de 32 bits.
Es muy deseable que el código sea portable en diferentes compiladores Fortran.
Estándar Fortran no admite tipos enteros sin signo. Incluso en 'ISO_C_BIDNING' no hay tipos que correspondan a enteros sin signo en C (a excepción de' C_SIZE_T' y 'C_INTPTR_T' pero todavía se tratan como firmados en Fortran). Algunos compiladores proporcionan tipos sin firmar como una extensión del idioma. Entonces tienes que recurrir a algo como usar 'ACHAR()' como señaló Jonathan Dursi. –