Makro Loop


  • Mod

    @Pikkolini sagte in Makro Loop:

    Interessanterweise hat nur der MSVC das Problem. Im GCC klappt es reibunglos. Siehe
    hier
    und
    hier

    Ärgerlich, dass die Compilerparameter zur Ausgabe des MSVC Präprozessors auf godbolt nicht zu funktionieren scheinen. Wenn sich da jemand auskennt, wäre das sehr hilfreich. Ansonsten könnte mal @Pikkolini bei sich probieren, was heraus kommt. Beim MSVC müsste das /E sein statt -E, weil Windows...



  • @SeppJ sagte in Makro Loop:

    Ärgerlich, dass die Compilerparameter zur Ausgabe des MSVC Präprozessors auf godbolt nicht zu funktionieren scheinen.

    Wie kommst Du darauf? sowohl -E als auch /E funktionert. Klick im Compilerfenster in godbolt unten auf "Output".


  • Mod

    @Swordfish sagte in Makro Loop:

    @SeppJ sagte in Makro Loop:

    Ärgerlich, dass die Compilerparameter zur Ausgabe des MSVC Präprozessors auf godbolt nicht zu funktionieren scheinen.

    Wie kommst Du darauf? sowohl -E als auch /E funktionert. Klick im Compilerfenster in godbolt unten auf "Output".

    Ahh! Danke.

    MSVC sagt:

    if (index, variableName, otherVariableName, latitude, longitude > 0) [...]
    

    [...]
    <source>(1326): warning C4003: not enough actual parameters for macro 'IF_BODY'

    Hmm. Kann MSVC keine Variadic Macros? Angeblich doch, aber scheint nicht zu funktionieren. Mir ist es aber gerade zu sehr Freitagabend, um das noch genauer zu analysieren. Sorry 😃



  • @SeppJ sagte in Makro Loop:

    Variadic Macros

    Das ist doch ein C99-Dings? Da kann schon sein daß er's nicht kann. (oder dabei zumindest rumzickt). Wär' aber eher ne Frage/Bugreport an die Boost Menschen als hier.



  • Interessant, scheint ein Bug von MSVC zu sein:
    https://stackoverflow.com/questions/55883451/nested-macro-with-variadic-arguments-does-compile-in-gcc-but-not-in-msvc

    Jetzt stellt sich nur noch die Frage, ob man diesen Bug irgendwie umgehen kann 🤔



  • @Pikkolini
    Eine Frage. Du willst also in einem Quellcode alle Arrays auflösen s.d. am Ende anstatt Arrays nur noch Variablen im Code stehen. Was machst du aber in den folgenden Fällen?

    int variableName[5];
    
    // Fall 1
    variableName[0] = 1;
    variableName[1] = 2;
    variableName[2] = 3;
    // Fall 2
    for (int i = 0; i < 3; i++)
    	variableName[(i * 2) % 5] = i;	
    // Fall 3
    int* P = &variableName[0];
    for (int i = 0; i < 3; i++)
    {
    	*P = i;
    	P++;
    }
    // Fall 4
    int Sum = CalculateSum(variableName);
    

    Ich würde hier nicht mit dem Präprozessor herangehen, da mir dieser nicht mächtig genug erscheint, sondern ein Python Skript probieren, welches sich folgermaßen aufrufen liese:

    DisolveArrays.py -in:ProjectFile -out:ProjectFile
    

    Eine rudimentäre Lösung sähe so aus:

    import re
    
    try:
        InFile = open("Test.cpp", "r")
    except:
        print("\nFehler! Konnte Eingabedatei nicht einlesen!")
        quit(0)
    try:
        OutFile = open("Test_Simulink.cpp", "w")
    except:
        print("\nFehler! Konnte Ausgabedatei nicht öffnen!")
        quit(0)
    
    for Line in InFile:
        x = re.search("(\w+) (\w+)[(\d+)];", Line)
        if (x):
            print("")
            print("Array gefunden: " + Line)
            print("Typ: " + x.group(1))
            print("Name: " + x.group(2))
            print("Größe: " + x.group(3))
            for i in range(int(x.group(3))):
                OutFile.write(x.group(1) + " " + x.group(2) + str(i) + ";\n")
        else:
            OutFile.write(Line)
    

    Test.cpp

    int a[10];
    objectType variableName[5];
    
    int main(int argc, char** argv)
    {
    	printf("Hallo Welt!\n");
    }
    

    Das Ganze müsste man natürlich noch für die besagten Fälle weiterentwickeln.



  • Alle Fälle sind kein Problem, aber Fall 2 und 3 treten sowieso nicht auf und Fall 4 in anderer Form (bei Fall 3 sei angemerkt, dass auf der Targethardware Variablen in structs hintereinander im Speicher liegen, und bei mir ist alles in structs gepackt). Ich sehe nicht wo das Problem liegen soll.
    Python war auch mein erster Gedanke, aber habe es für besser befunden keine weitere Komplikationen in die build chain einzubauen.

    P.S. Die Lösung meines Problems findet ihr im Stackoverflow thread.


Anmelden zum Antworten