Seite 24 von 180 ErsteErste ... 142021222324252627283474124 ... LetzteLetzte
Ergebnis 346 bis 360 von 2699

Thema: Der SDK-Fragen-Thread

  1. #346
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Und das "offizielle" Makefile soll funktionieren? Weil da fehlt ein Verweis darauf, wo das Boost- bzw Python-Verzeichnis liegt (als absoluter Pfad). Basierend auf diesen Angaben ist es erst möglich, die Include-Verzeichnisse zu bestimmen.

    Edit: Das sieht mir auch nach einer älteren Version aus.

  2. #347
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Probiere mal diese Makefile aus.
    Ich weis jetzt nur nicht, wie die Verzeichnisstruktur von Civ4Col aussieht.
    Was du anpassen musst sind diese Zeilen:

    Code:
    #### Paths ####
    [...]
    
    CIVINSTALL=""
    GLOBALBOOST=$(CIVINSTALL)\CvGameCoreDLL\Boost-1.32.0
    GLOBALPYTHON=$(CIVINSTALL)\CvGameCoreDLL\Python24
    Es musst auf jedenfall angegeben werden, wo sich das Boost- bzw. Python-Verzeichnis befindet. Ggf. ist dafür die Variable "CIVINSTALL" nicht nötig und kann entfernt werden.
    Angehängte Dateien Angehängte Dateien

  3. #348
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Zitat Zitat von alpha civ Beitrag anzeigen
    Und das "offizielle" Makefile soll funktionieren? Weil da fehlt ein Verweis darauf, wo das Boost- bzw Python-Verzeichnis liegt (als absoluter Pfad). Basierend auf diesen Angaben ist es erst möglich, die Include-Verzeichnisse zu bestimmen.

    Edit: Das sieht mir auch nach einer älteren Version aus.
    Wieso fehlt der Verweis?
    Aus dem "Makefile.txt":
    Code:
    #### INCLUDES ####
    GLOBAL_INCS=/I"$(TOOLKIT)/include" /I"$(PSDK)/Include" /I"$(PSDK)/Include/mfc"
    PROJECT_INCS=/IBoost-1.32.0/include /IPython24/include
    Debug_INCS=$(PROJECT_INCS) $(GLOBAL_INCS)
    Release_INCS=$(PROJECT_INCS) $(GLOBAL_INCS)
    
    #### LIBS ####
    GLOBAL_LIBS=/LIBPATH:"$(TOOLKIT)/lib" /LIBPATH:"$(PSDK)/Lib" winmm.lib user32.lib
    PROJECT_LIBS=/LIBPATH:Python24/libs /LIBPATH:boost-1.32.0/libs/ boost_python-vc71-mt-1_32.lib
    Debug_LIBS=$(PROJECT_LIBS) $(GLOBAL_LIBS) msvcprt.lib #/NODEFAULTLIB:msvcprtd.lib
    Release_LIBS=$(PROJECT_LIBS) $(GLOBAL_LIBS)
    Ich gebe aber zu, dass ich mit dem roten Teil nicht klarkomme. Die Datei "boost_python-vc71-mt-1_32.lib" ist Teil von "..../libs"


    Nachtrag: Danke für deinen Hinweis und das Makefile. Werde ich nachher mal ausprobieren, jetzt muss ich erst mal weg.
    Ich werde dann berichten.


  4. #349
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Zitat Zitat von Commander Bello Beitrag anzeigen
    Wieso fehlt der Verweis?
    Aus dem "Makefile.txt":
    Code:
    #### INCLUDES ####
    GLOBAL_INCS=/I"$(TOOLKIT)/include" /I"$(PSDK)/Include" /I"$(PSDK)/Include/mfc"
    PROJECT_INCS=/IBoost-1.32.0/include /IPython24/include
    Debug_INCS=$(PROJECT_INCS) $(GLOBAL_INCS)
    Release_INCS=$(PROJECT_INCS) $(GLOBAL_INCS)
    
    #### LIBS ####
    GLOBAL_LIBS=/LIBPATH:"$(TOOLKIT)/lib" /LIBPATH:"$(PSDK)/Lib" winmm.lib user32.lib
    PROJECT_LIBS=/LIBPATH:Python24/libs /LIBPATH:boost-1.32.0/libs/ boost_python-vc71-mt-1_32.lib
    Debug_LIBS=$(PROJECT_LIBS) $(GLOBAL_LIBS) msvcprt.lib #/NODEFAULTLIB:msvcprtd.lib
    Release_LIBS=$(PROJECT_LIBS) $(GLOBAL_LIBS)
    Ich gebe aber zu, dass ich mit dem roten Teil nicht klarkomme. Die Datei "boost_python-vc71-mt-1_32.lib" ist Teil von "..../libs"
    Der Compiler muss aber wissen, wo sich die Verzeichnisse befinden, das heisst irgenwo im Makefile muss ein absoluter Pfad zu diesen Verzeichnissen stehen (wenn die Variablen alle eingesetzt werden). Was in der alten Makefile auch fehlt ist ein Verweis auf den Ordner, wo sich die Libs finden lassen.
    (Die Einträge

    /LIBPATH:"$(GLOBALBOOST)/libs" /LIBPATH:"$(GLOBALPYTHON)/libs"

    fehlen auch. Selbst wenn dann korrekt alles compiliert wird, würde der Linker meckern, dass er die Libs nicht findet.)

  5. #350
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Ich werde mich dieser Tage bzgl. meines Problems wieder melden. Im Moment scheint mein Rechner nicht korrekt zu funktionieren.


  6. #351
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Ich bin's wieder.

    Mit neuem Rechner habe ich nun einen neuen Anlauf unternommen, eine DLL zu kompilieren.
    Verwendetes Tool ist MS Visual C++ 2010. Stand heute (11.11.2012) sind alle Updates zu Windows und den verwendeten MS-Programmen installiert.

    Es fängt auch wunderschön an, endet nur leider in einer umfangreichen Auflistung von Warnungen (bzgl. neuer oder ersetzter Funktionen) und in dieser Fehlermeldung:
    1>CvGame.cpp(6621): error C3861: "OutputDebugStr": Bezeichner wurde nicht gefunden.
    1>NMAKE : fatal error U1077: ""D:\020_Programme\Microsoft Visual Studio 10.0\VC\bin\cl.exe"": R³ckgabe-Code "0x2"
    1> Stop.
    1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.MakeFile.Targets(38,5): error MSB3073: Der Befehl "nmake Debug" wurde mit dem Code 2 beendet.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    Ich nehme an, dass der markierte Teil das eigentliche Problem darstellt.

    Für alle Fälle habe ich mal die gesamte Liste der Meldungen als Textfile angehängt.

    Das hier ist die bemängelte Stelle in der CvGame.cpp:
    Code:
        OutputDebugStr(CvString::format("[CvGame::updateOceanDistances] Plots: %i, Visits: %i\n", GC.getMapINLINE().numPlotsINLINE(), iVisits).GetCString());
    }
    Der Bezeichner sei nicht definiert, lautet die Meldung in der Datei. Es handelt sich um die letzte Zeile in der Datei, daher bin ich geneigt, sie gleich zu Testzwecken einfach auszukommentieren.

    Es handelt sich dabei um eine unveränderte Datei aus Civ4:Colonization

    Meine Bitte(n):
    a) könnte jemand mal kurz über die Warnungen in der Datei gucken und sagen, ob die wesentlich sind?
    a1) Wenn ja, wie habe ich damit umzugehen?
    b) Kann mir jemand erklären, wie es in den Quelldateien von Civ4:Col fehlende Bezeichnerdeklarationen geben kann? Das sollten doch schließlich genau die Dateien sein, aus denen die DLL generiert wurde?
    Angehängte Dateien Angehängte Dateien


  7. #352
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Nach der Auskommentierung der o.a. Zeile erhalte ich bei erneutem Kompilationsversuch jede Menge weitere Fehlermeldungen:
    1>CvPlayerAI.cpp(1474): error C2065: 'iI': nichtdeklarierter Bezeichner
    1>CvPlayerAI.cpp(6152): error C2065: 'pNode': nichtdeklarierter Bezeichner
    1>CvPlayerAI.cpp(6156): error C2227: Links von "->m_data" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1>CvPlayerAI.cpp(8156): error C2227: Links von "->AI_getYieldAdvantage" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    Usw., usw.

    Das erstaunt mich, da ich wie erwähnt im Moment ausschließlich mit Originaldateien (resp. deren unveränderten Kopien) arbeite.

    Hat jemand eine Idee, woran das liegen mag?


  8. #353
    Whovian Avatar von antriot
    Registriert seit
    30.09.12
    Ort
    TARDIS Type 40
    Beiträge
    2.641
    Gibts ein Tutorial für totale SDK-Anfänger? Hab bei den fanatics jetzt nichts gefunden...

  9. #354
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.455
    Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5

    Download von BASE 6.4 [D]: HIER (klick mich!) (Stand: 08.07.2022)

  10. #355
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Ich habe einen Vector folgenden Typ:

    Code:
    std::vector<ProfitChange> m_vctTechChanges;
    ProfitChange ist wie folgend definiert:

    Code:
    struct ProfitChange
    {
    	int iEnum;
    	int *piYieldChange;
    	int *piCommerceChange;
    
    	ProfitChange(void) {piYieldChange = NULL; piCommerceChange = NULL;}
    	~ProfitChange(void) {SAFE_DELETE_ARRAY(piYieldChange); SAFE_DELETE_ARRAY(piCommerceChange);}
    	void read(FDataStreamBase* pStream);
    	void write(FDataStreamBase* pStream);
    };
    Bei mir kommt es zum Absturz, wenn ich ein neues Element dem Vector hinzufüge.

    Code:
    	ProfitChange *pkProfitChange = new ProfitChange;
    	pkProfitChange->iEnum = iIndex;
    	pkProfitChange->piYieldChange = piYieldChange;
    	pkProfitChange->piCommerceChange = piCommerceChange;
    	m_vctTechChanges.push_back(*pkProfitChange);
    	SAFE_DELETE(pkProfitChange)
    Soweit ich weis, wird dem Vector eine Kopie hinzugefügt, weshalb die ursprüngliche Konstruktion gelöschen werden muss. Kann es sein, dass hier keine Kopie gespeichert wird sondern das Original? Wenn ich am Ende nicht SAFE_DELETE anwende, kommt es nicht zum Absturz.
    Geändert von rucivfan (20. Januar 2013 um 17:20 Uhr)

  11. #356
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Bei

    m_vctTechChanges.push_back(*pkProfitChange);

    wird eine Kopie erstellt von pkProfitChange, aber nur eine flache Kopie. D.h. wenn es Attribute gibt, die Zeiger enthalten, dann werden nur die Zeiger kopiert, nicht aber die Objekte, auf die gezeigt wird. Was du braucht ist eine tiefe Kopie, bei der die Arrays mit kopiert werden.

    Aus diesem Grund werden durch

    SAFE_DELETE(pkProfitChange)

    die Arrays

    int *piYieldChange;
    int *piCommerceChange;

    auch in der Kopie gelöscht.

    Abhilfe: Du musst auch einen Kopierkonstruktur schreiben, der die Arrays mit kopiert und nicht nur die Zeiger.


    Edit: D.h. du musst eine Methode mit folgender Signatur hinzufügen:

    ProfitChange(const ProfitChange& other) { //code }


    Grundsätzlich gilt in C++: Wann immer man einer der Methoden "Kopierkonstruktor", "Dekonstruktor", "Zuweisungsoperator" braucht, dann braucht man sie alle.
    Geändert von alpha civ (20. Januar 2013 um 17:47 Uhr)

  12. #357
    Registrierter Benutzer
    Registriert seit
    04.03.07
    Beiträge
    4.694
    Auauau. Also erstmal: Finger weg von new wenn du's nicht brauchst. Ein temporäres Objekt kannste besser aufm Stack anlegen (ProfitChange pc; pc.blah = ...; m_vctTechChanges.push_back(pc); ). Spart Zeit und Code für Programmierer und Computer, und verhindert Fehler

    Zum eigentlichen Fehler: Ja, beim Einfügen in den Vektor wird eine Kopie erstellt. Da du keinen copy constructor definiert hast, erstellt der Compiler einen automatisch. Dieser copy constructor kopiert einfach alle member, also auch die beiden Zeiger (NUR die Zeiger, nicht das worauf sie zeigen). Wenn dann das temporäre Objekt gelöscht wird, löscht ~ProfitChange() auch die Speicherblöcke, auf diese Zeiger verweigen. Da die Zeiger der Kopie aber auch darauf zeigen, sind diese Zeiger jetzt Müll ("dangling pointer").

    Ich weiß jetzt nicht, warum du überhaupt Zeiger hast. Wahrscheinlich kannst und solltest du einfach nur ints (oder vector<int> wenn beides mehrere ints sind) speichern und brauchst keine Zeiger. Dann kann auch der Dekonstruktor weg und das Problem löst sich in Luft auf. FALLS du Zeiger brauchst, dann solltest du der "Rule of Three" folgen und sowohl nen copy constructor als auch nen Zuweisungsoperator (operator=(const ProfitChange &)) definieren. In beiden würdest du dann NEUEN speicher reservieren und die Werte, auf die die Zeiger zeigen, kopieren. Als Beispiel der copy constructor, unter der Annahme das du einzelne Werte hast:

    Code:
    ProfitChange(const ProfitChange &other) {
        piYieldChange = new int;
        *piYieldChange = *other.piYieldChange;
        piCommerceChange = new int;
        *piCommerceChange = *other.piCommerceChange;
    }
    Aber wie gesagt, ich bezweifle ganz stark, dass Zeiger und dynamische Speicherverwaltung hier Sinn machen. Selbst wenn du von irgendwo Zeiger zugereicht kriegst, kannste die recht einfach nen vector Umwandeln, und dann haste das Problem vom Hals.

  13. #358
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Zitat Zitat von alpha civ Beitrag anzeigen
    Bei

    m_vctTechChanges.push_back(*pkProfitChange);

    wird eine Kopie erstellt von pkProfitChange, aber nur eine flache Kopie. D.h. wenn es Attribute gibt, die Zeiger enthalten, dann werden nur die Zeiger kopiert, nicht aber die Objekte, auf die gezeigt wird. Was du braucht ist eine tiefe Kopie, bei der die Arrays mit kopiert werden.

    Aus diesem Grund werden durch

    SAFE_DELETE(pkProfitChange)

    die Arrays

    int *piYieldChange;
    int *piCommerceChange;

    auch in der Kopie gelöscht.

    Abhilfe: Du musst auch einen Kopierkonstruktur schreiben, der die Arrays mit kopiert und nicht nur die Zeiger.


    Edit: D.h. du musst eine Methode mit folgender Signatur hinzufügen:

    ProfitChange(ProfitChange& other) { //code }


    Grundsätzlich gilt in C++: Wann immer man einer der Methoden "Kopierkonstruktor", "Dekonstruktor", "Zuweisungsoperator" braucht, dann braucht man sie alle.
    Die Antwort hilft mir sehr weiter. Danke. Ich hätte eigentlich auch selbst darauf kommen müssen.

    Zitat Zitat von delnan Beitrag anzeigen
    Auauau. Also erstmal: Finger weg von new wenn du's nicht brauchst. Ein temporäres Objekt kannste besser aufm Stack anlegen (ProfitChange pc; pc.blah = ...; m_vctTechChanges.push_back(pc); ). Spart Zeit und Code für Programmierer und Computer, und verhindert Fehler .
    Ich bin mir das Bewusst und hatte es ursprünglich ohne new. Nur gab es auch dort das Problem.
    Geändert von rucivfan (20. Januar 2013 um 18:01 Uhr)

  14. #359
    Registrierter Benutzer
    Registriert seit
    04.03.07
    Beiträge
    4.694
    Dann ist gut Wobei ich mich immer noch frage, warum du die Zeiger in ProfitChange hast. Oder ist das schon von Firaxis?

  15. #360
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Ich nutze Zeiger, weil ich die gleichen Methoden zum Einlesen der XML-Daten wie überall verwende. Ich möchte nur ungern auf verschiedener Weise das tun.

    edit:

    delnan: Auch zu dir möchte ich noch einen Dank aussprechen: Danke
    Geändert von rucivfan (20. Januar 2013 um 18:05 Uhr)

Seite 24 von 180 ErsteErste ... 142021222324252627283474124 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •