Fortran 2003 Interfész OpenGL « science
Script: http://www-stone.ch.cam.ac.uk/pub/f03gl/
A F03GL könyvtár
A F03GL könyvtár Fortran 2003 interfész az OpenGL könyvtár, valamint a GLU és GLUT eszköztárakat. Úgy fejlesztették ki Anthony kő és Aleksandar Donev. Már kapott hasznos visszajelzést több felhasználó e könyvtár és hálásak vagyunk a javaslatokat. Van még mit javítani, és mi szívesen fogadni további észrevételeket és hibajelentéseket.
Az összes forrás kód társított F03GL könyvtár letölthető ZIP-archívum f03gl.zip vagy gzip tarfile f03gl.tgz. Van egy README file megadja az alapvető utasításokat kicsomagolás és összeállítása a fájlokat és a tesztek futtatását. A csomag feltételei szerint terjeszthető a GNU General Public Licence, 3-as verzió.
F03GL használja a C kölcsönös átjárhatóságáról jellemzői Fortran 2003 kötődik, a C interfész OpenGL. Ezért minden olyan rendszer, amely egy OpenGL könyvtár fej- és Fortran fordító, amely támogatja a C interoperabilitás tudja használni ezt a felületet könnyen. Ebben az értelemben, F03GL eltér a f90gl könyvtár William F. Mitchell, talált http://math.nist.gov/f90gl/. Hogy a könyvtári végre a hivatalos Fortran 90 OpenGL felület (elfogadott OpenGL Architecture Review Board), leírt NISTIR 6134. használ fordító specifikus göngyölő végrehajtása érdekében a Fortran kötések, és nem használja a Fortran 2003 jellemzői. A F03GL könyvtár célja, hogy egy nagyon világos felület a C könyvtár, minimális használatával csomagolóanyagok, és a legkisebb használata nem szabványos vagy processzor függő funkciók, mint lehetséges. A különbség F03GL és NISTIR 6134 leírása végén ezt az oldalt. Az átalakítás a kódokat a Fortran 90 felületet be kell vonni, minimális erőfeszítéssel. Mi alakítjuk több a példa a f90gl elosztó használata F03GL és elismerjük a hála Dr. Mitchell erre engedélyt. Sok további példák használata OpenGL rutinok Fortran és a F03GL csomag megtalálható a dolfyn honlapján.
Generálása Forrás kódok F03GL
A Fortran forráskódok modulokat tartalmaz paraméterrel nyilatkozatokat, INTERFACE blokkokat, és egy minimális csomagolást automatikusan generálja a Perl script. Az egyik célunk az, hogy fejlesszen ki olyan eszközöket, amelyek könnyen automatizálható az átalakítás C header fájlokat Fortran modulok és az erre a célra teszünk munka Craig Rasmussen a LANL fejleszteni XML stíluslapok kell használni erre a célra (látogasson el a szakadék eszköztár honlap). A Perl szkriptek önmagukban nem nagyon bonyolult és tartalmaznak sok hack, hogy dolgoznak az OpenGL interfészeket, és ők is valószínűleg könnyen adaptálhatók más alkalmazásokat.
A termelés a GL és GLU interfészek használata helyett a C header fájlokat GL.h és GLU.h (ezek kissé vágott vissza változatai viszonylag szabványos Linux gl.h és glu.h), úgy döntöttünk, hogy a hiteles SGI specifikációját interfészek a fájlokat gl.spec, enum.spec, glu.spec és enumglu.spec, talált http://oss.sgi.com/projects/ogl-sample/registry/. (Fájlok itt említett vörösbor SANSERIF font tartalmazza a f03gl csomagot.)
Csak egy pár kisebb javítások történtek ezek a fájlok. A spec fájlok több információt nyújt, mint a C-fejlécek: például adnak Szándék info és határai info tömb érveket, és ők is dokumentálja a dolgokat, mint az OpenGL könyvtár megtartása pointerek belső használatra. Igyekeztünk, hogy minden ezen információk, hogy jobb Fortran interfészek. A Fortran kódok kerülnek legyártásra
spec_interfaces.pl –bozinit –PUBLIC -p. -d -m OpenGL -gl
spec_interfaces.pl –bozinit –PRIVATE -p. -d -m OpenGL-glu
Végrehajtó spec_interfaces.pl argumentum nélkül ad egy rövid dokumentáció a főbb lehetőségeket. A legfontosabb ezek közül az “-m” vagy “–module” opciót, amely eldönti, hogy az előtag a Fortran modulneveket van. Ha szeretné cserélni f90gl a kódok (mint mi elfogadása néhány példa), a modul nevét kell OpenGL_GL, OpenGL_GLU és OpenGL_GLUT. Ha meg szeretné tartani a f90gl modulok és próbálja ki az új F03GL könyvtár, majd a “-m F03GL” lenne a jó megoldás. Ha a Fortran fordító nem támogatja BOZ állandók (hexadecimális állandók az űrlap z “0B04”) paraméterben nyilatkozatok, regenerálja az interfészek nélkül “–bozinit” opciót. Ellenkező esetben, akkor csak használ a fájlok OpenGL_gl.f90 és OpenGL_glu.f90 a f03gl csomagot.
A GLUT könyvtár, nincsenek spec fájlt, és használtuk C header fájlokat generálni a felületeket. Vannak még különböző GLUT-szerű eszközkészlet könyvtárak és a megfelelő fejléc, azaz az eredeti GLUT.h (ismét egy cut-back változata glut.h származó GLUT 3.8) Mark J. Kilgard (SGI), amely nem állami- domén, de szabad, valamint több nyílt forráskódú helyettesítések, mint például az FreeGLUT.h származó FreeGLUT vagy OpenGLUT.h származó OpenGLUT. Teszteltük az Perl script h_interfaces.pl mindezeket a könyvtárak és generált a forráskódok OpenGL_glut.f90, OpenGL_freeglut.f90 és OpenGL_openglut.f90 segítségével valami hasonló
h_interfaces.pl -q –bozinit –scalar -m OpenGL -i GLUT.h
A GLUT előre meghatározott betűtípusok, amelyek érvénytelen C mutató értékek nem kezelhetők közvetlenül a Fortran, ahol TYPE (C_PTR) egy átlátszatlan típus, amely nem adható határozott értékkel. Továbbá, a különböző megvalósítások GLUT úgy tűnik, hogy kezelje a betűtípusok másképp. Ezért úgy döntöttünk, hogy adjunk GLUT_fonts.c és használata nem állandók TYPE (C_PTR) és az előre definiált betűtípus. Ez nem tesz különbséget látható a felhasználó számára. A védett attribútumot használják, hogy azok állandó jellegű, de ha a fordító nem támogatja, hogy a jellemző egyszerűen törölje a Perl script. Vegye figyelembe, hogy glutInit már túlterhelt általános interfészt, amely lehetővé teszi, hogy kihagyja a parancs az érveket, mert ezek általában nem használják a Fortran kódokat.
Kezelés GLUT visszahívás
A legnagyobb szövődmény kezelésére GLUT visszahívások, és különösen kikapcsolást. Kétféle módon átadni eljárások (például érvek) a C Fortran 2003: a dummy eljárásokat, amelyeket fel lehet adni a teljes felületek, illetve eljárás pointerek [azaz TYPE (C_FUNPTR) érvek, amelyek általános eljárás pointerek]. Mi inkább az előbbi, mert így teljes interfészek segít (jó) fordítóprogramok ellenőrzi, hogy a felhasználó által megadott callback a várt interfészeket. Ezt követően azonban egyre nehezebb, hogy kikapcsolja a visszahívás, amely a GLUT végzi halad egy NULL pointer funkció. Fortran, ez a legjobb módja azáltal, hogy a bábu eljárás választható, de ehhez szükség van a csomagolóanyagokat, hiszen argumentuma nem lehet átjárható (még). A felhasználó egyszerűen kihagyja a visszahívás érv ahhoz, hogy kapcsolja ki. Ebben NISTIR 6134 és közelebb megfelelése a C interfész, az egyik szállít tényleges érv GLUT_NULL_FUNC. A script h_interfaces.glutnullfunc.pl generál egy interfész ami használ néhány nem megfelelő trükk, hogy ezt a munkát, miközben megőrzi a ellenőrzésekor visszahívás interfészek. Vannak olyanok is inkább, hogy a visszahívások TYPE (C_FUNPTR), és hívja a GLUT C függvények nélkül, közvetlenül a csomagolóanyagokat (a felületek ezek már által generált Perl script), de nem ösztönzik ezt, hiszen nemcsak a változó a hívó szekvencia (az egyik van, hogy C_FUNLOC az aktuális paraméterek listája helyett egyszerűen halad a visszahívási eljárás tényleges), és vezet a incompatibilites között a kódok a különböző felhasználók F03GL.
Karakterlánc érvek
Ebben F03GL, a húr érvek kerülnek átadásra karakter tömbök [elnevezés (C_CHAR) dimenzió (*)], egyetértésben a F03 szabvány helyett a karaktersorozatok [elnevezés (KIND = C_CHAR, LEN = *)]. Az F03 szabvány speciális hack, amelyek lehetővé teszik a húrok kell átadni a tényleges érvek, hanem egy null karakter (C_CHAR_NULL) nem fűzve automatikusan, hanem manuálisan kell csatolni. Biztosítjuk, hogy OpenGL_gl.f90, egy segítő rutin CString, amely átalakítja a húr, hogy a null-terminált karakter tömb. Felhasználói kódok kell változtatni húrok, mint a “text” tényleges argumentumlista a CString ( “szöveg”)
Használata F03GL
Ha a Fortran források az OpenGL modulok fordítása sikeres, a következő lépés a tesztelés őket. A program
RandomSphere_OpenGLUT.f90 egy bemutató jellegű tesztprogram. Ez a program néhány leghasznosabb új Free / OpenGLUT funkciókat, melyek emulált klasszikus GLUT RandomSphere_GLUT.f90. Azt is igazítani néhány, a vizsgálati példák f90gl dolgozni f03gl. A script Script.sh a f03gl könyvtárban, hogy először a fordító környezeti változót a megfelelő fordító parancsot. A példák teszteltek a nagfor, gfortran és ifort. A fordító függő részleteket lásd a fordító jegyzeteket. További példák találhatók a dolfyn honlapján.
Inkompatibilitás NISTIR 6134
Itt van egy lista a inkompatibilitás NISTIR 6134.
1.A modulok nevei lehetnek OpenGL_XXX ha a felhasználó akarja cserélni f90gl, de egyébként meg kell F03GL_XXX.
2.F03GL nem foglalkozik processzorok hiányzik rövid típusok. Csupán meghatározza, például GLshort = C_SHORT, ahol C_SHORT egyfajta paraméter meghatározott F2003 intrinsic ISO_C_BINDING modult. Lehet -1, ha a processzor nem támogatja a fajta kérdéses, ami azt jelenti, hogy a programok segítségével az ilyen típusú paraméter egyszerűen nem fordul le. Ez talán kevésbé jelent problémát ma, mivel csaknem az összes érintett processzorok támogatják a C sor szabványos integer típusú.
3.GLboolean vannak egész szám (GLboolean) = egész szám (C_SIGNED_CHAR) inkább, mint a logikus szerint a F2003 szabvány. LOGIKAI (C_BOOL) együttműködik csak C99 a _Bool. Más “logicals” C (idézetek, mert nagyon integer típusú egyébként), az egyik kell használni INTEGER.
4.Char válik elnevezés (KIND = C_CHAR) követően F2003. Majdnem minden, ha nem az összes, a feldolgozók, ez ugyanaz, mint alapértelmezett karakterkészletet. char * válik karakter tömb [ “elnevezés (C_CHAR) dimenzió (*)”]. Nem egy karakterlánc.
5.Visszatérő függvények mutató, és különösen char *, van egy visszatérő TYPE (C_PTR), egy “általános” C mutatót. Ők lehet alakítani egy sor mutató típusú elnevezés (KIND = C_CHAR) a F2003 eljárás C_F_POINTER. Mi nem egy függvény belsejében F2003 erre, de ez könnyű írni. Átkonvertálni pointerei típusú karakter (KIND = C_CHAR, LEN = 🙂 nem legális szerint F2003 óta hosszúnak kell lennie, 1 legyen átjárható.
6.TYPE (GLCPTR) válik TYPE (C_PTR), és GLNULLPTR válik C_NULL_PTR származó F2003. Sajnos, nincs TYPEALIAS az F2003, így ezek nem címeken.
7.F2003 nem határozza meg a felhasználó által definiált típusok, például gluQuadricObj vagy TK_RGTImageRec. Ha ezek a típusok befolyásolható egy mutatót (fogantyú), a típus (C_PTR) paraméterben adható. Meg lehet határozni származtatott típusok ha valóban szükség van, de ez nem szükséges, hogy a bázis a könyvtárak, mivel csak kezeli jelennek meg, és a komponensek a struktúrák soha szükség. Ismét TYPEALIAS hasznos lett volna …
8.Érvénytelen érvek válnak TYPE (C_PTR) — nincs általános interfészt biztosít, mivel az nem felel meg az F2003 szabvány. Csak TYPE (C_PTR) együttműködik “void *”.
9.Az eljárások nem általános, hanem csak érintkezik a különleges C rutinok (amelyek feltételezik, hogy a külső linkeage). Jelenleg az egyetlen kivétel glutInit, mely túlterhelt, így lehet nélkül hívjuk.
10.Nem csonkolás 31 karakter megtörtént. Ez lehet tenni a Fortran processzor is, nevezetesen, hogy nem vesznek tudomást az összes karaktert a 32. és magasabb.
11.GLUTNULLFUNC törölték (lásd fentebb tárgyaltak GLUT visszahívások — teszünk lehetővé egy változata a GLUT interfészek ahol GLUTNULLFUNC lehet használni). Ehelyett egyszerűen hívja a GLUT eljárás nélkül történő tényleges érv a visszahívás, hogy kapcsolja ki. Megjegyezzük, hogy ez szükségessé teheti a kulcsszavak használata, ha az opcionális visszahívási érv nem az utolsó a paraméterek listája.
12.Azokban az esetekben, ahol a GL megtartja mutató egy tényleges érv, mint glFeedbackBuffer (4.2 in NISTIR), F03GL használ TYPE (C_PTR) dummy ahelyett a target attribútum, a dummy, amelyek esetleg nem. Az egyetlen esetben, amikor a Fortran 2003 szabvány valójában garantálja nélküli másolat, amikor a bábu feltételezzük alakú és TARGET — és feltételezett alakú bonyolítja átjárhatóság (valójában ez csak akkor támogatja a közelgő F2008).
13.GLUT visszahívás kell, hogy érveket értékével attribútum és egy BIND (C) címke, úgy, hogy közvetlenül hívható a C. Megjegyezzük, hogy a BIND (C, name = “”) is lehet használni, hogy elnyomja a kötelező címke szubrutinok hogy csak akkor van szükség, mint visszahívások. Ezzel elkerülhető a szennyező globális szimbólum névtér visszahívások.