Verkehrssimulation



  • Halloo an alle,

    neues Semester, neue Praktikumsaufgabe und schon hängt's mal wieder.

    Da die Aufgabenstellung ziemlich lang ist, füge ich am besten die Links zu den PDFs hier ein:

    https://www.fbi.h-da.de/fileadmin/personal/r.nitsch/Download/WS11/PAD2_P/11WS_PG2-ProjFC-Einfuehrung.pdf

    https://www.fbi.h-da.de/fileadmin/personal/r.nitsch/Download/WS11/PAD2_P/PAD2-WS11-ProjFC-Teil-1.pdf

    Die 1. Datei ist eine kleine Einführung und beschreibt kurz das Projekt, an dem wir im Laufe des Semesters arbeiten.
    Die 2. Datei ist die momentane Aufgabestellung.

    Und zwar hänge ich gerade an dieser Funktion:

    void World::create(const std::string& fcWorld)
    

    Wir sollen ja laut Aufgabenstellung erst die Zeichenketten "FC-City" und "ScanerTestArea" überprüfen und je nach Eingabe soll dann quasi ein Stadtplan (der unter der Datei Einführung und der unter Teilaufgabe 1.2) generiert werden.
    Wie soll das aber Funktionieren? Es ist ja äußerst unpraktisch jede einzelene Parzelle manuell einzutragen.

    Ansonsten hier nochmal etwas an Quelltext, damit ihr so einen groben überblick davon habt, was bisher bei mir rauskam:

    //World.h
    
    #pragma once
    #include <vector>
    #include <string>
    #include <utility>
    #include "ID.h"
    
    typedef std::vector<std::vector<ID>> Container;
    typedef std::pair <int,int> Location;
    
    class World
    {
    private:
        Container parcels;
    	std::string name;
    	int height;
    	int width;
    public:
    	World();
    	World(const std::string& fcWorldName);
    	~World(void);
    
    	void create(const std::string& fcWorld);
    	int getHeight();
    	int getWidth();
    	Location getID(const Location& loc);
    	void setID(const Location& loc, const ID& id);
    
    };
    
    std::ostream& operator<<(std::ostream& os, const World& w);
    
    //World.cpp
    
    #include "World.h"
    #include "ExceptionUnexpectedState.h"
    
    World::World()
    {
    }
    
    World::World(const std::string& fcWorldName)
    {
    	World::create(fcWorldName);
    }
    
    World::~World(void)
    {
    }
    
    void World::create(const std::string& fcWorld)
    {
    	std::string str = "FC-City11";
    	std::string str2 = "ScannerTestArea";
    
    	if(fcWorld==str || fcWorld==str2)
    	{
    
    	}
    	else
    	{
    		throw ExceptionUnexpectedState("Fehler! Programm wird beendet");
    	}
    }
    
    std::ostream& operator<<(std::ostream& os, const World& w)
    {
    	std::string str = "TEST";
    	return(os << str.c_str());
    }
    
    //ID.h
    
    #pragma once
    class ID
    {
    private:
    	char Ikon;
    public:
    	ID(char Ikon);
    	~ID(void);
    };
    
    //----- ID.cpp ------
    
    #include "ID.h"
    
    ID::ID(char Ikon)
    {
    	this->Ikon = Ikon;
    }
    

    Vielen Dank schonmal im voraus 🙂

    MfG

    Sorex

    PS.: Bis Mittwoch muss die Aufgabe fertig sein 😃



  • > Wie soll das aber Funktionieren?

    Hast Du eine konkrete C++ Frage? Eine, die man beantworten kann, ohne lange Texte oder gar verlinkte PDFs lesen zu müssen?

    Ein paar Kommentage zum C++ Quellcode:
    - "#pragma once" ist nicht Teil des C++ Standards
    - Wenn Du das Programm auch mit einem C++03 Compiler kompilieren können möchtest, ersetze ">>" (Shift-Operator) durch "> >" (zwei schließende spitze Klammern)
    - Überlege, ob es nicht sinnvoll wäre, aus dem einen oder anderen Konstrutor einen expliziten Konstruktor zu machen
    - Überlege, ob all Deine Defklarationen von Destruktoren sinnvoll sind



  • krümelkacker schrieb:

    > Wie soll das aber Funktionieren?

    Hast Du eine konkrete C++ Frage? Eine, die man beantworten kann, ohne lange Texte oder gar verlinkte PDFs lesen zu müssen?

    Da die Aufgabenstellung nunmal ziemlich lang ist geht es leider nicht anders als PDFs zu verlinken. Ich könnte ja auch ein ellenlang Text niederschreiben und den Stadplan rauszeichnen, aber dann wär ich wohl morgen noch nicht fertig 😉

    Die konkrete C++ Frage würde etwa lauten: Wie bekomme ich einen "Stadtplan" bestehend aus den Zeichen '#', ' ' und diversen Buchstaben in einen zweidimensionalen Vektor vom Typ ID gespeichert. Die Klasse ID beherbergt bei mir momentan nur eine Membervariable vom Typ char + Konstruktor (siehe 1. Beitrag).

    krümelkacker schrieb:

    Ein paar Kommentage zum C++ Quellcode:
    - "#pragma once" ist nicht Teil des C++ Standards
    - Wenn Du das Programm auch mit einem C++03 Compiler kompilieren können möchtest, ersetze ">>" (Shift-Operator) durch "> >" (zwei schließende spitze Klammern)
    - Überlege, ob es nicht sinnvoll wäre, aus dem einen oder anderen Konstrutor einen expliziten Konstruktor zu machen
    - Überlege, ob all Deine Defklarationen von Destruktoren sinnvoll sind

    - Das ist mir neu, habe im 1. Semester gelernt, dass dies notwendig sei
    - An der FH benutzen wir Visual Basic C++ 2010, das reicht mir vorerst ;-D
    - Was ist ein expliziter Konstruktor? Haben wir in den Vorlesungen noch nicht behandelt denke ich, daher verboten


  • Mod

    Sorex schrieb:

    Die konkrete C++ Frage würde etwa lauten: Wie bekomme ich einen "Stadtplan" bestehend aus den Zeichen '#', ' ' und diversen Buchstaben in einen zweidimensionalen Vektor vom Typ ID gespeichert. Die Klasse ID beherbergt bei mir momentan nur eine Membervariable vom Typ char + Konstruktor (siehe 1. Beitrag).

    Das ist nicht wirklich eine konkrete Frage, zumindest wenn du dir eine andere Antwort als "Reintun!" wünscht.

    - Das ist mir neu, habe im 1. Semester gelernt, dass dies notwendig sei

    Dann ist das halbfalsch gelernt. Google mal "Include Guards"

    - An der FH benutzen wir Visual Basic C++ 2010, das reicht mir vorerst ;-D

    Wow! Visual Basic C++! So viele schlechte Witze, ich reiß mich besser zusammen...

    - Was ist ein expliziter Konstruktor? Haben wir in den Vorlesungen noch nicht behandelt denke ich, daher verboten

    Und wenn man etwas nicht weiß, aber ein konkretes Stichwort vorgegeben hat, dann tut man was? Man fährt in die Stadtbücherei und sucht die passende Karteikarte!



  • SeppJ schrieb:

    Sorex schrieb:

    Die konkrete C++ Frage würde etwa lauten: Wie bekomme ich einen "Stadtplan" bestehend aus den Zeichen '#', ' ' und diversen Buchstaben in einen zweidimensionalen Vektor vom Typ ID gespeichert. Die Klasse ID beherbergt bei mir momentan nur eine Membervariable vom Typ char + Konstruktor (siehe 1. Beitrag).

    Das ist nicht wirklich eine konkrete Frage, zumindest wenn du dir eine andere Antwort als "Reintun!" wünscht.

    - Das ist mir neu, habe im 1. Semester gelernt, dass dies notwendig sei

    Dann ist das halbfalsch gelernt. Google mal "Include Guards"

    - An der FH benutzen wir Visual Basic C++ 2010, das reicht mir vorerst ;-D

    Wow! Visual Basic C++! So viele schlechte Witze, ich reiß mich besser zusammen...

    - Was ist ein expliziter Konstruktor? Haben wir in den Vorlesungen noch nicht behandelt denke ich, daher verboten

    Und wenn man etwas nicht weiß, aber ein konkretes Stichwort vorgegeben hat, dann tut man was? Man fährt in die Stadtbücherei und sucht die passende Karteikarte!

    - In meinen Augen ist es eine konkrete Frage.. aber mir kommt es gerade so vor, als wären manche Leute zu "faul" eine Aufgabenstellung zu lesen, die heute nunmal leider etwas abstrakter und länger ist. Daher kommt mir die Frage auf, warum Antwortet ihr auf ein Thema, wenn ihr doch anscheinend keine Lust darauf habt zu helfen?

    - Dann halt Visual C++, meine Güte.. man kann auch aus jeder Mücke einen Elefanten machen.

    - Oder man fragt in einem Forum, welches ja dafür gedacht ist Fragen zu beantworten. Sonst könntet ihr hier ganz schnell dicht machen 😉

    Ich will jetzt nicht unhöflich werden, aber ich hätte gerne Antworten die mir bei meinem Problem helfen. Wenn jmd keine Lust dazu hat, etwas mehr zu lesen, dann ist das okay, ich zwinge niemanden dazu. Dann bitte ich denjenigen aber sich von diesem Thema fernzuhalten.


  • Mod

    Wir wollen dich bloß da drauf aufmerksam machen, dass du so keine Antworten bekommen wirst und dir helfen, wie du zu deiner Antwort kommst. Wenn du das als unhöflich abtust, dann kann man dir eben nicht helfen...



  • Das sind nicht unsere Hausaufgaben sondern Deine. Ich sage nur, wenn Du Dir etwas mehr Mühe geben würdest, Dein aktuelles Problem auf den Punkt zu bringen, hast Du höhere Chancen auf hilfreiche Antworten.



  • Die konkrete C++ Frage würde etwa lauten: Wie bekomme ich einen "Stadtplan" bestehend aus den Zeichen '#', ' ' und diversen Buchstaben in einen zweidimensionalen Vektor vom Typ ID gespeichert. Die Klasse ID beherbergt bei mir momentan nur eine Membervariable vom Typ char + Konstruktor (siehe 1. Beitrag).

    Stadtplan in Datei speichern und irgendwo ablegen, wo du es wiederfindest.
    Praktischerweise würde ich Zeilen des Stadtplans einfach mit '\n' beenden.

    Im Programm: Datei öffnen und Zeichen für Zeichen (oder auch Zeile für Zeile) einlesen und in deinen vector stopfen.

    Zum Einlesen haben sich iostreams bewert. Das englische Wort für stopfen ist push_back.

    Wenn du das jetzt noch einem Semester programmieren nicht hinkriegst, solltest
    du auf jeden Fall ein Anfängerbuch besoren und durch_arbeiten_. Sonst wirst
    du nicht glücklich.



  • Wow! Visual Basic C++! So viele schlechte Witze, ich reiß mich besser zusammen...

    Sich darüber lustig zu machen, dass sich jemand verschrieben bzw sich geirrt hat ist für dich also eine Hilfe? Na dann!
    Mir hätte ein "Die Frage ist immernoch nicht konkret genug" gereicht, dann hätte ich es halt wie jetzt nocheinmal probiert.

    So und jetzt wieder zu meinem Problem und diesmal hoffentlich konkret genug:

    Wir sollen eine Verkehrssimulation programmieren, bestehend aus der Klasse World und diversen anderen Klassen, die momentan aber nicht relevant sind.

    Im Moment geht es nur um erstere, die bei mir momentan wie folgt aussieht:

    #pragma once
    #include <vector>
    #include <string>
    #include <utility>
    #include "ID.h"
    
    typedef std::vector<std::vector<ID>> Container;
    typedef std::pair <int,int> Location;
    
    class World
    {
    private:
            Container parcels;
    	std::string name;   //name der "stadt"
    	int height;         //anzahl zeilen  
    	int width;          //anzahl spalten
    public:
    	World();
    	World(const std::string& fcWorldName);   //ruft funktion create auf
    	~World(void);
    
    	void create(const std::string& fcWorld);
    	int getHeight();                         
    	int getWidth();
    	Location getID(const Location& loc);
    	void setID(const Location& loc, const ID& id);
    
    };
    
    std::ostream& operator<<(std::ostream& os, const World& w);
    
    typedef std::vector<std::vector<ID>> Container;
    

    In diesem 2 Dimensionalen Vektor soll der Stadtplan eingefügt werden.

    typedef std::pair <int,int> Location;
    

    Location verwaltet die Koordinaten des Stadtplans. x=y=0 ist die Linke obere Ecke.

    void create(const std::string& fcWorld);
    

    Diese Funktion soll als erstes den Namen der Stadt überpürfen (fcWorld). Ist dieser = "FC-City", so soll dieser Stadtplan erzeugt werden (rechts):

    https://www.fbi.h-da.de/fileadmin/personal/r.nitsch/Download/WS11/PAD2_P/11WS_PG2-ProjFC-Einfuehrung.pdf

    Ist fcWorld = "ScannerTestArea", soll der Stadtplan unter Aufgabenteil 1.2 erstellt werden:

    https://www.fbi.h-da.de/fileadmin/personal/r.nitsch/Download/WS11/PAD2_P/PAD2-WS11-ProjFC-Teil-1.pdf

    Andernfalls wird eine Fehlermeldung ausgegeben.
    Sind diese Vorbedingunggen erfüllt, wird der für die Ablage der Parzellen-IDs vorgesehenen Container geleert und danach die IDs des vorgegebenen
    Stadtplans im Container gespeichert. Der Container ist mein zweidimensionaler Vektor.

    Location getID(const Location& loc);
    void setID(const Location& loc, const ID& id);
    

    Diese beiden Funktionen sollten selbsterklärend sein.

    Momentan geht es nur um die Funktion create und das Auffüllen des Containers mit dem Stadtplan. Meine Idee war bisher diese:

    void World::create(const std::string& fcWorld)
    {
    	std::string str = "FC-City11";
    	std::string str2 = "ScannerTestArea";
    
    	if(fcWorld==str)
    	{
    		setID(Location(0,0),ID('#')); 
    	}
    	else
    	{
    		throw ExceptionUnexpectedState("Fehler! Programm wird beendet");
    	}
    }
    

    In der Funktion setID würde ich dann den Container mit den entsprechenden Eingaben füllen (x=0 y=0, parzelle=#). Leider bringt es mir hier schon diese Fehlermeldung:

    World.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall World::setID(struct std::pair<int,int> const &,class ID const &)" (?setID@World@@QAEXABU?$pair@HH@std@@ABVID@@@Z)" in Funktion ""public: void __thiscall World::create(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?create@World@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)".
    

    Hier noch die main, falls relevant:

    #include <iostream>
    #include "World.h"
    #include "ExceptionUnexpectedState.h"
    
    int main()
    {
       try
       {
    	World test("FC-City11");
    
    	std::cout << test;
       }
       catch(ExceptionUnexpectedState error)
       {
    	   std::cout << error.what() << std::endl;
       }
    }
    

    Danke im voraus 🙂



  • AufSandGebaut schrieb:

    Die konkrete C++ Frage würde etwa lauten: Wie bekomme ich einen "Stadtplan" bestehend aus den Zeichen '#', ' ' und diversen Buchstaben in einen zweidimensionalen Vektor vom Typ ID gespeichert. Die Klasse ID beherbergt bei mir momentan nur eine Membervariable vom Typ char + Konstruktor (siehe 1. Beitrag).

    Stadtplan in Datei speichern und irgendwo ablegen, wo du es wiederfindest.
    Praktischerweise würde ich Zeilen des Stadtplans einfach mit '\n' beenden.

    Im Programm: Datei öffnen und Zeichen für Zeichen (oder auch Zeile für Zeile) einlesen und in deinen vector stopfen.

    Zum Einlesen haben sich iostreams bewert. Das englische Wort für stopfen ist push_back.

    Wenn du das jetzt noch einem Semester programmieren nicht hinkriegst, solltest
    du auf jeden Fall ein Anfängerbuch besoren und durch_arbeiten_. Sonst wirst
    du nicht glücklich.

    Danke schonmal, aber das ist wieder so ein Problem. Wir dürfen in unseren Praktikumsaufgaben nur das benutzen, was in den Vorlesungen bisher behandelt wurde. Dateien öffnen gehört da leider noch nicht dazu.

    Und apropo: Meine Klausur im 1. Semester habe ich mit 1,3 bestanden,
    Nur nach 2 1/2 Monaten Semesterferien geriet so einiges in Vergessenheit 😃



  • krümelkacker schrieb:

    Das sind nicht unsere Hausaufgaben sondern Deine. Ich sage nur, wenn Du Dir etwas mehr Mühe geben würdest, Dein aktuelles Problem auf den Punkt zu bringen, hast Du höhere Chancen auf hilfreiche Antworten.

    Das ist mir bewusst und ich erwarte ja auch keine vollständige Lösung.. nur einen kleinen Schubser in die richtige Richtung. Hatte bisher noch nichts mit solchen zweidimensionalen Vektoren am Hut, daher fällt mir das momentan noch etwas schwer.



  • Du hast Probleme mit zweidimensionalen Vektoren, zeigst aber nirgends Code, in dem du versuchst, etwas mit zweidimensionalen Vektoren zu machen. Der Code, den du zeigst, sieht aus wie vorgegeben. Deswegen triggerst du bei den meisten den Hausaufgabenschalter und keiner hilft dir.

    Fang mal langsam an und füll einen Vektor mit der ersten Zeile der Straßenkarte.
    Diesen Vektor packst du dann in einen zweiten Vektor.

    Wenn Du keine Dateien öffnen darfst, musst du halt die Straßenkarte als
    Zeichenkettenliteral mit in den Code packen. Für den ersten Schritt, reicht ja eine Zeile.



  • Also so z.B.:

    std::vector<ID> id;
    id.push_back('#');
    
    parcels.push_back(id)
    

    Ist nur ein Beispiel, aber wenn ich das so richtig verstanden haben sollte werd ich dem später noch nachgehen.

    Habe aber jetzt halt noch das Problem mit dem Linker Error aus meinem 3.-letzen Beitrag. Der Fehler liegt definitv am Aufruf der Funktion

    setID(Location(0,0),ID('#'));
    

    . Wenn ich diesen Teil nämlich auskommentiere lässt sich alles kompilieren.

    typedef std::vector<std::vector<ID>> Container;
    typedef std::pair <int,int> Location;
    
    void setID(const Location& loc, const ID& id)
    {
        // hier würde dann der teil mit dem auffüllen des vektors reinkommen
    }
    


  • Sorex schrieb:

    Also so z.B.:

    std::vector<ID> id;
    id.push_back('#');
    
    parcels.push_back(id)
    

    Ist nur ein Beispiel, aber wenn ich das so richtig verstanden haben sollte werd ich dem später noch nachgehen.

    Habe aber jetzt halt noch das Problem mit dem Linker Error aus meinem 3.-letzen Beitrag. Der Fehler liegt definitv am Aufruf der Funktion

    setID(Location(0,0),ID('#'));
    

    . Wenn ich diesen Teil nämlich auskommentiere lässt sich alles kompilieren.

    typedef std::vector<std::vector<ID>> Container;
    typedef std::pair <int,int> Location;
    
    void setID(const Location& loc, const ID& id)
    {
        // hier würde dann der teil mit dem auffüllen des vektors reinkommen
    }
    

    --edit---

    Hat sich erledigt.. World:: vor der Funktion vergessen, aaahrg.. 2 Stunden meines Lebens verschwendet 😃

    sry wegen doppelpost, verklickt



  • stop mal, auf dem einen aufgabenblatt steht unter den zielen, dass ihr den umgang mit dateien lernen sollt... Oo

    und dann dürft ihr diese nicht benutzen?

    genau wie die STL...



  • Das eine ist die Einführung in das gesamte Projekt, sprich das, was wir über das Semester machen werden. Der Umgang mit den Dateien wird dann wohl in einem darauffolgenden Praktikum benutzt.

    Jedenfalls habe ich es gestern schonmal hinbekommen, dass einer der Stadtpläne auf dem Bildschirm erscheint, wenn auch mehr schlecht als recht.
    Habe den Vektor durch ein statisches C-Array eingetauscht und die ganzen Felder manuell eingefügt. Quellcode sieht demnach auch sehr unschön aus, aber etwas anderes ist mir dann nicht mehr eingefallen.

    void World::create(const std::string& fcWorld)
    {
    	std::string str = "FC-City11";
    	std::string str2 = "ScannerTestArea";
    
    	if(fcWorld==str)
    	{
    
    		for (int i=0; i<=y-1; i++)
    		{
    			for (int j=0;j<=x-1;j++)
    			{
    		        setID(Location(i,j),ID('#'));
    			}
    		}
    
    		for(int i=1;i<=x-2;i++)
    		{
    			setID(Location(1,i),ID(' '));
    			setID(Location(2,i),ID(' '));
    			setID(Location(y-2,i),ID(' '));
    			setID(Location(y-3,i),ID(' '));
    
    			setID(Location(7,i),ID(' '));
    			setID(Location(8,i),ID(' '));
    
    			setID(Location(13,i),ID(' '));
    			setID(Location(14,i),ID(' '));
    
    			setID(Location(19,i),ID(' '));
    			setID(Location(20,i),ID(' '));
    
    			setID(Location(25,i),ID(' '));
    			setID(Location(26,i),ID(' '));
    		}
    
    		for(int i=1;i<=y-2;i++)
    		{
    			setID(Location(i,1),ID(' '));
    			setID(Location(i,2),ID(' '));
    			setID(Location(i,x-2),ID(' '));
    			setID(Location(i,x-3),ID(' '));
    		}
    
    		for(int i=3;i<=11;i++)
    		{
    		   setID(Location(i,10),ID(' '));
    		   setID(Location(i,11),ID(' '));
    		}
    
    		for(int i=3;i<=8;i++)
    		{
    		   setID(Location(i,14),ID(' '));
    		   setID(Location(i,15),ID(' '));
    		}
    
    		for(int i=3;i<=5;i++)
    		{
    		   setID(Location(i,20),ID(' '));
    		   setID(Location(i,21),ID(' '));
    		}
    
    		for(int i=1;i<=y-3;i++)
    		{
    		   setID(Location(i,29),ID(' '));
    		   setID(Location(i,30),ID(' '));
    		}
    
    		for(int i=12;i<=18;i++)
    		{
    		   setID(Location(10,i),ID(' '));
    		   setID(Location(11,i),ID(' '));
    		}
    
    		for(int i=9;i<=12;i++)
    		{
    			setID(Location(i,20),ID(' '));
    			setID(Location(i,21),ID(' '));
    		}
    
    		for(int i=15;i<=y-4;i++)
    		{
    			setID(Location(i,10),ID(' '));
    			setID(Location(i,11),ID(' '));
    
    		    setID(Location(i+1,20),ID(' '));
    			setID(Location(i+1,21),ID(' '));
    		}
    
    		for (int i=7;i<=8;i++)
    		{
    		    setID(Location(i,12),ID('#'));
    		    setID(Location(i,13),ID('#'));
    		    setID(Location(i,22),ID('#'));
    		    setID(Location(i,23),ID('#'));
    		}
    
    		for (int i=13;i<=14;i++)
    		{
    		    setID(Location(i,8),ID('#'));
    		    setID(Location(i,9),ID('#'));
    		    setID(Location(i,22),ID('#'));
    		}
    
    		for (int i=19;i<=20;i++)
    		{
    		    setID(Location(i,9),ID('#'));
    		    setID(Location(i,22),ID('#'));
    		    setID(Location(i,23),ID('#'));
    		}
    
    		for (int i=25;i<=26;i++)
    		{
    		    setID(Location(i,9),ID('#'));
    		    setID(Location(i,22),ID('#'));
    		}
    
    		setID(Location(21,10),ID('#'));
    		setID(Location(21,11),ID('#'));
    		setID(Location(27,20),ID('#'));
    		setID(Location(27,21),ID('#'));
    	}
    	else if(fcWorld==str2)
    	{
        }
    	else
    	{
    		throw ExceptionUnexpectedState("Fehler! Programm wird beendet");
    	}
    }
    
    void World::setID(const Location& loc, const ID& id)
    {
    	int y1 = loc.first;
    	int x1 = loc.second;
    
    	if(y1>y||x1>x)
    		throw std::out_of_range("Out of Range");
    
    	parcels[y1][x1] = id;
    }
    
    #pragma once
    #include <vector>
    #include <string>
    #include <utility>
    #include "ID.h"
    
    #define x 40
    #define y 33
    
    typedef ID Container[y][x];
    typedef std::pair <int,int> Location;
    
    class World
    {
    private:
        Container parcels;
    	std::string name;
    	int height;
    	int width;
    public:
    	World();
    	World(const std::string& fcWorldName);
    	~World(void);
    
    	void create(const std::string& fcWorld);
    	int getHeight();
    	int getWidth();
    	ID getID(const Location& loc);
    	void setID(const Location& loc, const ID& id);
    
        friend std::ostream& operator<<(std::ostream& os, const World& w);
    };
    

    Eine Sache verwirrt mich jedoch noch etwas. Hat jemand eine Idee wofür man die vorgegeben Membervariablen height und width sinnvoll benutzen könnte? Da mein Stadtplan ja immer von der Größe her konstant bleibt habe ich halt die Variablen x und y eingeführt.



  • egal was und wie du x und y verwendest:

    schiess das define ab, nimm const int. das hat den gleichen effekt, aber ist nicht C sodnern C++ und damit typsicher, intuitiver und weniger fehleranfällig



  • Alles klar, danke.. wurde korrigiert.

    Bin jetzt am Aufgabenteil 1.2 und hab ein weiteres Problem.
    Momentan geht es darum, dass das Fahrzeug seine Umgebung abscannt, dazu ist diese Funktion gegeben:

    const ID& scanForID( int fieldOfViewNo,Direction dir,const Location& loc )
    

    fieldOfViewNo: Adresse der zu scannenden Parzelle
    dir: Aktuelle Fahrtrichtung des FC
    loc: Aktuelle Position des FC
    Zurückgegeben wird die im globalen world-Objekt
    unter der durch fieldOfViewNo und dir bezeichneten
    Parzelle gespeicherte ID.

    Mein momentaner Stand ist dieser:

    const ID& Scanner::scanForID(int fieldOfViewNo, Direction dir, const Location& loc)
    {
    	World world;
    	int y=loc.first;
    	int x=loc.second;
    
    	switch(dir)
    	{
    	  case N: switch(fieldOfViewNo)
    			  {
    	             case 0: return world.getID(Location(y-2,x-2)); break;
    				 case 1: return world.getID(Location(y-2,x-1)); break;
    				 case 2: return world.getID(Location(y-2,x)); break;
    				 case 3: return world.getID(Location(y-2,x+1)); break;
    				 case 4: return world.getID(Location(y-2,x+2)); break;
    				 case 5: return world.getID(Location(y-1,x-2)); break;
    				 case 6: return world.getID(Location(y-1,x-1)); break;
    				 case 7: return world.getID(Location(y-1,x)); break;
    				 case 8: return world.getID(Location(y-1,x+1)); break;
    				 case 9: return world.getID(Location(y-1,x+2)); break;
    				 case 10: return world.getID(Location(y,x-2)); break;
    				 case 11: return world.getID(Location(y,x-1)); break;
    				 case 12: return world.getID(Location(y,x)); break;
    				 case 13: return world.getID(Location(y,x+1)); break;
    				 case 14: return world.getID(Location(y,x+2)); break;
    				 case 15: return world.getID(Location(y+1,x-2));break;
    				 case 16: return world.getID(Location(y+1,x-1));break;
    				 case 17: return world.getID(Location(y+1,x));break;
    				 case 18: return world.getID(Location(y+1,x+1));break;
    				 case 19: return world.getID(Location(y+1,x+2));break;
    				 default: return world.getID(Location(y-y-1,x-x-1)); break;
    			  } break;
    	  case E: switch(fieldOfViewNo)
    			  {
    			  } break;
    	  case S: switch(fieldOfViewNo)
    			  {
    			  } break;
    	  case W: switch(fieldOfViewNo)
    			  {
    			  } break;
    	}
    }
    

    Die Idee ist folgende, ich stelle mir ein Feld aus 19 Parzellen vor, welches so aussieht (für nach Norden):

    0  1  2  3  4  
    5  6  7  8  9
    10 11 12 13 14
    15 16 17 18 19
    

    Ich gehe z.B davon aus, dass ich mich auf der 12. Position befinde und möchte zur Position 0 -> x-2, y-2 usw.
    Es soll dann eine Parzelle zurückgegeben werden, also entweder '#' oder ' ' und anhand dessen wird später entschieden ob der Weg befahrbar ist oder nicht. Wenn's z.B. nach Osten geht wird dieses Feld nach rechts gekippt.

    Vom Grundgedanken her so in Ordnung?

    Jedefalls bringt mir der Compiler beim Compilieren diese Warnungen:

    warning C4172: Adresse einer lokalen Variablen oder eines temporären Werts wird zurückgegeben //mehrere davon
    "Scanner::scanForID": Nicht alle Steuerelementpfade geben einen Wert zurück.
    


  • Ähm ja, deine Funktion sollte ja Daten vom Typ 'ID' zurückliefern.

    Was passiert wenn der case E, S oder W eintrifft?
    Dann wird kein return gefunden. Somit geben nicht alle Steuerelementpfade einen Wert zurück 😉 .

    Lg



  • Ein kleiner Schupser von mir: http://paste.pocoo.org/show/490368/


Anmelden zum Antworten