Seite 128 von 180 ErsteErste ... 2878118124125126127128129130131132138178 ... LetzteLetzte
Ergebnis 1.906 bis 1.920 von 2699

Thema: Der SDK-Fragen-Thread

  1. #1906
    Whovian Avatar von antriot
    Registriert seit
    30.09.12
    Ort
    TARDIS Type 40
    Beiträge
    2.641
    Ja ich nutze VS 2010 Express
    Aber irgendwie funzt das bei mir nicht so wie du das beschreibst...
    Tick tock goes the clock...

  2. #1907
    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 antriot Beitrag anzeigen
    Ja ich nutze VS 2010 Express
    Aber irgendwie funzt das bei mir nicht so wie du das beschreibst...
    Also:
    Schritt 1: Erstellen einer Debug-DLL
    Schritt 2: Setzen von Haltepunkten (zu Beginn gerne reichlich, die können ja nachher sukzessive deaktiviert oder gelöscht werden)
    Schritt 3: Ersetzen der normalen DLL mit der Debug-DLL
    Schritt 4: Starten von Civ4
    Schritt 5: in VS2010: Anhängen an den Prozess Civilization4.exe, oder wie immer die bei Civ4 dann heißen mag (ich spiele halt Colonization).

    Nun sollte das Programm irgendwann bei einem der gesetzten Haltepunkte stehenbleiben. Dann kannst du mal über die Variablen in den Zeilen oberhalb des Haltepunktes fahren, die sollten dann nämlich mit Werten schon versorgt worden sein. Am rechten Rand des kleinen aufploppenden Fensterchens siehst du die vorher erwähnte "Reisszwecke".


  3. #1908
    Whovian Avatar von antriot
    Registriert seit
    30.09.12
    Ort
    TARDIS Type 40
    Beiträge
    2.641
    Jetzt hab ich Volltrottel das Save mit dem Endlosturn überschrieben
    Damit hat sich die ganze Sache erstmal erledigt. Für den Fall dass ich noch einen bekomme, probiere ichs nochmal mit dem Debuggen.
    Tick tock goes the clock...

  4. #1909
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Hast du das Save stink nomral genannt? Sowas bezeichnet man so individuel, dass sowas garnicht passieren kann und man genau weiß, warum es das Save gibt.

  5. #1910
    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 antriot Beitrag anzeigen
    Jetzt hab ich Volltrottel das Save mit dem Endlosturn überschrieben
    Damit hat sich die ganze Sache erstmal erledigt. Für den Fall dass ich noch einen bekomme, probiere ichs nochmal mit dem Debuggen.
    Hast du kein Autosave aktiviert?


  6. #1911
    Whovian Avatar von antriot
    Registriert seit
    30.09.12
    Ort
    TARDIS Type 40
    Beiträge
    2.641
    Zitat Zitat von Commander Bello Beitrag anzeigen
    Hast du kein Autosave aktiviert?
    Doch schon. Das ganze lief wie folgt ab:

    Endlosturn unter einem speziellen Namen abgespeichert.
    Dann hatte ich Lust auf ne normale Partie (soll neben dem modden auch mal vorkommen )
    Damit waren die Autosaves schon mal weg.
    Anschließend hab ich die Partie abgespeichert. Aus reiner Gewohnheit unter dem Namen, der als erstes in der Liste ganz oben stand. Also den Endlosturn. 2 Millisekunden danach hab ich dann schon gem,erkt wie bescheuert das von mir war
    Tick tock goes the clock...

  7. #1912
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Dann speichere spezielle Save besser an einen Speziellen Ort ab. Der Ordner kannst du ja einfach ingame auswählen.

  8. #1913
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Ich habe hier eine Funktion f aus dem SDK, welche von verschiedenen Stellen in der Exe aufgerufen wird. Kann man irgendwie auf den Aufruf-Stack zugreifen, um zu unterscheiden welche Funktion/Position f aufgerufen hat?

    Anders formuliert, bei einer Verschachtelung g(f()) und h(f()) will ich in f wissen ob g oder h genutzt wurde.

    Bem.: Evtl. ist es so, dass g oder h selber im SDK liegt. Dann könnte ich ein Flag setzen. Muss ich aber noch untersuchen.

  9. #1914
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Ah, ich habe was. Da bei allen die Exe gleich ist, sollten doch auch die Pointer konstant sein?!
    Code:
    			void ** puEBP = NULL;
    			__asm { mov puEBP, ebp };
    			void * pvReturn = puEBP[1]; // this is the caller of my function
    
    			puEBP = (void**)puEBP[0];    // walk back to the previous frame
    			void * pvReturn2 = puEBP[1]; // this is the caller's caller
    
    			puEBP = (void**)puEBP[0];    // walk back to the previous frame
    			void * pvReturn3 = puEBP[1]; // this is the caller's caller
    
    			puEBP = (void**)puEBP[0];    // walk back to the previous frame
    			void * pvReturn4 = puEBP[1]; // this is the caller's caller

  10. #1915
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    22.446
    Pointer sind iirc im Allgemeinen ungleich, auch bei zwei verschiedenen Aufrufen der selben Funktion.

  11. #1916
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Ich habe eine generelle Frage...

    Ich habe eine Struktur angelegt
    Code:
    struct CBM_CombatDetails
    {
    ...
        // from here on attack values
        int iBaseCombatStrAtt; 
    ...
    };
    Die Elemente dieser Struktur sollen in der folgenden Funktion initialisiert werden:
    Code:
    void CvUnit::initCombatDetails(CBM_CombatDetails* pCombatDetails)
    {
        if (pCombatDetails != NULL)
        {
            pCombatDetails->iBaseCombatStrAtt = 0;
    ...
    ...
        }
    }
    Das funktioniert so weit wohl auch.

    Die Frage ist, kann ich das auch erreichen (und wenn ja, wie?), ohne dass ich Parameter übergeben muss?
    Der Funktionskopf sollte dann so aussehen:
    void CvUnit::initCombatDetails()
    aber die Funktion soll wissen, dass es sich um die Struktur CBM_CombatDetails handeln wird.

    Nachtrag:
    Ich versuche gerade, das gewünschte Ergebnis auf folgende Weise zu erreichen:
    Code:
    void CvUnit::initCombatDetails()
    {
        CBM_CombatDetails pCombatDetails;
    
        pCombatDetails.iBaseCombatStrAtt = 0;
      
    }
    erhalte dabei aber unter pCombatDetails.iBaseCombatStrAtt = 0; eine rote Linie mit dem Hinweis: "Error: Der Ausdruck muss einen Zeigertyp aufweisen"
    Obige Zeile hat sich erledigt. Ich hatte irgendwo vergessen, eine Klammer } zu setzen...
    Jetzt zeigt mir zumindest Intellisense keine Fehler mehr an.
    Geändert von Commander Bello (20. Oktober 2014 um 20:52 Uhr)


  12. #1917
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Die Struktur (eher Strukturdeklaration) CBM_CombatDetails* pCombatDetails ist ja erst einmal nur eine Schablone. Du musst daher auch noch eine Variable mit diesem Typ definieren.

    Gehen wir von dem Fall aus, dass du nur eine temporäre Variable benötigtst. Dann könntest du beispielsweise CvUnit ergänzen um
    static CBM_CombatDetails combatDetails; // Achtung, kein Pointer. Es soll ja Speicher allokiert werden.

    Auf diese Variable könntest du dann in deiner Initialisierungs-Funktion zugreifen:
    CvUnit.combatDetails.xyz = 1;


    Dazu aber gleich zwei Warnungen:
    1. Damit hast du programmweit nur eine einzige Instanz. Alle Einheiten (CvUnit) greifen dann auf die gleichen Werte zu! (Aber ich glaube, dass du ja genau das haben wolltest.)

    2. Ich will sie jetzt nicht auflisten, aber es hat eine Reihe von Nachteilen, wenn man statische Variablen benutzt. Man muss immer genau abwägen und nur einsetzen, wenn man genau die Eigenschaften braucht, die nur statische Variablen haben.

  13. #1918
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Zitat Zitat von Commander Bello Beitrag anzeigen
    Ich habe eine generelle Frage...
    Ich nehme an, du willst deine Struktur auf eine bestimmte Weise initialisieren. Was du brauchst ist ein Konstruktor für deine Struktur. (Strukturen sind ähnlich wie Klassen und können wie diese Methoden und insbesondere Konstruktoren besitzen.)

  14. #1919
    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
    Ich nehme an, du willst deine Struktur auf eine bestimmte Weise initialisieren. Was du brauchst ist ein Konstruktor für deine Struktur. (Strukturen sind ähnlich wie Klassen und können wie diese Methoden und insbesondere Konstruktoren besitzen.)
    Hilfe. Ihr sprecht mit mir!
    D.h., ihr sprecht mit einem sehr, sehr Ahnungslosen.

    Kurz gesagt, möchte ich folgendes tun:
    In einer Funktion CvUnit::CBM_CombatStr(const CvUnit* pAttacker, const CvUnit* pDefender, const CvPlot* pPlot, CBM_CombatDetails* pCombatDetails) ermittle ich zentral für jeweils pAttacker und pDefender alle Werte, die für die Stärkeberechnung von kämpfenden Einheiten notwendig sind (Basisstärke, "Gesundheit", Verteidigungswerte fürs Gelände, usw.).
    (Hintergrund: die ursprüngliche Funktion maxCombatStr(...) wird nämlich für die Kampfberechnung bis zu 6mal in Folge aufgerufen)
    Diese Werte speichere ich in den Elementen der Struktur CBM_CombatDetails ab, um nachfolgend in den Funktionen zur eigentlichen Kampfberechnung darauf zugreifen zu können.
    Es werden aber nicht zwingend alle Elemente von CBM_CombatDetails pro Stärkeberechnung ermittelt, mit anderen Worten, es könnten Werte aus vorhergehenden Berechnung darin noch enthalten sein (genauere Erläuterungen mögen mir erspart bleiben, weil sonst das gesamte Kampfsystem besprochen werden müsste).
    Um das zu vermeiden, möchte ich tatsächlich in der neuen Funktion initCombatDetails() alle Elemente von CBM_CombatDetails initialisieren.

    Das sind meine Absichten.

    Was du mit "Konstruktor" meinst, ist mir schon nur nebelhaft klar und wie es umzusetzen wäre, liegt z.Zt. sicherlich jenseits meines Horizontes.
    Es geht schlicht um die Initialisierung von CBM_CombatDetails um nachfolgend die Elemente (d.h., deren Werte) innerhalb der Kampfberechnungen nutzen zu können.


  15. #1920
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Einfach mal ein Beispiel was ich meine:

    Code:
    struct Data {
    
    int x;
    int y;
    
    Data() 
    {
        // Standardkonstruktor
        x = 0;
        y = 0;
    }
    
    Data(int a, int b)
    {
        // Konstruktor mit Parametern
        x = a;
        y = b;
    }
    
    };
    Mögliche Anwendung:

    Code:
    Data d1;   // Standardkonstruktor wird aufgerufen
    Data d2(1, 2)  // Der Konstruktor mit entsprechenden Parametern wird aufgerufen

Seite 128 von 180 ErsteErste ... 2878118124125126127128129130131132138178 ... LetzteLetzte

Berechtigungen

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