D - Associative Array Initialization
lima-city → Forum → Programmiersprachen → C/C++ und D
all
array
assoziativen array
benutzen
code
compiler
double
eckige klammern
erweiterung
expression
hinsicht
not
notation
null
nutzen
parameter
richtige definition
statement
type
url
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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.
-
Jep, jetzt funktioniert es. Hm. aber warum?
-
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++ -
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] ];
-
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 ===|
-
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. -
Kein Problem. Danke trotzdem für deinen gut gemeinten Beitrag
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage