AnsiString = AnsiString funktioniert nicht!?
-
Bei Konstanten kann man das schon so machen. Ich bevorzuge hier aber eher eine struct in der alle diese Konstanten zusammengefasst werden. Die lege ich dann in einen Singleton ab.
Bei performancekritischen Programmteilen arbeite ich aber auch mit extern.
Ich hatte hier irgendwie nicht gesehen, dass es sich um globale Konstanten handeln soll (kein const).
-
Braunstein schrieb:
Bei Konstanten kann man das schon so machen. Ich bevorzuge hier aber eher eine struct in der alle diese Konstanten zusammengefasst werden. Die lege ich dann in einen Singleton ab.
Bei performancekritischen Programmteilen arbeite ich aber auch mit extern.
Ich hatte hier irgendwie nicht gesehen, dass es sich um globale Konstanten handeln soll (kein const).Es waren auch nicht alle global (z.B. Symbol, Symbol2), aber z.B. triangle,cross,... waren globale AnsiStrings. Diese habe ich früher auch als konstant (const) deklariert, durch das extern wollte mir der Linker das aber nie abnehmen (auch wenn ich extern const AnsiString... schrieb). Er brachte immer eine Linker-Error z.B. Undefined Symbol _triangle (mit Unterstrich). Ich habe nun zu Testzwecken das const entfernt und da nur ich an diesem Projekt arbeite, auch darauf geachtet sei nirgends zu verändern (ich weiß, kein guter Programmierstil, aber wenn der Linker nicht mitspielt)
-
extern const AnsiString ist kein Problem. Wenn dein Linker da nicht mitspielt hast du was anderes falschgemacht.
-
Braunstein schrieb:
extern const AnsiString ist kein Problem. Wenn dein Linker da nicht mitspielt hast du was anderes falschgemacht.
Ja aber wenn ich sie nicht konstant deklariere funktioniert alles, wenn ich alles auf const umändere:
const.h:const AnsiString triangle = "images\\triangle.bmp";Unit2.cpp:
extern const AnsiString triangle;Das führt zu folgendem Linkererror:
[Linker Fehler] Unresolved external '_triangle' referenced from K:\TICITACTOE\TICITACI6\UNIT2.OBJda ist wohl ansonsten nichts falsch, oder schon? Ach ja, const.h wird in Unit1.h inkludiert, ebenso Unit2.h
-
Du machst es ja auch genau verkehrt rum. Das
extern const AnsiString triangle;gehört in den Header und die Definition in eine cpp.
-
Braunstein schrieb:
Du machst es ja auch genau verkehrt rum. Das
extern const AnsiString triangle;gehört in den Header und die Definition in eine cpp.
Ja aber ich definiere die AnsiStrings in meinem Header const.h, wo sie ihren (konstanten) "Wert" zugewiesen bekommen. Somit ist das praktisch einfach eine normale Header-Datei.
Aus der Unit1 rufe ich dann die Unit2 auf, in welcher ich nun mittels extern diese AnsiStrings "einbinde". Wenn ich die extern-Deklaration in den Header der Unit2 schiebe, bleibt es bei den selben Linker Errors.
-
Hallo
Braunstein hat schon recht. Probier es doch einfach mal aus.
bis bald
akari
-
Erläuterungen zu extern und globale Variablen.
http://www2.informatik.uni-halle.de/lehre/c/c_globv.html
http://www.willemer.de/informatik/cpp/geltungvar.htm
-
Ich glaube ich steh gerade auf der Leitung
In meinem Buch steht:
The extern specifier tells the compiler that the following variable types and names have been declared elsewhere. In other words, extern lets the compiler know what the types and names are for these global variables without actually creating storage for them again. When the two modules are linked, all references to the external variables are resolved.Braunstein schrieb:
Du machst es ja auch genau verkehrt rum. Das
extern const AnsiString triangle;gehört in den Header und die Definition in eine cpp.
Ich habe nun auch versucht die extern-Deklarationen in die Unit2.h zu packen mit demselben Ergebnis. Die Definition meiner AnsiStrings findet in der const.h statt, sollte ich das nun in eine cpp umwandeln? -Wie gesagt, ich steh gerade auf der Leitung
-
Nein. extern sagt dem Compiler, dass eine Variable dieses Namens existiert und irgendwo auch definiert wird. Damit die Variable in deinem Programm bekannt gemacht werden kann, packst diese extern Deklaration in einen Header.
Die dazu gehörige Definition packst du in irgendeine cpp damit der Linker sie auch findet.
-
Hallo
Also nochmal...
const.h:
#ifndef CONST_H #ifndef CONST_H #include <vcl.h> // Muß mit rein extern const AnsiString triangle; #endifconst.cpp:
#include "const.h" const AnsiString triangle = "images\\triangle.bmp";Unit2.h
#include "const.h" // ... hier triangle benutzenbis bald
akari/Edit : Code korrigiert
-
Diese sch*** Leitungen immer

Danke für eure Erklärungen, habe sie genauestens befolgt, bekomme nun aber dutzende Compiler-Fehler, an welchen ich schon seit einer halben Stunde ratlos davor sitze:
z.B.[C++ Fehler] const.h(5): E2141 Fehler in der Deklarationssyntax Das zeigt er bei dieser Zeile an: extern const AnsiString white; //bzw auch bei triangle usw. Oder dieser hier: [C++ Fehler] const.h(11): E2238 Bezeichner 'AnsiString' mehrfach deklariert in diser Zeile hier extern AnsiString Symbol; //Symbol user 1Ich versteh einfach nicht was an dieser Deklaration falsch sein soll, definiert wird white in const.cpp wie oben schon von akari beschrieben:
const AnsiString white = "images\\white.bmp";Aber ich glaube ohne Quelltext wird es für euch schwer sein einen Fehler zu finden
, ansonsten hab ich jedoch nichts geändert!
-
Hallo
Wie mans auch macht...
Es fehlt noch der include für die VCL, damit der Compiler den Typ AnsiString kennt. Hab meinen Code korriert.bis bald
akari
-
Mein Gott!!!!! Hatte mal nen Compiler dem das alles egal war, der kannte aber natürlich keinen AnsiString. Sollte aber keine Ausrede sein!!!!!!
Damit ist mein (erstes BCB) Spiel jetzt vorläufig fertig und für die sehr gute Mithilfe an diesem Projekt möchte ich es dieser Community geben.
Besonderen Dank an akari und Braunstein *Danke*Hier wäre das vollständige Spiel, BCB6 [666KB]
http://rapidshare.com/files/88087685/ticitaci6.rar
Einfach auf Free-> Warten (ja leider) und fertigEinen mir bisher bekannten Fehler gibt es noch, ob ich diesen überhaupt umgehen will, weiß ich noch nicht, bedeutet nämlich ziemlich viel Aufwand
Wenn man den Bot auf schwer einstellt ist er nicht immer auf schwer eingestellt (klingt lustig) Behebung (zurzeit noch) einfach 2 mal auf Extras->Bot->Schwer klicken und dann Singleplayer startenDafür hat noch niemand den schwierigen Bot bis jetzt besiegt!
DANKE!!!!!!!!!!