kann man einen alten Quellcode mit einem neuen compiler neu kompilieren ?
-
Der Linker ist noch genauso schrottig wie damals.
Bei größeren Projekten hilft nur aufteilen in BPLs. Das ist aber nicht ganz trivial.
Im allgemeinen C++ Forum ist der Beitrag falsch.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum VCL (C++ Builder) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
nn schrieb:
Ja, vorher schon mal ein paar Hinweise:
Diese Linker Fehler waren früher wirklich eine Plage. Auch nach dem BCB 6 Update 4 gab es noch ein Linker Update für diese Version. Manche Bugs im Linker wurden erst mit der Version 2007 behoben, kann aber auch sein, dass noch welche übrig sind.
dieses linker update "ilink" oder so habe ich auch runtergeladen und in den bin Ordner von Cbuilder kopiert, aber es bringt leider keine Änderung.
nn schrieb:
Die Version 2007 ist auch die letzte, wo die VCL noch Ansi basiert ist. Alle neueren C++ Builder arbeiten mit einer Unicode VCL, da müssen Programm und Komponenten sicher etwas angepasst werden.
Das kann ich vergessen, denn ich wüsste nicht einmal wo und was ich da anpassen müsste.
hmm... naja vielen Dank schonmal für euere Antworten ich werde einfach mal weiter versuchen, vielleicht habe ich ja Glück und ich mache aus Versehen irgendwo ein Häkchen, das mein Problem behebt
-
DAOC, man war das nen tolles Spiel.... Albion FOREVER!!!!!
-
Um direkt auf das Topic zu antworten: ja!
Ein C++ Builder 6 Projekt ist durchaus mit einer neueren RAD-Studio Version compilierbar. Das hat nichts mit dem Jahr 2006 zu tun. Es gilt nur die AnsiString vs. UnicodeString Inkompatibilitäten zu beseitigen.
Du hast jedoch keine aktuell benutzte Compiler- / Studioversion angegeben. Das wird also nicht ganz klar.ThemeMgr brauchst du unter neueren Rad-Studios nicht. Denn da wird alles von Haus aus in dem benutzten Windows-Theme dargestellt, auch TGroupBox
Was du mit VirtualTreeView machst, wird nicht klar.
Indy ist in neuer Version kompatibel zu deiner verwendeten RAD-Studio Version verfügbar.
Inno-Setup ist standalone nutzbar. Das hat mit deiner Entwicklerversion nichts zu tun.
Toolbar2000 klingt erstmal alt, ka was du damit machst.
Falls du konkrete Compilermeldungen posten könntest, wäre das sicher hilfreich
Viele Grüße
int02h
-
MORAS hat auch noch eigene Komponenten, die mit beiliegen Ordner components) diese müssen als erstes compiliert und installiert werden.
-
DAOC schrieb:
DAOC, man war das nen tolles Spiel.... Albion FOREVER!!!!!
in der Classic Version ist es das immer noch
also was die einzelnen Komponenten wie VirtualTreeView und Toolbar ect. machen weiss ich leider selber nicht.
im Moment bin ich mal wieder mein Betriebssystem am neu aufsetzen denn ich habe da wohl einige System Bibliotheken verschoben oder k.A.
aber vielleicht klappt es ja wenn alles nochmal sauber installiert ist.
wenn nicht, werde ich gerne die Compilermeldungen posten.
allerdings kamen beim Kompillieren keine Fehlermeldungen, erst als es anfing zu linken, kam sofort dieser blöde Fehler.einige Features brauche ich gar nicht, z.B. muss ich damit nicht ins Internet, weil ich keine online updates brauche und ich brauche auch dieses Gnugettext nicht denn das Programm darf ruhig ausschliesslich in englischer Sprache laufen.
damit würde das Programm ja sicher etwas kleiner werden.
nur dazu muss man ja auch den Quellcode ändern oder ?Und was heisst das : AnsiString vs. UnicodeString Inkompatibilitäten beseitigen ?
müssten da einzelne Befehle nur ersetzt werden ?
-
DAOC MORAS schrieb:
MORAS hat auch noch eigene Komponenten, die mit beiliegen Ordner components) diese müssen als erstes compiliert und installiert werden.
ich weiss nicht mehr wie, aber ich hatte es geschafft diese zu kompillieren und zu installieren
die wurden auch unter "Packages" angezeigt.
Ich habe auch alles genau in die Pfade installiert, die in der Projektdatei des Entwicklers stehen.
-
eifelhexe schrieb:
Und was heisst das : AnsiString vs. UnicodeString Inkompatibilitäten beseitigen ?
müssten da einzelne Befehle nur ersetzt werden ?Er meint im Prinzip das gleiche, was ich geschrieben habe. Man muss halt an Program und Komponenten Anpassungen vornehmen, weil der Text standardmäßig jetzt nicht mehr als ein Byte pro Zeichen sondern als UTF-16 (zwei oder vier Byte pro Zeichen) dargestellt wird. Es gibt dann halt zwei Arten von Fehlern, welche wo der Compiler meckert und welche die zwar übersetzt werden, aber nicht mehr das richtige tun.
Auch habe ich ja nicht geschrieben, dass man ein altes Projekt nicht mit einer neunen Version kompilieren kann, sondern dass das nicht immer problemlos ist. Wir hatten erst letzte Woche hier eine Frage dazu:
http://www.c-plusplus.net/forum/313090Was diese Linker Fehler angeht, es gab da welche die auftauchten, wenn ein Projekt eine gewisse Größe erreichte. Je nach Projektart und Einrichtung der IDE (Anzahl Fremdkomponenen im Projekt oder der IDE) waren manche Leute viel und andere weniger von diesen Problemen betroffen.
-
lol ich glaube es selber noch nicht, aber ich habe es geschafft mit BCB6 !!!
zum Schluss ist der Startbildschirm des Programmes aufgegangen und ich habe keine Ahnung was ich nun tun muss.
Auf jeden Fall mach ich jetzt gar nix bis einer von euch mir sagt was...
-
hm... ich habe gerade die exe gefunden
also muss ich wohl nichts mehr machen.
nun kann ich meine Übersetzungen in dem Parser vornehmen, kann sein das ich mich wieder melde
und vielen Dank an alle
-
so da bin ich schon wieder
und hoffe das ich mit meiner Angelegenheit immer noch im richtigen Forum bin.wie schon geschrieben, konnte ich den code endlich kompillieren
und ich konnte auch die zu übersetzenden Teile übersetzen und es funktioniert immer noch.nun habe ich allerdings immer noch ein hoffentlich kleines Problem :
der Parser liest den Chatlog aus und fügt die Werte in ein .xml Dokument ein.
Das tut er auch so wie er sollte,allerdings bei einem Wert will er nicht:Das hier z.B. soll er lesen:
[11:20:27] <Begin Info: Obedience> [11:20:27] [11:20:27] usable by: [11:20:27] - Spiritmaster [11:20:27] - Runemaster [11:20:27] - Bonedancer [11:20:27] [11:20:27] Magical Bonuses: [11:20:27] - Summoning: 4 pts [11:20:27] - Constitution: 18 pts [11:20:27] - Matter: 10% [11:20:27] - Power: 8 pts [11:20:27] [11:20:27] Focus Bonuses: [11:20:27] - ALL spell lines: 50 lvls [11:20:27] [11:20:27] [11:20:27] Level Requirement: [11:20:27] - 50 Level [11:20:27] [11:20:27] Damage Modifiers: [11:20:27] - 16,5 Base DPS [11:20:27] - 4,5 Weapon Speed [11:20:27] - 100% Quality / 100% Condition [11:20:27] - Damage Type: Crush [11:20:27] [11:20:27] Effective Damage: [11:20:27] - 16,5 DPS [11:20:27] <End Info>
das liest er alles korrekt bis auf das:
[11:20:27] Focus Bonuses:
[11:20:27] - ALL spell lines: 50 lvlsich habe herausgefunden, das,wenn dieser Wert unter "10" liegt, es korrekt ausgelesen wird sobald er aber auf 10 oder höher geht findet er ihn gar nicht mehr, hat vielleicht jemand eine Ahnung ?
#include <assert.h> #include <StrUtils.hpp> #pragma hdrstop #include "ChatLog.h" #include "Utils.h" #include "MainFrame.h" // Brauch die xml_config Struktur // Mit diesem String beginnt der Info-Bereich const char strInfoStart[] = "<Begin Info:"; // Mit diesem String endet der Info-Bereich const char strInfoStop[] = "<End Info>"; // Mit diesem String beginnt der Info-Bereich const char strMagBoniStart[] = "Bonuses:"; // Ein paar Strings zur identifikation bestimmter Werte const char strAF[] = "Armor"; const char strAbsorb[] = "Absorption"; // Daraus läßt sich Rüstungsklasse gewinnen const char strQuality[] = "Quality"; const char strSpeed[] = "Weapon"; const char strUnique[] = "Einzigartiger Gegenstand"; const char strCrafted[] = "Hergestellt von:"; const char strBonus[] = "Bonus auf"; const char strBonus2[] = "Bonus zum"; const char strRestriction[] = "usable by:"; const char strArtifact[] = "Artefakt:"; const char strActivLevel[] = " (Benötigte Objektstufe:"; //--------------------------------------------------------------------------- CChatLog::CChatLog() { fChatLog = NULL; arItemNames = new TStringList; }; CChatLog::~CChatLog() { CloseChatLog(); delete arItemNames; }; // Öffnet die ChatLog-Datei für Lesezugriff int CChatLog::OpenChatLog(const char* Filename) { if (fChatLog != NULL) delete fChatLog; // Seek funktioniert nur richtig im binary-mode. Nur ist jetzt immer /r hinter einem String fChatLog = new fstream(Filename, ios_base::in | ios_base::binary); iLineNo = 0; if (fChatLog->is_open()) return true; else return false; }; void CChatLog::CloseChatLog() { if (fChatLog != NULL) { fChatLog->close(); delete fChatLog; } fChatLog = NULL; }; // enumwerte des Parsers in Init enum ParserStateInit { STATE_START, // Scanne nach Start einer Info-Section STATE_ITEM, // Suche danach in der Sektion, das es ein Gegenstand ist }; // Diese Funktion scannt erstmal das gesamte Log nach Gegenständen und merkt // sich deren Position. In einem zweiten durchlauf wird versucht, die Herkunft // der Gegenstände herauszubekommen. Doppelte Items werden herausgefiltert void CChatLog::Init(void) { int posStart; // Startposition des aktuellen Info-Bereichs AnsiString strName; // Name des aktuellen Info-Bereichs char Line[1024]; // Hier eine maximale Länge eines Textes heruasfinden bool bIsItem; nItems = 0; iLineNo = 0; arItemNames->Clear(); arOffsets.Length = 0; ParserStateInit State = STATE_START; fChatLog->seekg(0, ios::beg); // Lesezeiger auf Dateianfang fChatLog->getline(Line, 1024); while(!fChatLog->eof()) { assert(StrLen(Line) < 1024); iLineNo++; switch (State) { case STATE_START: { // Suche nach dem Start eines Info-Bereichs char *pStart = AnsiStrPos(Line, (char*)strInfoStart); if (pStart != NULL) { posStart = fChatLog->tellg() - fChatLog->gcount(); AnsiString sTemp = pStart; strName = sTemp.SubString(sizeof(strInfoStart) + 1, StrLen(pStart) - sizeof(strInfoStart)- 2); // Jetzt mal schauen, ob es einen Doppelpunkt gibt. int p = strName.AnsiPos(':'); if (p > 0) { // Wenn ja, dann den String bis dorthin abschneiden strName = strName.SubString(p + 2, strName.Length() - p - 1); } bIsItem = false; State = STATE_ITEM; } } break; case STATE_ITEM: { // Suche nach Magieboni oder Info-Sektion Ende char *pStart = AnsiStrPos(Line, (char*)strMagBoniStart); if (pStart != NULL) bIsItem = true; // Ist Info-Sektion zu Ende? pStart = AnsiStrPos(Line, (char*)strInfoStop); if (pStart != NULL) { State = STATE_START; // Nach der nächsten Info-Sektion suchen if (bIsItem) { // Ende Info-Sektion und es ist ein Gegenstand // Also in die Liste der zu untersuchenden Gegenstände aufnehmen int index; if ((index = arItemNames->IndexOf(strName)) == -1) { // Item mit diesem Namen gibts noch nicht (im Logfile) arItemNames->Add(strName); arOffsets.Length = nItems + 1; arOffsets[nItems] = posStart; nItems++; } else { // Name gibts schon. Offset aber auf diesen setzen, // da immer das letzte das aktuellste sein sollte arOffsets[index] = posStart; } } } } break; } fChatLog->getline(Line, 1024); } } // Diese Funktion macht die eigentliche Lesearbeit // Input ist dabei der Index des zu beschaffenden Items und einen Zeiger // auf eine CItem-Klasse, welche ausgefüllt werden soll // Rückgabe ist true für keinen Fehler int CChatLog::GetItem(int index, CItem* Item) { unsigned int i; char Line[1024]; // Hier eine maximale Länge eines Textes heruasfinden char sArg[64]; // Längere Bonusbezeichnungen gibts glaub nicht int NextBonus = 0; // Welche Position soll der nächste Bonus eingetragen werden int NextRestriction = 0; // Nächster Index einer Klassenbeschränkung bool bRestriction = false; if ((index < 0) && (index >= nItems)) return false; // Itemindex nicht im gültigen Bereich Item->Init(); Item->Name = arItemNames->Strings[index]; Item->Realm = player->Realm; // Immer Realm des Spielers annehmen Item->Quality = 0; // Versuche Aufgrund des Namen auf den Itemslot zu schliessen AnsiString strTemp = Item->Name.LowerCase(); for (i = 0; i < 18; i++) { for (int j = 0; j < xml_config.arItemSlots[i].arIds.Length; j++) { if (strTemp.AnsiPos(xml_config.arItemSlots[i].arIds[j]) > 0) Item->Position = i; } } // Lesezeiger auf Beginn der entsprechenden Info-Sektion stellen fChatLog->clear(); // Ist nötig, da wir eventuell noch im eof-state sind fChatLog->seekg(arOffsets[index], ios::beg); fChatLog->getline(Line, 1024); // Erste Zeile Lesen (kann ignoriert werden) fChatLog->getline(Line, 1024); // Erste Zeile mit Infos while(!fChatLog->eof()) { assert(StrLen(Line) < 1024); int Value = 0; // Ist Info-Sektion zu Ende? char *pStart = AnsiStrPos(Line, (char*)strInfoStop); if (pStart!= NULL) break; if (Line[11] == '-') { // Alles danach ist ein Wert, der mich interessiert // Suche erstmal nach einem Zahlenwert. Sollte immer nur einer sein // Bonus-Argument ist immer der String vor einem Doppelpunkt, // oder der String hinter einer Zahl bool bValue = false; // Gibts eine Zahl? bool bDoppel = false; // gibt es einen Doppelpunkt im String bool bPercent = false; // Es ist ein Prozent-Wert int pArg = 0; // Aktuelle Position im Argument-String for (i = 13; i < StrLen(Line); i++) { if ((Line[i] >= '0') && (Line[i] <= '9')) { bValue = true; Value = Value * 10 + Line[i] - '0'; } else if (Line[i] == ':') bDoppel = true; else if (Line[i] == ' ') { if (bValue && (bDoppel || (pArg > 0))) break; pArg = 0; } else if (Line[i] == '%') bPercent = true; else if ((Line[i] == '\r') || (Line[i] == ',')) {} // Diese Zeichen ignorieren else { sArg[pArg++] = Line[i]; sArg[pArg] = 0; } } if (bValue) { // In xml_config nach einem entsprechendem Boni suchen int bid = xml_config.GetBonusId(sArg, bPercent); if (bid < 0) { // testen, ob der gesamte Text nicht vielleicht doch ein Bonus ist bid = xml_config.GetBonusId(MidStr(AnsiString(Line), 14, i - 16), bPercent); } if (bid >= 0) { // Es ist ein regulärer Bonus Item->Effect[NextBonus] = bid; Item->EffectValue[NextBonus] = Value; NextBonus++; } else { // Hier ein paar zusätzliche Werte nehmen, die keine Boni sind if (strcmp(sArg, strAF) == 0) Item->AF = Value; if (strcmp(sArg, strQuality) == 0) Item->Quality = Value; if (strcmp(sArg, strSpeed) == 0) Item->Speed = Value; if (strcmp(sArg, strAbsorb) == 0) { // Value in Rüstungsklasse umwandeln switch (Value) { case 0: Item->Class = 0; Item->Level = Item->AF;break; case 10: Item->Class = 1; Item->Level = Item->AF / 2; break; case 19: Item->Class = 2; Item->Level = Item->AF / 2; break; case 27: Item->Class = 3; Item->Level = Item->AF / 2; break; case 34: Item->Class = 4; Item->Level = Item->AF / 2; break; } //if (Item->Position < 0) // Item->Position = 0; // Alle Rüstungen als Handschuhe annehmen // Es gibt leider keine Info darüber im Log // Wenn wir die Position auf -1 lassen, dann kommt automatisch eine Auswahlbox } if (strcmp(sArg, "DPS") == 0) { // Nur ersten DPS-Wert speichern if (Item->DPS == 0) { Item->DPS = Value; // Berechne den Itemlevel int level = (Value - 11) / 3; if (level > 51) level = 51; Item->Level = level; } } } } } // else { // noch ein paar besondere Strings auswerten if (strncmp(&Line[11], strUnique, sizeof(strUnique) - 1) == 0) { // Unique Gegenstände nicht importieren return false; } if (strncmp(&Line[11], strCrafted, sizeof(strCrafted) - 1) == 0) { // Craftet Gegenstände nicht importieren return false; } if (strncmp(&Line[11], strArtifact, sizeof(strArtifact) - 1) == 0) { Item->MaxLevel = 10; Item->Realm = 7; } if ((strncmp(&Line[11], strBonus, sizeof(strBonus) - 1) == 0) \ || (strncmp(&Line[11], strBonus2, sizeof(strBonus2) - 1) == 0)) { // Spezielle Werte (meist Bonuserhöhungen) // Bonus auf BONUS: VALUE unsigned int i; for (i = 21; i < StrLen(Line); i++) { // Alles bis zum Doppelpunkt in sArg kopieren if (Line[i] == ':') break; sArg[i - 21] = Line[i]; } sArg[i - 21] = 0; for (; i < StrLen(Line); i++) { if ((Line[i] >= '0') && (Line[i] <= '9')) { Value = Value * 10 + Line[i] - '0'; } } // In xml_config nach einem entsprechendem Boni suchen int bid = xml_config.GetBonusId(sArg); if (bid >= 0) { // Es ist ein regulärer Bonus Item->Effect[NextBonus] = bid; Item->EffectValue[NextBonus] = Value; NextBonus++; } else { // Fehlermeldung Application->MessageBoxA(AnsiString("Ein Bonus '" + AnsiString(sArg) + "' ist unbekannt!\nDie Datei 'config.xml' bzw. die entsprechende Sprachdatei anpassen!").c_str(), "Fehler"); } } if (strncmp(&Line[11], strActivLevel, sizeof(strActivLevel) - 1) == 0) { // Danach kommt ne Zahl, welche den Level angibt int level = Str2Int(&Line[11 + sizeof(strActivLevel)]); Item->EffectLevel[NextBonus - 1] = level; } unsigned int cp = 12; if ((strncmp(&Line[11], strRestriction, sizeof(strRestriction) - 1) == 0) \ || (strncmp(&Line[12], strRestriction, sizeof(strRestriction) - 1) == 0)) { // Solange nachfolgende Strings eine Klasse darstellen, solange // diese bei den Beschränkungen eintragen bRestriction = true; cp = 12 + sizeof(strRestriction); } while (bRestriction && (cp < StrLen(Line))) { int pArg = 0; for (; cp < StrLen(Line); cp++) { if ((Line[cp] == ' ') || (Line[cp] == ',') || (Line[cp] == '-') || (Line[cp] == '\r')) { sArg[pArg] = 0; if (pArg > 0) { // Es gibt einen String. Schauen obs ne Klasse ist int cid = xml_config.GetClassId(sArg); if (cid >= 0) { Item->ClassRestriction[NextRestriction++] = cid; } else { // Keine Klasse mehr, Modus aufheben bRestriction = false; } } pArg = 0; } else { sArg[pArg++] = Line[cp]; } } } } fChatLog->getline(Line, 1024); } return true; } #pragma package(smart_init)