Vorrei chiamare una funzione C api da Fortran. La funzione C accetta un array di byte:Fortran: come memorizzare il valore 255 in un byte?
void image(const void *bitmap, int w, int h);
dove tre byte successivi *bitmap
rappresentano una tripla colore RGB e vengono interpretati come unsigned char
in C. voglio inizializzare la bitmap in Fortran e curare disegno all'interno C . definizione attuale in Fortran utilizza
integer*1 rgbImage(6,2)
per inizializzare l'immagine di 2x2 per esempio, ma compilatore non accetterà assegnazione
rgbImage(1,1) = 255
per ottenere il colore rosso. Ho visto suggerimenti sull'uso di BYTE
, UNSIGNED*1
, LOGICAL*1
per singoli byte non firmati, ma gfortran (MacPort's gcc 4.4 o 4.6 in Mac OS X) non è davvero soddisfatto di nessuno dei due. Probabilmente potrei scappare barando e assegnando il valore -1
invece di 255
, ma questo è molto scomodo da usare. Il flag del compilatore -fno-range-check
ha aiutato a compilare il codice, ma potrebbe non essere disponibile in altri compilatori Fortran e lo considero una soluzione brutta (vorrei comunque rilevare altri avvisi). I valori 'FF'X
o '11111111'B
sono anche riconosciuti come numeri interi a 32 bit.
È altamente auspicabile che il codice sia portatile tra diversi compilatori Fortran.
Fortran standard non supporta i tipi di numeri interi senza segno. Anche in 'ISO_C_BIDNING' non ci sono tipi che corrispondono a interi senza segno in C (eccetto per' C_SIZE_T' e 'C_INTPTR_T', ma sono ancora trattati come firmati in Fortran). Alcuni compilatori forniscono tipi senza segno come estensione della lingua. Quindi devi ricorrere a qualcosa come usare 'ACHAR()' come indicato da Jonathan Dursi. –