Seite 104 von 180 ErsteErste ... 45494100101102103104105106107108114154 ... LetzteLetzte
Ergebnis 1.546 bis 1.560 von 2699

Thema: Der SDK-Fragen-Thread

  1. #1546
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Ich habe mal eine ganz generelle Frage:
    Wie springt man aus einer if-Anweisung heraus?

    Beispiel:
    Code:
    void CvUnit::findFood()
    {   
        int iFoodAvailable = 0;
        int iCityId = -1;
        CvCity* pBestCity = NULL;
    
        CvPlayer& kUnitPlayer = GET_PLAYER(getOwnerINLINE());
    
        if (!kUnitPlayer.isNative() || !kUnitPlayer.isEurope() || !GC.getGameINLINE().isBarbarianPlayer(getOwnerINLINE()))
            // CBM this should exclude all players without own cities, no?
        {
            iCityId = kUnitPlayer.getHighestStoredYieldCityId(YIELD_FOOD);
            FAssertMsg(iCityId != -1, "Couldn't get city for food");
            pBestCity = kUnitPlayer.getCity(iCityId);
            FAssertMsg(pBestCity != NULL, "No BestCity found");
            if (pBestCity == NULL)
            {
                return;
            }
    ...
    ...
    Zu Beginn des Spiels kann es vorkommen, dass noch keine Stadt gegründet worden ist. Die beiden Asserts schlagen auch korrekt an. Ich habe mich nun damit beholfen, für diesen Fall ein "return" zu setzen, was in diesem Fall auch logisch richtig ist.
    Allerdings verlasse ich damit die Funktion void CvUnit::findFood(), was theoretisch nicht in jedem Fall wünschenswert ist. Es soll nur die hier aufgezeigte if-Anweisung abgebrochen, und dann innerhalb von void CvUnit::findFood() nach dem if weitergemacht werden.
    Wie müsste der dafür notwendige Befehl lauten?


  2. #1547
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Dafür gibt es keinen Befehl. Wozu auch? Wenn du den folgenden Code nur ausführst, wenn pBestCity != NULL ist, kommst du doch auf das selbe, wie du es möchtest.

  3. #1548
    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 rucivfan Beitrag anzeigen
    Dafür gibt es keinen Befehl.
    Das war's, was ich wissen wollte. Danke schön!


  4. #1549
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Deine Frage macht schon keinen Sinn, weil dann die Abfrage:

    Code:
     if (pBestCity == NULL)
            {
                return;
            }
    abgebrochen werden würde und nicht die obere if-Abfrage.

    Würde sowas gehen, hätte man die if-Abfrage pBestCity == NULL sich gleich sparen können.

  5. #1550
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Da ist was dran...

    Dann lass' mich meine Frage umformulieren: "Wie kann ich innerhalb einer if-Anweisung aus der darüber liegenden if-Anweisung herausspringen?"
    (Das war ein Witz... )


  6. #1551
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Zitat Zitat von rucivfan Beitrag anzeigen
    [CODE]boost:ython::list CyUnit::getAvailableUpgrades(int /*UnitTypes*/ iUnit, int iCount)
    {
    if(m_pUnit)
    {
    std::vector<UnitTypes> vctiUnitUpgrades;

    if(m_pUnit->getAvailableUpgrades(vctiUnitUpgrades, (UnitTypes) iUnit, iCount))
    {
    //boost:ython::list l;
    boost:ython::object get_iter = boost:ython::iterator<std::vector<UnitTypes> >();
    boost:ython::object iter = get_iter(vctiUnitUpgrades);
    boost:ython::list l(iter);
    Ich weis jetzt wo der Fehler liegt: get_iter(vctiUnitUpgrades);
    std::vector hat keinen Python-Wrapper, also geht es nicht. Lösung: Für std::vector einen Wrapper mit boost:ython schreiben. Das kann ich für dich machen, wenn du willst.

  7. #1552
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Ich wäre dir dankbar, wenn du das machen könntest. Ich nehme an, das geht schneller wie ich es mir vorstelle .

  8. #1553
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Du kannst vorallem den Container direkt in Python verwenden. Nachteil: für jeden Typ braucht es einen eigen Container.

  9. #1554
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Ist doch einfacher als gedacht:

    Code:
    template<typename T>
    void createPyVector(const char* name)
    {
    	class_<std::vector<T>>(name)
    		.def(init<size_t>())
    		.def(vector_indexing_suite<std::vector<T>>())
    		;
    		
    }
    Das liefert dir __len__, __getitem__, __setitem__, __delitem__, __iter__ und __contains__. Auch append und extend ist dabei.

    Was sonst kannst du noch so für Methoden gebrauchen?

  10. #1555
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017


    Kann ich den Container so wie in c++ nutzen? Geht der [] Operator?

    Macht die Hauptarbeit vector_indexing_suite?

    edit: OK, die wichtigste Frage ist, wo platziere ich das am besten? Mir scheint eine neue Interfacedatei am logischsten. (Bekomme ich selbst hin.)
    Geändert von rucivfan (21. Mai 2014 um 20:28 Uhr)

  11. #1556
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Wo du es hin machst bleibt dir überlassen. Hauptsache, die Funktion wird innerhalb von DLLPublishToPython aufgerufen.

    Das ist kein neuer C++ -Container. Sondern es wird nur ein Python-Wrapper auf C -Ebene erstellt, den man in Python verwenden kann. Der Übergang von Python und C++ (und umgekehrt) ergolgt nahtlos.

    Zum Beispiel: Du verwendest da oben ja die Methode getAvailableUpgrades, die u.a. vector<UnitTypes> als ersten Argumenttyp hat. Wenn diese Methode Python zugänglich ist, dann kannst du von Python aus direkt ein vector<UnitTypes> entsprechendes Objekt dieser Methode übergeben, und auf C++ Ebene hast du dann ein Objekt vom Typ vectory<UnitTypes>.

    Die Hauptarbeit macht vector_indexing_suite. Dadurch werden die oben genannten Methoden erstellt. Das verhält sich dadurch wie ein Python-Container.
    Man kann das noch erweitern, z.b. indem man einen Konstruktor hinzufügt, der ein iterierbares Objekt entgegennimmt, oder man übergibt zusätzlich zur Anzahl der Elemente noch eine Funktion, mit der man die Elemente bestimmen kann (ähnlich wie bei einer List Comprehension).

  12. #1557
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Entweder ich kann es nicht kompilieren oder es wird nicht gefunden. Ich habe das wohl noch ein Problem, was du unter Aufruf unter DLLPublishToPython meinst.

    Wie die anderen Pythonwrapperklassen geht es nicht. Bekannt machen ist einfach void createPyVector(const char* name); unter DLLPublishToPython, oder?

  13. #1558
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    In CvDLLPython.cpp gibt es ja die Funktion DLLPublishToPython. Innerhalb davon muss createPyVector<T> aufgerufen werden, wobei T der entsprechende Elementtyp ist. Für jeden Typ braucht man einen anderen vector-Wrapper. name ist dabei der Name der Python-Klasse.

  14. #1559
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Die Funktion kenne ich schon gut. Dort habe ich wegen weiteren Interface-Klassen einiges erweitert. Das Problem ist, was bedeutet Pythonklasse auf den c++ Code heraus? Damit kann ich nichts anfange, was gemeint sei. In Python heißt UnitTypes auch so. Wenn ich es für T einsetze, kommt ein kompilierfehler.

    Code:
    1>CvDLLPython.cpp(102): warning C4551: function call missing argument list
    1>CvDLLPython.cpp(102): error C2568: 'identifier' : unable to resolve function overload
    1>NMAKE : fatal error U1077: ""C:\Compiler\Microsoft Visual C++ Toolkit 2003\bin\cl.exe"": R³ckgabe-Code "0x2"
    edit. im Klartext: createPyVector<UnitTypes>( ); -> Was muss zwischen den Klammern? Ohne geht es nicht zu kompilieren. Habe schon alles mögliche Namen ausprobiert und es geht einfach nicht.
    Geändert von rucivfan (21. Mai 2014 um 22:23 Uhr)

  15. #1560
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Da muss der Name der resultierenden Pythonklasse übergeben werden.
    Z.B. createPyVector<UnitTypes>("UnitTypesVector");
    oder so ähnlich.

Seite 104 von 180 ErsteErste ... 45494100101102103104105106107108114154 ... LetzteLetzte

Berechtigungen

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