Seite 5 von 180 ErsteErste 1234567891555105 ... LetzteLetzte
Ergebnis 61 bis 75 von 2699

Thema: Der SDK-Fragen-Thread

  1. #61
    verschollen Avatar von deepwater
    Registriert seit
    23.04.11
    Beiträge
    1.580
    So ähnlich, ich machs jetzt anders.
    Andere Frage, wie kann ich hier loggen? Also zum Beispiel einzelne Variablen ausgeben? Sowohl im Spiel oder auch in Datei?

  2. #62
    verschollen Avatar von deepwater
    Registriert seit
    23.04.11
    Beiträge
    1.580
    tja, kann mir mal einer sagen, was hier falsch sein soll? Beim Compilieren gibts keinen Fehler, erst beim STARTEN (??????????) eines Spiels???
    Aus CvPlot.cpp
    PHP-Code:
    int CvPlot::calculateImprovementYieldChange(...)
    [...]
        
    //Orbital Cities
        
    if (pCity->isOrbital())
        {
            if (!
    GC.getImprovementInfo(eImprovement).isOrbital())
            {
                return 
    0;
            }
        }
        
    /*else
        {
            if (GC.getImprovementInfo(eImprovement).isOrbital())
            {
                return 0;
            }
        }
        */
    [...] 
    Falls es jemanden interessiert, die Dump-Datei im Anhang, leider zu groß (768 MB)

    ...too old...

  3. #63
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Hat die Funktion noch in allen Fällen einen return-Wert? Wobei, anderenfalls der Kompiler meckern müsste. Der auskommentierte Else-Zweig lässt mich das vermuten...

  4. #64
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Ist pCity == NULL ?
    Woher kommt pCity?

    Zitat Zitat von Ramkhamhaeng Beitrag anzeigen
    Hat die Funktion noch in allen Fällen einen return-Wert? Wobei, anderenfalls der Kompiler meckern müsste. Der auskommentierte Else-Zweig lässt mich das vermuten...
    Man muss in C++ nicht jeden Fall abdecken, das ist nur in Java so.

  5. #65
    Registrierter Benutzer
    Registriert seit
    04.03.07
    Beiträge
    4.694
    Kein return sollte allerdings trotzdem undefined behaviour auslösen, IIRC. Wahrscheinlich in Form eines völlig sinnfreiem Rückgabewertes, was keine unmittelbaren Folgen haben muss, aber durchaus könnte - hängt halt davon ab, wie der benutzt wird. Das ist aber eh alles egal, wenn sich in einem der ... ein unbedingtes return befindet.
    Spuck mal die komplette Funktion aus, dann lässt sich zu beiden Vermutungen mehr sagen.

  6. #66
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Die Methode gibt am Ende ein
    PHP-Code:
    return iYield
    aus (ungemoddet), und ich denke nicht das deepwater da was geändert hat.
    Außerdem würde doch dann der Kompiler meckern, oder?

    Ich denke nach wie vor, dass pCity der Nullzeiger ist.

  7. #67
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Ja, wahrscheinlich ein Nullzeiger. Warten wir mal auf die Angabe der Zeilennummer.

  8. #68
    Registrierter Benutzer
    Registriert seit
    04.03.07
    Beiträge
    4.694
    Ich nehme zur Sicherheit lieber an, dass jeder Modder das halbe SDK rausgeschmissen und neu gemacht hat, als drei Stunden zu verschwenden weil ich nen dummen, kleinen Fehler ausgeschlossen habe Aber ja, null könnte gut sein. Wir können gerne noch weiter philosophieren, aber wissen tun wir erst was, wenn wir die ganze Funktion sehen

  9. #69
    verschollen Avatar von deepwater
    Registriert seit
    23.04.11
    Beiträge
    1.580
    Der Zeiger könnte eigentlich nicht null sein, ist aber irgendwie wahrscheinlich, weil weiter oben wird er schon verwendet, Bei duebuggen des dmp-files kam er bis CvCity::isOrbital und sagte irgendetwas von Zugriffsverletzungen? Die Dunktion kann ich leider erst heute abend liefern, hab hier jetzt kein Civ, etc. Aber danke für die Hilfe, vielleicht habe ich ja weiter oben was übersehen und der Zeiger wurde wieder auf null gestellt, das wäre peinlich.
    Edit: Ja, ein definitiver Rückgabewert ist vorhanden. Noch eine Frage zwischendurch, damit euch nicht langweilig wird , wie kann man überladene Operatoren aus bestimmten Namensbereichen nutzen? Also zum Beispiel bei Bedingungen jüberladene Operatoren einsetzten, ohne obendrüber using namspace std zu schreiben?

    ...too old...

  10. #70
    Registrierter Benutzer
    Registriert seit
    04.03.07
    Beiträge
    4.694
    Zugriffsverletzung sieht in der Tat nach Nullzeiger (oder allgemeiner n kaputter Zeiger) aus

  11. #71
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Zitat Zitat von deepwater Beitrag anzeigen
    Noch eine Frage zwischendurch, damit euch nicht langweilig wird , wie kann man überladene Operatoren aus bestimmten Namensbereichen nutzen? Also zum Beispiel bei Bedingungen jüberladene Operatoren einsetzten, ohne obendrüber using namspace std zu schreiben?
    Über den qualifizierten Namen kannst du an das Zeug kommen.
    Zum Beispiel kann man die Klasse vector ja über std::vector verwenden oder nur vector (setzt "using namespace std" voraus).

  12. #72
    verschollen Avatar von deepwater
    Registriert seit
    23.04.11
    Beiträge
    1.580
    PHP-Code:
    int CvPlot::calculateImprovementYieldChange(ImprovementTypes eImprovementYieldTypes eYieldPlayerTypes ePlayerbool bOptimalbool bBestRoutebool bDisplay) const
    {
        
    PROFILE_FUNC();

        
    BonusTypes eBonus;
        
    int iBestYield;
        
    int iYield;
        
    int iI;

        
    // ************************
        // Edited for Planetfall
        // ************************

        
    CvImprovementInfopImprovementInfo GC.getImprovementInfo(eImprovement);

        
    iYield pImprovementInfo.getYieldChange(eYield);

        if (
    isRiverSide())
        {
            
    iYield += pImprovementInfo.getRiverSideYieldChange(eYield);
        }

        if (
    isHills())
        {
            
    iYield += pImprovementInfo.getHillsYieldChange(eYield);
        }

        
    // PlotType-specific yield changes
        
    iYield += pImprovementInfo.getPlotTypeYieldChange(getPlotType(), eYield);

        if (
    isWater())
        {
            
    iYield += GC.getImprovementInfo(eImprovement).getPlotTypeYieldChange(PLOT_OCEANeYield);
        }

        
    // TerrainType-specific yield changes
        
    TerrainTypes eTerrain getTerrainType();
        if (
    eTerrain != NO_TERRAIN)
        {
            
    iYield += GC.getImprovementInfo(eImprovement).getTerrainTypeYieldChange((TerrainTypes)eTerraineYield);
        }

        
    // Coastal yield change
        
    int iCoastalYieldChange pImprovementInfo.getCoastalYieldChange(eYield);
        if (
    iCoastalYieldChange)
        {
            if (
    isCoastalLand())
            
    iYield += iCoastalYieldChange;
        }

        
    // ************************
        // End Added for Planetfall
        // ************************

        
    if ((bOptimal) ? true isIrrigationAvailable())
        {
            
    iYield += GC.getImprovementInfo(eImprovement).getIrrigatedYieldChange(eYield);
        }

        if (
    bOptimal)
        {
            
    iBestYield 0;

            for (
    iI 0iI GC.getNumRouteInfos(); ++iI)
            {
                
    iBestYield std::max(iBestYieldGC.getImprovementInfo(eImprovement).getRouteYieldChanges(iIeYield));
            }

            
    iYield += iBestYield;
        }
        else
        {
            
    RouteTypes eRoute getRouteType();

            if( 
    bBestRoute && ePlayer != NO_PLAYER )
            {
                
    eRoute GET_PLAYER(ePlayer).getBestRoute(GC.getMapINLINE().plotSorenINLINE(getX_INLINE(), getY_INLINE()));
            }

            if (
    eRoute != NO_ROUTE)
            {
                
    iYield += GC.getImprovementInfo(eImprovement).getRouteYieldChanges(eRouteeYield);
            }
        }

        
    // Building Improvement Yield Change - Planetfall Maniac
        
    CvCitypCity getWorkingCity();
        if (
    bOptimal || NULL == pCity)
        {
            for (
    iI 0iI GC.getNumBuildingInfos(); ++iI)
            {
                
    iYield += GC.getImprovementInfo(eImprovement).getBuildingYieldChange((BuildingTypes)iIeYield);
            }
        }
        else
        {
            if (!
    bDisplay || pCity->isRevealed(GC.getGameINLINE().getActiveTeam(), false))
            {
                
    iYield += pCity->getImprovementYieldChange(eImprovementeYield);
            }
        }
        
    //Orbital Cities
        
    if (pCity->isOrbital())
        {
            if (!
    GC.getImprovementInfo(eImprovement).isOrbital())
            {
                return 
    0;
            }
        }
        else
        {
            if (
    GC.getImprovementInfo(eImprovement).isOrbital())
            {
                return 
    0;
            }
        }
        
    // End Planetfall Maniac

        
    if (bOptimal || ePlayer == NO_PLAYER)
        {
            for (
    iI 0iI GC.getNumTechInfos(); ++iI)
            {
                
    iYield += GC.getImprovementInfo(eImprovement).getTechYieldChanges(iIeYield);
            }

            for (
    iI 0iI GC.getNumCivicInfos(); ++iI)
            {
                
    iYield += GC.getCivicInfo((CivicTypesiI).getImprovementYieldChanges(eImprovementeYield);
            }
        }
        else
        {
            
    iYield += GET_PLAYER(ePlayer).getImprovementYieldChange(eImprovementeYield);
            
    iYield += GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getImprovementYieldChange(eImprovementeYield);
        }

        if (
    ePlayer != NO_PLAYER)
        {
            
    eBonus getBonusType(GET_PLAYER(ePlayer).getTeam());

            if (
    eBonus != NO_BONUS)
            {
                
    iYield += GC.getImprovementInfo(eImprovement).getImprovementBonusYield(eBonuseYield);
            }
        }

    /*************************************************************************************************/
    /* UNOFFICIAL_PATCH                       06/02/10                     Afforess & jdog5000       */
    /*                                                                                               */
    /* Bugfix                                                                                        */
    /*************************************************************************************************/
    /* original bts code
        return iYield;
    */
        // Improvement cannot actually produce negative yield
        
    int iCurrYield calculateNatureYield(eYield, (ePlayer == NO_PLAYER) ? NO_TEAM GET_PLAYER(ePlayer).getTeam(), bOptimal);

        return 
    std::max( -iCurrYieldiYield );
    /*************************************************************************************************/
    /* UNOFFICIAL_PATCH                         END                                                  */
    /*************************************************************************************************/
    }
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                       END                                                  */
    /************************************************************************************************/ 
    Doch kein vorher auf null gesetzter Zeiger, puh. Aber korrupt kann er ja eigentlich auch nicht sein, weil er ja vorher noch funktioniert.
    Edit: Es gibt noch eine Besonderheit, die CvCity Klasse ist jetzt abstrakt, aber das dürfte ja eigentlich kein Problem sein, weil die Klassen ja kompatibel sind. (oder nicht?) Die entsprechende erbende Klasse ist die CityAI-Klasse. Die Orbitalfunktion ist auch im Public-Bereich und liefert nur eine Variable zurück.
    Geändert von deepwater (22. August 2011 um 23:48 Uhr)

    ...too old...

  13. #73
    Registrierter Benutzer
    Registriert seit
    04.03.07
    Beiträge
    4.694
    Doch, der kann durchaus NULL sein. Das if-else davor, was funktioniert, prüft extra, ob's NULL ist (und benutzt den Zeiger nicht, wenn dem so ist), danach läuft das Programm aber in jedem Fall weiter und benutzt den Zeiger, der halt NULL sein kann (nämlich immer dann, wenn das Feld von keiner Stadt belegt ist). Mach aus

    Code:
        if (pCity->isOrbital())
    das hier:

    Code:
        if (NULL != pCity && pCity->isOrbital())

  14. #74
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Zitat Zitat von deepwater Beitrag anzeigen
    Edit: Es gibt noch eine Besonderheit, die CvCity Klasse ist jetzt abstrakt,[...]
    Das war sie vorher doch auch schon.

  15. #75
    verschollen Avatar von deepwater
    Registriert seit
    23.04.11
    Beiträge
    1.580
    huuuuuiiiii, peinlich, Sorry, war ne blöde Frage.
    Echt, ist mir nie aufgefallen, dass die Abstrakt war, aber was hat das für einen Sinn, wahrscheinlich zur Moddingfreundlichkeit.

    ...too old...

Seite 5 von 180 ErsteErste 1234567891555105 ... LetzteLetzte

Berechtigungen

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