VC6.0 to VC2005
-
Hi,
ich versuche gerade ein vc6.0 proejtk in ein vc2005 Projekt zu konvertieren. Leider stosse ich immer wieder auf neue Probleme. Im moment bekomme ich eine menge Fehler, die ich mal wieder nicht zuordnen kann... Ich hoffe mir kann jemand helfen.Hier der Build-Output:
1>c:\work\markus\vc2005projects\stormtest\storm\storm3dv2\iterator.h(20) : error C2146: syntax error : missing ';' before identifier 'it'
1>c:\work\markus\vc2005projects\stormtest\storm\storm3dv2\iterator.h(20) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(144) : warning C4346: 'QuadtreeEntity<T>::EntityImp' : dependent name is not a type
1> prefix with 'typename' to indicate a type
1> c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(321) : see reference to class template instantiation 'QuadtreeNode<T>' being compiled
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(144) : error C2059: syntax error : '>'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(146) : error C2065: 'root_' : undeclared identifier
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(146) : error C2275: 'QuadtreeNode<T>' : illegal use of this type as an expression
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(146) : error C2143: syntax error : missing ',' before ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(148) : error C2327: 'QuadtreeNode<T>::looseArea' : is not a type name, static, or enumerator
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(148) : error C2065: 'looseArea_' : undeclared identifier
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(148) : error C3861: 'looseArea': identifier not found
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(149) : error C2327: 'QuadtreeNode<T>::root' : is not a type name, static, or enumerator
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(149) : error C3861: 'root': identifier not found
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(150) : error C2143: syntax error : missing ',' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(150) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(153) : error C2143: syntax error : missing ')' before ';'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(153) : error C2059: syntax error : ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(155) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(158) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(159) : error C2143: syntax error : missing ')' before ';'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(159) : error C2059: syntax error : ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(162) : error C2143: syntax error : missing ')' before ';'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(162) : error C2059: syntax error : ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(164) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(167) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(168) : error C2065: 'radius' : undeclared identifier
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(170) : error C2065: 'instance' : undeclared identifier
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(178) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(180) : error C2327: 'QuadtreeNode<T>::looseArea' : is not a type name, static, or enumerator
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(180) : error C2275: 'AABB' : illegal use of this type as an expression
1> c:\work\markus\vc2005projects\stormtest\storm\include\c2_aabb.h(26) : see declaration of 'AABB'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(180) : error C2143: syntax error : missing ',' before ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(181) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(192) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(195) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(200) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(203) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(205) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(208) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(212) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(222) : error C2143: syntax error : missing ')' before ';'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(222) : error C2059: syntax error : ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(223) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(224) : error C2327: 'QuadtreeNode<T>::area' : is not a type name, static, or enumerator
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(224) : error C2065: 'area' : undeclared identifier
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(224) : error C2065: 'i' : undeclared identifier
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(224) : error C2143: syntax error : missing ',' before ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(225) : error C2327: 'QuadtreeNode<T>::looseArea' : is not a type name, static, or enumerator
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(225) : error C2143: syntax error : missing ',' before ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(227) : error C2065: 'sphere' : undeclared identifier
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(228) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(230) : error C2327: 'QuadtreeNode<T>::looseArea' : is not a type name, static, or enumerator
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(230) : error C2065: 'realRoot' : undeclared identifier
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(230) : error C2143: syntax error : missing ',' before ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(234) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(235) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(239) : error C2143: syntax error : missing ')' before ';'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(239) : error C2059: syntax error : ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(240) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(242) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(244) : error C2327: 'QuadtreeNode<T>::looseArea' : is not a type name, static, or enumerator
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(244) : error C2065: 'j' : undeclared identifier
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(244) : error C2143: syntax error : missing ',' before ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(248) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(249) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(250) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(256) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(259) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(260) : error C2143: syntax error : missing ')' before ';'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(260) : error C2059: syntax error : ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(261) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(263) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(266) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(267) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(270) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(272) : error C2065: 'result' : undeclared identifier
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(272) : error C2275: 'AABB' : illegal use of this type as an expression
1> c:\work\markus\vc2005projects\stormtest\storm\include\c2_aabb.h(26) : see declaration of 'AABB'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(272) : error C2143: syntax error : missing ',' before ')'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(273) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(284) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(287) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(289) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(292) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(295) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(298) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(300) : error C2143: syntax error : missing ';' before '{'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(303) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(308) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(321) : error C2143: syntax error : missing ';' before '}'
1>c:\work\markus\vc2005projects\stormtest\storm\include\c2_qtree.h(321) : fatal error C1004: unexpected end-of-file foundIch weiss nicht ob es sinnvoll ist denn Quellcode zu posten. Mich wundert nur das es solche Probleme gibt wobei es doch unter VC6.0 lief.
Die "syntax error : missing.." treten in so ziemlich jeder if abfrage oder auch in for-schleifen auf. Die unexpected end-of-file meldung tritt am ende eines structs auf... Die variablen i und j die als undeclared gekennzeichnet sind wurden in einer for-schleife deklariert...
Ich hoffe mir kann schon jemand mit dieses etwas dürftigen Informationen weiterhelfen...
-
Das könnte mit der unterschiedlichen Scope-Zuordnung für for()-Variablen zu tun haben: laut Standard existiert eine im Schleifenkopf deklarierte Variable nur innerhalb der Schleife, aber ältere VC-Versionen packen sie mitunter in den Scope, in dem die Schleife steht.
//Korrekt laut Standard, Fehler (Neudefinition) in VC: for(int i=0;i<10;++i) {...} ... for(int i=0;i<10;++i) {...} //Fehler laut Standard (undefinierte Variable), funktioniert in VC: for(int i=0;i<10;++i) {...} ... for(i=0;i<10;++i) {...} //überall korrekt: int i; for(i=0;i<10;++i) {...} ... for(i=0;i<10;++i) {...}
-
Generell hat der VC6 einigen Code verdaut, der einfach nicht Standardkonform ist. Als der Compiler gebaut wurde, war der 98er-Standard ja auch gerade erst (oder noch nicht einmal?) verabschiedet.
Natürlich sind Fehlermeldungen ohne Code grundsätzlich etwas dürftig

Die meisten dieser Fehler dürften jedoch auf ein Fehlen von std:: hindeuten. Alle Klassen der Standardbibliothek (vector, map, string, ...) liegen nämlich im Namensraum std. Auch typename dürfte einige Male fehlen. Das allermeiste dürte aus Folgefehlern entstehen.Poste bspw. mal ein Stück aus iterator.h rund um Zeile 20 und aus c2_qtree.h rund um Zeile 144...
-
@CStoll: Nein, daran liegt es nicht, das habe ich auch schon geprüft...
Kann das an irgendeiner Compileroption liegen die ich ändern muss? Mir scheint auch das er Probleme mit templates hat. Aber da das ja im Standard enthalten ist kann ich mir nicht vorstellen das es daran liegt...
-
okay
iterator.h:template <class A> class ST3D_EXP_DLLAPI IteratorIM_Set : public Iterator<A> { private: set<A> *ptrset; set<A>::iterator it; // Zeile 20 public: void Next() { it++; } bool IsEnd() { return it==ptrset->end(); } A GetCurrent() { return (*it); } IteratorIM_Set(set<A> *_ptrset) { ptrset=_ptrset; it=ptrset->begin(); } ~IteratorIM_Set() { }; };c2_qtree.h:
template<class T> struct QuadtreeNode { AABB area; AABB looseArea; VC3 position; QuadtreeNode<T> *childs[4]; QuadtreeNode<T> *root; std::vector<QuadtreeEntity<T>::EntityImp *> entities; // Zeile 144 QuadtreeNode(const AABB &area_, const AABB &looseArea_, QuadtreeNode<T> *root_) : area(area_), looseArea(looseArea_), root(root_) { position = (area.mmin + area.mmax) * .5f; for(int i = 0; i < 4; ++i) childs[i] = 0; } ....
-
Aha, der Namespace std scheint wohl doch bekannt zu sein (wegen set). Wegen typename, die beiden Zeilen müssten z.B. so aussehen (ich machs jetzt mal mit Namensraum, der Vollständigkeit halber):
std::set<A> *ptrset; typename std::set<A>::iterator it; // Zeile 20std::vector<typename QuadtreeEntity<T>::EntityImp *> entities; // Zeile 144
-
Hey danke, das hat meine Fehler stark reduziert! Das mit dem typename ist mir neu, wieso muss man das machen?
-
Weil set<Type>::iterator auch ein Datum sein könnte, z.B. eine konstante statische Variable im Template set. Mit typename sagst Du dem Compiler, dass iterator ein Typ (typedef, Klasse, ...) im Template set ist. Bei von Templates abhängigen Typen ist das laut Standard zwingend erforderlich (bei verschachtelten Typen abseits von Templates natürlich nicht).
-
Weil der Compiler bei Template-Klassen nicht vorhersagen kann, ob sich hinter (z.B.) set<A>::iterator ein Datentyp oder eine Variable verbirgt. Der nimmt normalerweise an, daß es eine Variable ist, wenn nicht, mußt du das per 'typename' kenntlich machen.
-
Super, danke für eure Hilfe!
Ich konnte die Fehler auf einen (neuen) reduzieren, der mir allerdings noch viel seltsamer vorkommt als alle anderen
1>c:\program files\microsoft visual studio 8\vc\include\xutility(2726) : error C2582: 'operator =' function is unavailable in '
anonymous-namespace'::Material' 1> c:\\program files\\microsoft visual studio 8\\vc\\include\\xutility(2754) : see reference to function template instantiation 'void std::\_Fill<anonymous-namespace'::Material*,_Ty>(_FwdIt,_FwdIt,const _Ty &)' being compiled
1> with
1> [
1> _Ty=anonymous-namespace'::Material, 1> _FwdIt=anonymous-namespace'::Material *
1> ]
1> c:\program files\microsoft visual studio 8\vc\include\vector(1187) : see reference to function template instantiation 'void std::fill<anonymous-namespace'::Material*,\_Ty>(\_FwdIt,\_FwdIt,const \_Ty &)' being compiled 1> with 1> [ 1> _Ty=anonymous-namespace'::Material,
1> _FwdIt=anonymous-namespace'::Material * 1> ] 1> c:\\program files\\microsoft visual studio 8\\vc\\include\\vector(1117) : while compiling class template member function 'void std::vector<\_Ty>::\_Insert\_n(std::\_Vector\_iterator<\_Ty,\_Alloc>,\_\_w64 unsigned int,const _Ty &)' 1> with 1> [ 1> _Ty=anonymous-namespace'::Material,
1> _Alloc=std::allocator<anonymous-namespace'::Material> 1> ] 1> c:\\work\\markus\\vc2005projects\\stormtest\\storm\\storm3dv2\\storm3d\_terrain\_decalsystem.cpp(317) : see reference to class template instantiation 'std::vector<_Ty>' being compiled 1> with 1> [ 1> _Ty=anonymous-namespace'::Material
1> ]Die einzige Datei die ich davon direkt nutze ist die storm3d_terrain_decalsystem.cpp. Dort verweist er auf diese Zeile:
struct Storm3D_TerrainDecalSystem::Data { Storm3D &storm; MaterialList materials; // <------ C2582 VC2I blockAmount; PixelShader pixelShader; VertexShader vertexShader; ....MaterialList ist dabei ein vector:
typedef vector<Material> MaterialList;und Material ein struct.
-
Staati schrieb:
MaterialList ist dabei ein vector:
typedef vector<Material> MaterialList;und Material ein struct.
Können wir mal die genaue Definition von "Material" sehen? Anscheinend hat der Compiler Probleme, für die Klasse eine Default-Zuweisung zu erzeugen (das passiert normalerweise, wenn du Elemente verwendest, die keinen erreichbaren op= haben (const, Referenzen, op= wurde private deklariert,...).
Eventuell stört auch die Tatsache, daß die struct sich in einem anonymen Namensraum versteckt hat.
-
Material struct:
struct Material { COL diffuseColor; shared_ptr<Storm3D_Texture> baseTexture; DecalList decals; int materialIndex; Tree &tree; Material(Tree &tree_) : materialIndex(-1), tree(tree_) { } int addDecal(IStorm3D_TerrainDecalSystem::Type type, const VC3 &position) { int index = (int)decals.size(); for(unsigned int i = 0; i < decals.size(); ++i) { if(decals[i].deleted) { index = i; break; } } if(index >= int(decals.size())) decals.resize(index + 1); Decal &decal = decals[index]; decal.deleted = false; decal.position = position; decal.materialIndex = materialIndex; if(type == IStorm3D_TerrainDecalSystem::Outside) decal.special.x = 8.1f; else decal.special.x = 9.1f; decal.entity = tree.insert(&decal, position, 0.001f); return index; } void eraseDecal(int index) { Decal &decal = decals[index]; tree.erase(decal.entity); decal.entity = 0; decal.deleted = true; } void updateDecal(int index) { Decal &decal = decals[index]; decal.calculateValues(); } void apply(IDirect3DDevice9 &device) { if(baseTexture) baseTexture->Apply(0); D3DXVECTOR4 diffuse(diffuseColor.r, diffuseColor.g, diffuseColor.b, 1.f); device.SetVertexShaderConstantF(7, diffuse, 1); } };Wieso benutzt man eigentlich anonyme namespaces? Ist es nicht das selbe wenn man den einfach weglässt?
-
Und da haben wir auch schon den Übeltäter: Das Element
Tree& Tree;in Zeile 9 kann nicht zugewiesen werden, deshalb streikt der Compiler und du mußt dir selber einen operator= erzeugen.(oder du lässt das & weg und speicherst im "Material" eine Kopie des übergebenen "Tree")
-
Mh ne, soweit ich das hier sehe gibt es des schon
Tree ist eine typedef:
typedef Quadtree<Decal> Tree;Quadtree ist eine template classe:
template<class T> class Quadtree { QuadtreeNode<T> *root; Quadtree<T> (const Quadtree<T> &); Quadtree<T> &operator = (const Quadtree<T> &); ...also sollte das tree(tree_) im konstruktor von Material doch funktionieren oder nicht?
-
Einen Tree kannst du auch problemlos kopieren, aber du hast eine Referenz auf einen Tree - und damit hat der Compiler Probleme. Das hängt damit zusammen, daß Referenzen nicht umgehängt werden können, also würde eine Zuweisung entweder das Grundprinzip "eine Referenz zeigt immer auf die selbe Variable" verletzen oder semantische Unstimmigkeiten hervorrufen (wenn du
mat2=mat1;schreibst, willst du sicher, daß mat2 anschließend den Baum von mat 1 verwendet und nicht der (woanders benötigte) Baum von mat2 überschrieben wird). Deshalb weigert sich dein Compiler, eine Default-Zuweisung zu erzeugen - und die Fehlermeldung sagt sinngemäß "ich weiß nicht, wie ich mit dieser Referenz umgehen soll, also kümmer du dich darum".(und bei einer Zuweisung wird NICHT der Copy-Ctor verwendet, sondern der operator=)
PS: Du kannst auch statt der Referenzen Zeiger (oder Smart-Pointer) verwenden - dann hast du das Problem nicht mehr.
-
Mal ne blöde Frage weils irgendwie dazupasst: braucht mal laut Standard das "typename" auch ausserhalb von Template Code? Also ist z.B. folgendes legal oder nicht?
void foo() { std::vector<int>::iterator it; }Ich schreibe da zumindest nie typename, und es geht immer. An der Stelle kann der Compiler es ja auch ohne Weiteres eindeutig parsen, da ja 'int' kein Template Parameter ist.
-
Das ist richtig, hier kommt kein typename hin, weil std::vector<int> eindeutig ist, dh instanziert werden kann, und nicht noch von irgendwelchen unbekannten Template Parametern abhängig ist.