kostenloser Webspace werbefrei: lima-city


D - Associative Array Initialization

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    s******i

    Hallo,
    ich versuche ein komplexeres assoziatives Array zu initialisieren. Hier der Code:
    enum MATH_ASSOCIATION { LEFT_ASSOC, RIGHT_ASSOC };
    
    struct MATH_OPERATIONS {
        char op;
        int parameter;
        MATH_ASSOCIATION assoc;
        int prio;
        double function(double,double) calculate;
    };
    
    // All internal operations
    private const static
    MATH_OPERATIONS[char] operations;
    
    static this() {
        operations = [
                         '+' : {'+', 2, MATH_ASSOCIATION.LEFT_ASSOC, 1, &add},
                         '-' : {'-', 2, MATH_ASSOCIATION.LEFT_ASSOC, 1, &sub},
                         '*' : {'*', 2, MATH_ASSOCIATION.LEFT_ASSOC, 2, &mul},
                         '/' : {'/', 2, MATH_ASSOCIATION.LEFT_ASSOC, 2, &div},
                         '(' : {'(', 0, MATH_ASSOCIATION.LEFT_ASSOC, 5, null},
                         ')' : {')', 0, MATH_ASSOCIATION.LEFT_ASSOC, 5, null},
                         '!' : {'!', 1, MATH_ASSOCIATION.RIGHT_ASSOC, 3,&fak}
                     ];
    }


    Jedoch meint er Compiler das hier:
    MathObject.d|29|found '}' when expecting ';' following 'statement'|
    MathObject.d|29|found ',' instead of statement|
    MathObject.d|31|found '}' when expecting ';' following 'statement'|
    MathObject.d|31|found ',' instead of statement|
    MathObject.d|33|found '}' when expecting ';' following 'statement'|
    MathObject.d|33|found ',' instead of statement|
    MathObject.d|35|found '}' when expecting ';' following 'statement'|
    MathObject.d|36|found ']' instead of statement|
    MathObject.d|40|found 'double' when expecting ','|
    MathObject.d|40|found 'a' when expecting '.' following 'double'|
    MathObject.d|40|found ',' when expecting identifier following 'double.'|
    MathObject.d|40|found 'double' when expecting ','|
    MathObject.d|40|'key:value' expected for associative array literal|
    MathObject.d|40|found '{' when expecting ','|
    MathObject.d|40|expression expected, not 'return'|
    MathObject.d|40|found 'a' when expecting ','|
    MathObject.d|40|found ';' when expecting ','|
    MathObject.d|40|expression expected, not '}'|
    MathObject.d|41|found 'double' when expecting ','|
    MathObject.d|41|found 'a' when expecting '.' following 'double'|
    MathObject.d|41|found ',' when expecting identifier following 'double.'|
    ||=== Build finished: 21 errors, 0 warnings ===|


    warum soll da ein ';' erwartet werden bzw. wie ist die richtige Definition??

    Grüße,
    user710
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ersetze mal
    '+' : {'+', 2, MATH_ASSOCIATION.LEFT_ASSOC, 1, &add},

    mit
    '+' : MATH_OPERATIONS( '+', 2, MATH_ASSOCIATION.LEFT_ASSOC, 1, &add ),

    und bei den anderen Fällen das ganze analog.
  4. Autor dieses Themas

    s******i

    Jep, jetzt funktioniert es. Hm. aber warum?
  5. Weil du den impliziten Konstruktor aufrufen musst. {} kannst du (meines Wissens) nur nutzen, um assoziative Arrays zu intialisieren. Die Werte in deinem assoziativen Array sind aber Structs, und da braucht man eben eine andere Notation.

    In der Hinsicht unterscheidet sich D eben von C/C++
  6. Hallo spuglisi,

    alternativ kannst Du auch einfach eckige Klammern benutzen:
    operations = [
            '+' : ['+', 2, MATH_ASSOCIATION.LEFT_ASSOC, 1, &add],
            '-' : ['-', 2, MATH_ASSOCIATION.LEFT_ASSOC, 1, &sub],
            '*' : ['*', 2, MATH_ASSOCIATION.LEFT_ASSOC, 2, &mul],
            '/' : ['/', 2, MATH_ASSOCIATION.LEFT_ASSOC, 2, &div],
            '(' : ['(', 0, MATH_ASSOCIATION.LEFT_ASSOC, 5, null],
            ')' : [')', 0, MATH_ASSOCIATION.LEFT_ASSOC, 5, null],
            '!' : ['!', 1, MATH_ASSOCIATION.RIGHT_ASSOC, 3,&fak]
        ];
  7. Autor dieses Themas

    s******i

    darkpandemic schrieb:
    Hallo spuglisi,

    alternativ kannst Du auch einfach eckige Klammern benutzen:
    operations = [
            '+' : ['+', 2, MATH_ASSOCIATION.LEFT_ASSOC, 1, &add],
            '-' : ['-', 2, MATH_ASSOCIATION.LEFT_ASSOC, 1, &sub],
            '*' : ['*', 2, MATH_ASSOCIATION.LEFT_ASSOC, 2, &mul],
            '/' : ['/', 2, MATH_ASSOCIATION.LEFT_ASSOC, 2, &div],
            '(' : ['(', 0, MATH_ASSOCIATION.LEFT_ASSOC, 5, null],
            ')' : [')', 0, MATH_ASSOCIATION.LEFT_ASSOC, 5, null],
            '!' : ['!', 1, MATH_ASSOCIATION.RIGHT_ASSOC, 3,&fak]
        ];


    Diese Möglichkeit schien mir sehr elegant, deshalb ich ich das gleich mal getestet. Jedoch versteht der compiler entweder nicht die Initialisierungsreihenfolge oder aber die ganze Initialisierung nicht.

    Hier die Fehlermeldung des Compilers:
    MathObject.d|29|Error: cannot implicitly convert expression (& add) of type double function(double, double) to char|
    MathObject.d|30|Error: cannot implicitly convert expression (& sub) of type double function(double, double) to char|
    MathObject.d|31|Error: cannot implicitly convert expression (& mul) of type double function(double, double) to char|
    MathObject.d|32|Error: cannot implicitly convert expression (& div) of type double function(double, double) to char|
    MathObject.d|33|Error: cannot implicitly convert expression (null) of type void* to char|
    MathObject.d|34|Error: cannot implicitly convert expression (null) of type void* to char|
    MathObject.d|35|Error: cannot implicitly convert expression (& fak) of type double function(double, double) to char|
    MathObject.d|28|Error: cannot implicitly convert expression (['+':['+','\x02','\x00','\x01',cast(char)(& add)],'-':['-','\x02','\x00','\x01',cast(char)(& sub)],'*':['*','\x02','\x00','\x02',cast(char)(& mul)],'/':['/','\x02','\x00','\x02',cast(char)(& div)],'(':['(','\x00','\x00','\x05',cast(char)null],')':[')','\x00','\x00','\x05',cast(char)null],'!':['!','\x01','\x01','\x03',cast(char)(& fak)]]) of type char[5u][char] to MATH_OPERATION[char]|
    ||=== Build finished: 8 errors, 0 warnings ===|
  8. Hallo spuglisi,

    ich habe gerade gemerkt, dass Du recht hast. Da hat mich meine IDE in die Irre geführt.
    Die D Erweiterung für Eclipse ist wohl noch nicht so toll und hat mir die Fehler erstmal nicht gezeigt, weshalb ich dachte, dass es funktionieren würde.
    Entschluldigung.
  9. Autor dieses Themas

    s******i

    Kein Problem. Danke trotzdem für deinen gut gemeinten Beitrag ;-)
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!