Verkehrssimulation
-
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 19Ich 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/
-
Sorex schrieb:
Alles klar, danke.. wurde korrigiert.
warning C4172: Adresse einer lokalen Variablen oder eines temporären Werts wird zurückgegeben //mehrere davonworld ist lokal. Du gibst Referenzen auf lokale Werte zurück. Wenn du den Scope verlässt, sind die Referenzen noch da, aber die Werte sind weg --> BOOM.
Gib ID per Value zurück. Das ist imo das einzig sinnvolle hier.