Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

30.05.2013, 11:47

Code Verständins

Hallo. Mein Ziel ist es, ein Makro zu schreiben, welches mir eine Skriptfunktion definiert. Das soll in etwa so aussehen:

C-/C++-Quelltext

1
SCRIPT_DEFINE_FUNC_1(returnTyp, func, parameter1)

Als Beispiel könnte es dann so aussehen:

C-/C++-Quelltext

1
2
3
4
5
static std::string __stdcall Bla(int alX)
{
      return "Hallo";
}
SCRIPT_DEFINE_FUNC_1(string, Bla, int)

Ich habe aber absolut keine Ahnung wie ich das realisieren soll. Ich habe Codeabschnitte gefunden in eine andere Engine. Jedoch verstehe ich sie überhaupt nicht. Könnte mir jemand folgenden Code erklären?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    #define SCRIPT_DEFINE_FUNC_1(return, funcname, arg0) \
            SCRIPT_FUNC_BEGIN(funcname, return, #arg0) \
            SCRIPT_ARG_##arg0(0); \
            SCRIPT_RETURN_CALL_##return funcname(_arg0); \
            SCRIPT_FUNC_END(funcname,return)

#define SCRIPT_FUNC_BEGIN(funcname, return, args) \
        namespace GenericScript { \
            static std::string funcname##_return = #return; \
            static std::string funcname##_arg = args; \
            void funcname##_Generic(asIScriptGeneric *gen) { \
                SCRIPT_RETURN_##return;

    #define SCRIPT_FUNC_END(funcname, return) \
                SCRIPT_SET_RETURN_##return; \
            } \
        }



        #define SCRIPT_ARG_string(n) std::string _arg##n = *(std::string *)gen->GetArgObject(n)
    #define SCRIPT_ARG_float(n) float _arg##n = gen->GetArgFloat(n)
    #define SCRIPT_ARG_int(n) int _arg##n = gen->GetArgDWord(n)
    #define SCRIPT_ARG_bool(n) bool _arg##n = gen->GetArgDWord(n)


    #define SCRIPT_RETURN_CALL_string _ret =
    #define SCRIPT_RETURN_CALL_bool _ret =
    #define SCRIPT_RETURN_CALL_int _ret =
    #define SCRIPT_RETURN_CALL_float _ret =
    #define SCRIPT_RETURN_CALL_void


Danke im Voraus.

EDIT: Um die Funktion später zu registrieren wird folgender Code benötigt:

C-/C++-Quelltext

1
RegisterFunction("void FuncNameInScript(int iTyp)", FuncToCall);

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

30.05.2013, 12:33

Du musst einfach mal das tun, was der Präprozessor tut...
@D13_Dreinig

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

3

30.05.2013, 12:38

Und was genau bedeutet "##"?

C-/C++-Quelltext

1
SCRIPT_ARG_##arg0(0);

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

30.05.2013, 12:41

Der Operator verkettet zwei Token, hängt also das Argument an SCRIPT_ARG_ an.
@D13_Dreinig

wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

5

30.05.2013, 12:42

Mit dem ersten Define wird die Skriptfunktion definiert, wozu dann die nächsten beiden Defines verwendet werden, die sich um die eigentliche Funktion, die Parameter und den Rückgabewert kümmern.

Die anderen Defines definieren dann die möglichen Rückgabewerte und Parameter.

So ungefähr ist es, glaub ich :thumbsup:

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

6

30.05.2013, 13:09

@David_pb: Danke das habe ich gesucht. :)
@wluc-16: Wie soll das gerade definierte Makro etwas definieren? :P

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (30.05.2013, 13:18)


wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

7

30.05.2013, 13:15

Zitat

@wluc-16: Wie soll die gerade definierte Funktion etwas definieren? :P
Ich meinte mit dem definieren nicht #define, sondern, dass das Makro einfach das einfach angibt

:P zurück :D

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

8

30.05.2013, 15:52

Hier meine Lösung, falls jemand ein ähnliches Problem hat.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define DEFINE_SCRIPT_ENGINE(SE)    \
    ScriptEngine* SEE = SE;

#define SCRIPT_DEFINE_FUNC_1(return, func, arg0)    \
    string sFinal;  \
    string s1,s2,s3,s4,s5,s6;   \
    s1 = #return;   \
    s2 = " ";   \
    s3 = #func; \
    s4 = "(";   \
    s5 = #arg0; \
    s6 = ")";   \
    sFinal = s1 + s2 + s3 + s4 + s5 + s6;   \
    SEE->RegisterFunction(sFinal.c_str(), func)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

9

30.05.2013, 16:13

Hätte eine Frage:
Was machen diese Rauten?

Quellcode

1
2
3
4
5
#return

#func

#arg0

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

10

30.05.2013, 16:17

Zitat von »http://public.beuth-hochschule.de/~kempfer/skript_c/Kap10.html«


Der #-Operator ist ein unärer Präprozessor-Operator und wird in Makros verwendet. Während das Makro umgesetzt wird, wird der #-Operator mit dem dahinter stehenden Makro-Parameter ersetzt durch den aktuellen Wert des Makro-Parameters eingeschlossen in Anführungszeichen. Dadurch wird der Wert des Makro-Parameters, der hinter dem Operator steht, in eine Zeichenkette umgewandelt, egal um was für einen Datentypen es sich handelt. Während die Zeichenkette erzeugt wird, werden mehrere hintereinander stehende Weiße Leerzeichen ersetzt durch ein Leerzeichen. Anführungszeichen und Backslashs, die im Makro-Parameter enthalten sind, bekommen noch ein zusätzliches Backslash davor gesetzt, damit die ursprüngliche Bedeutung erhalten bleibt.

Beispiel:

#define Makro(a) printf(#a)

Beim Durchlauf des Präprozessors werden die Makroaufrufe

Makro(7);
Makro("\n");

werden ersetzt durch

printf("7");
printf("\"\\n\"");

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige