Deklaration eines zweidimensionalen boolschen Array
-
Ich verwende den GNU GCC Compiler. Auch wenn man es schlecht erkennt, aber da sind zwei geschweifte Klammern und das false.
-
Ich glaube _kormisch_ meint wohl Doppelklammen im Sinne von {{false}} weil es sich um ein 2d Array handelt.
Mit dem gcc 4.2 (Debian) funktioniert es so wie es in deinem ersten Post steht.
Ist dort eventuell ein Zeichen zwischen, welches dein Editor nicht anzeigt? Ansonsten habe ich keine Idee was das Problem sein könnte.
-
Wenn ich mit VC2008 kompiliere, erhalte ich folgende Fehlermeldung:
ships[x][y]=true; error C2109: Index erfordert ein Array oder einen ZeigertypHilft Euch (oder mir) das weiter?
EDIT: Ich glaube, das liegt irgendwie an meinen Funktionsaufrufen. In der main funktioniert das auch bei mir einwandfrei. Könnt Ihr bitte mal schauen, wo bei mir der Fehler liegt?
#include <windows.h> #include <iostream> #include <conio.h> using namespace std; const int UP = 72; const int DOWN = 80; const int LEFT = 75; const int RIGHT = 77; const int SPACE = 32; void setCursor(HANDLE set, int x, int y){ COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(set, pos); } void setShip(HANDLE set, bool ships, int x, int y){ ships[x][y]=true; setCursor (set, x, y), cout << 'S'; } void editField(HANDLE set, bool ships){ int x=0, y=2; int key; while(true){ key=getch(); if (ships[x][y]==false) cout << ' '; if (key==SPACE) setShip(set, ships, x, y); if (key==RIGHT) x++; if (x==80) x=0; if (key==LEFT) x--; if (x==-1) x=79; if (key==DOWN) y++; if (y==25) y=2; if (key==UP) y--; if (y==1) y=24; setCursor (set, x, y), cout << '_'; } } int main(){ HANDLE set=GetStdHandle(STD_OUTPUT_HANDLE); bool ships[80][25]={{false}}; editField(set, ships); }
-
Der Parameter
shipsvonsetShipist ein einzelner bool und kein zweidimensionales Array von bools.
-
Ah vielen Dank. Das wirds sein. Kannst Du mir sagen, wie ich es schreiben muss? Das, was ich gefunden habe, funktioniert nicht.
-
Als Lösungen, die nicht zu abgefahren für dich sind:
- einen bool** als Parameter. Dann musst du noch zwei zusätzliche Parameter für die Dimensionen mitgeben. Schlechte Lösung.
- einen Datencontainer verwenden, der die Arbeit für dich abnimmt, z. B. std::vector.
-
Wie lautet denn die Syntax eines mehrdimensionalen vector-Array?
void setShip(HANDLE set, vector<bool>& ships, int x, int y){ ships.at(x,y)=true; // |22|error: no matching function for call to 'std::vector<bool>::at(int&, int&)'| setCursor (set, x, y), cout << 'S'; }ist falsch.
-
void setShip(HANDLE set, vector<vector<bool> >& ships, int x, int y){ ships[x][y]=true; setCursor (set, x, y); cout << 'S'; }
-
Dann bekomme ich
|22|error: no match for 'operator[]' in '((std::vector<bool>*)ships)->std::vector<bool, _Alloc>::operator[] [with _Alloc = std::allocator<bool>, std::vector<bool, _Alloc>::reference = std::_Bit_reference, std::vector<bool, _Alloc>::size_type = unsigned int](((unsigned int)x))[y]'|Warum kann man das denn nicht mit .at() lösen? Ich dachte, das wäre besser?
-
(std::vector<bool>*)shipsWas soll das * da?
Aber worauf ich noch gar nicht eingegangen bin: vector<bool> hat leider nicht allzu viel mit vector<andererTyp> zu tun. Du könntest statt bool z. B. int verwenden, um den "normalen" vector zu verwenden.
Ob du dann ships[x][y] oder ships.at(x).at(y) benutzt, unterscheidet sich nur in der zusätzlichen Überprüfung bei at, ob der Parameter nicht zu groß oder zu klein ist.
-
Ich habe das nicht so geschrieben
void setShip(HANDLE set, vector<bool>& ships, int x, int y){ ships[x][y]=true; setCursor (set, x, y), cout << 'S';Ich würde aber gerne weiterhin ein boolsches Array nutzen. Wenn das mit vector sinnlos ist, würde ich dann gerne wieder bool array[int][int] verwenden. Aber dann bleibt wieder das Problem mit der Übergabe in die Funktion.
-
Nicht vector<bool>, sondern vector<vector<bool> >.
Du kannst vector<vector<bool> > benutzen. Ich weiß da zwar nicht das komplette Verhalten auswendig, aber für deine Zwecke reicht das. Ansonsten nimmst du halt einfach vector<deque<bool> >.
-
Ich habs jetzt nochmal ohne vector versucht und bekomme schon wieder einen Fehler. Ich werd noch irre!
void editField(HANDLE set, bool** ships) [ ... ] bool ships[80][25]; editField(set, ships); // |error: cannot convert 'bool (*)[25]' to 'bool**' for argument '2' to 'void editField(void*, bool**)'|Falls das irgendwann erledigt sein sollte, hätte ich noch die Frage, ob es eine Funktion gibt, die ein Array mit einem immer gleichen Wert füllt.
-
void editField(HANDLE set, bool (*ships)[25])//<<<<<<<<<<<< [ ... ] bool ships[80][25]; editField(set, ships);
memset(&array, wert, anzahl;)

-
Ah endlich keinen Fehler
Danke an Dich und Michael E. Auch für memset.Wobei ich
bool (*ships)[25]von der Form her etwas unglücklich finde

-
Nimm nicht
memset(). Lieberstd::fill(), das kann auch mit C++-Objekten (Nicht-PODs) sowie mit STL-Contiainern umgehen. Nicht dass du dir Dinge aneignest, die später nicht funktionieren.lemon03 schrieb:
Wobei ich
bool (*ships)[25]von der Form her etwas unglücklich finde

Das ist halt, wenn man mit rohen Arrays arbeitet. Da gibts etliche Sonderregeln und kaum irgendwo normale Wertsemantik. Willst du wie gewohnt arbeiten (und zusätzliche Features wie Debug-Unterstützung nutzen), nimm
std::tr1::array. Dann kannst du eine normale Referenz nehmen.
-
Für fill() muss ich doch wieder vector nutzen? Da gabs doch die ganze Zeit Fehler. Und für tr1::array weiß ich mal wieder nicht, wie man das für ein mehrdimensionales Array nutzt.
-
Nein,
std::fill()funktioniert auch mit Arrays.#include <algorithm> int main() { const int size = 5; int array[size]; std::fill(array, array+size, 42); }
-
Ok danke, wieder etwas zu gelernt
