Inline , C++ und Header-Dateien....?

Previous topic - Next topic

Schranz0r

Hi an alle



Gibt es den die möglichkeit Header-Datein in GLBasic ein zu binden?
Wenn ja, wie?
Und muss man den Namespace Beenden oder What :D ?

Kleines Biespiel wär Subba =)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

trucidare

Ich möchte auch noch mal:

Nach dem ich nun erfolgreich die Lib´s gelinkt habe kommt das problem mit den includes:

hier erstmal mein code

Code (glbasic) Select
INLINE
}

#include
#include

namespace __GLBASIC__ {
ENDINLINE
ok kompilieren und linken ohne fehler. nun will ich sdl und sdl_net initialisieren:
Code (glbasic) Select
INLINE
}

#include
#include

                SDL_Init(1);
SDLNet_Init();


namespace __GLBASIC__ {
ENDINLINE
hier gibts dann die fehler:

QuoteC:/DOKUME~1/DIVINE~1/LOKALE~1/Temp/glbasic/gpc_temp1.cpp:15: error: expected constructor, destructor, or type conversion before '(' token
C:/DOKUME~1/DIVINE~1/LOKALE~1/Temp/glbasic/gpc_temp1.cpp:15: error: expected `,' or `;' before '(' token
C:/DOKUME~1/DIVINE~1/LOKALE~1/Temp/glbasic/gpc_temp1.cpp:16: error: expected constructor, destructor, or type conversion before ';' token
habt ihr einen Vorschlag wie ich das lösen kann?
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Kitty Hello

Du kannst keine Funktionen aufrufen ausserhalb von einer Funktion. Also entweder das SDL_Init in "FUNCTION foo:" packen, oder in eine C Funktion:
void foo() {... }

Wenn man GLBasic Dateien einpacken will, einfach in's Projekt übernehmen und fertig.

Quentin

ok ok ich weiß, man soll die Finger von INLINE lassen, wenn man nicht wirklich Ahnung von C++ hat. Trotzdem! ;)
Habe jetzt den ganzen Abend an folgenden Problem rumgefummelt. Geht darum, die Funktion EnumDisplaySettings aus user32.dll anzusprechen. Kompiliert wird das Teil auch einwandfrei, nur schmiert es gleich nach dem Start ab.

Wenn man den Zeiger auf die Funktion definiert (außerhalb jeglicher Funktion), wie definiert man dort einen Zeiger auf einer Struktur??

Quellen, wo ich schon mal rumgesucht habe:
http://msdn2.microsoft.com/en-us/library/ms533265.aspx
http://www.microsoft.com/germany/msdn/library/visualtools/vb6/BildschirmeinstellungenErmittelnUndAendern.mspx?mfr=true

Code (glbasic) Select
DllInit()
EnumDisplaySettings("", 1)

FUNCTION WeNeedOne:
ENDFUNCTION

// In __GLBASIC__ namespace, outside of functions make a pointer to a function
// im __GLBASIC__ namespace, ausserhalb von Funktionen einen Zeiger auf eine Funktion machen
INLINE
//int (__stdcall *WinMessy)(void*, const char*, const char*, int)=0L;
int (__stdcall *GetResolution)(const char*, long, void*)=0L;
ENDINLINE


// Load DLL and get Pointer to function
// DLL laden und Zeiger auf Funktion holen
FUNCTION DllInit:
INLINE
// DLLCALL(dll_name, fkt_name, void** pFunktionInDll)
DLLCALL("user32.dll", "EnumDisplaySettings", (void**)&GetResolution);
ENDINLINE
ENDFUNCTION


FUNCTION EnumDisplaySettings: disp$, num

    LOCAL scrwidth, scrheight
   
INLINE
   struct DEVMODE {
      char dmDeviceName[32];
  int dmSpecVersion;
  int dmDriverVersion;
  int dmSize;
  int dmDriverExtra;
  long dmFields;
  int dmOrientation;
  int dmPaperSize;
  int dmPaperLength;
  int dmPaperWidth;
  int dmScale;
  int dmCopies;
  int dmDefaultSource;
  int dmPrintQuality;
  int dmColor;
  int dmDuplex;
  int dmYResolution;
  int dmTTOption;
  int dmCollate;
  char dmFormName[32];
  int dmUnusedPadding;
  long dmBitsPerPel;
  long dmPelsWidth;
  long dmPelsHeight;
  long dmDisplayFlags;
  long dmDisplayFrequency;
   };
   DEVMODE devmode;
   devmode.dmSize = sizeof(DEVMODE);
GetResolution(disp_Str.c_str(), num, &devmode);
scrwidth = devmode.dmPelsWidth;
scrheight = devmode.dmPelsHeight;
ENDINLINE

PRINT scrwidth, 0, 0
PRINT scrheight, 0, 20
SHOWSCREEN

ENDFUNCTION

Kitty Hello

Fixed code:
Code (glbasic) Select
EnumDisplaySettings("", 0)

KEYWAIT



FUNCTION WeNeedOne:
ENDFUNCTION

// In __GLBASIC__ namespace, outside of functions make a pointer to a function
INLINE
// * NEU *
DECLARE_ALIAS( user32_EnumDisplaySettings, "user32.dll", \
"EnumDisplaySettingsA", (const char*, unsigned int, void*), \
int);
ENDINLINE

FUNCTION EnumDisplaySettings: disp$, num

    LOCAL scrwidth, scrheight
   
    INLINE
        struct DEVMODE {
              char dmDeviceName[32];
              short dmSpecVersion;
              short dmDriverVersion;
              short dmSize;
              short dmDriverExtra;
              long  dmFields;
              short dmOrientation;
              short dmPaperSize;
              short dmPaperLength;
              short dmPaperWidth;
              short dmScale;
              short dmCopies;
              short dmDefaultSource;
              short dmPrintQuality;
              short dmColor;
              short dmDuplex;
              short dmYResolution;
              short dmTTOption;
              short dmCollate;
              char dmFormName[32];
              short dmUnusedPadding;
              long dmBitsPerPel;
              long dmPelsWidth;
              long dmPelsHeight;
              long dmDisplayFlags;
              long dmDisplayFrequency;
        };
        DEVMODE devmode;

        devmode.dmSize = sizeof(DEVMODE);
        // * NEU *
        // if disp$ = "", pass NULL instead!
        user32_EnumDisplaySettings(LEN(disp_Str) ? disp_Str.c_str() : NULL, num, &devmode);
        scrwidth = devmode.dmPelsWidth;
        scrheight = devmode.dmPelsHeight;
    ENDINLINE
   
    PRINT scrwidth, 0, 0
    PRINT scrheight, 0, 20
    SHOWSCREEN
   
ENDFUNCTION

Quentin

Genial, das funktioniert. Demnächst dann eine Funktion, die alle möglichen Auslösungen zurückliefert. Muss noch ein wenig in MSN wühlen. Hab da irgendwo gelesen, daß man nicht alle Funktionen nutzen kann, die zurückgeliefert werden.