2 Dimensionale std::arrays? Wie deklarier ich die?
-
Hi,
in einem anderen Thread wurde mir geraten, anstatt normaler arrays wie z.B:
abc[3][3];std::arrays zu benutzen. Jedoch bin ich irgendwie zu blöd diese zu deklarieren:
array<array<int, 3>, 3> abcHabs auch schon wie folgt probiert:
abc<abc<int, 3>, 3>oder
array abc<abc<int, 3>, 3>Habe alle 3 Varianten auch schon mit Semikolon ganz am Ende probiert. Geht auch nicht.
Aber egal was ich mache ich bekomme immer den Fehler, dass hinter > ein Semikolon fehlt. Habe auch#include <array>als Header ingeschrieben, jedoch funktioniert es einfach nicht.
Wisst ihr was ich da falsch mache?
LG
jkhsjdhjs
-
#include <array> std::array<std::array<int,3>,3> abc;Sollte gehen. Ansonten Fehlermeldung?
-
jkhsjdhjs schrieb:
HJedoch bin ich irgendwie zu blöd diese zu deklarieren:
Du bist vor allem zu blöd, den Fehler zu beschreiben!
Vielleicht solltest du hinter die erste Variante ein ";" schreiben?
-
Nein, das funktioniert leider auch nicht.
Die Fehlermeldungen sind:
1>------ Erstellen gestartet: Projekt: Schiffe versenken, Konfiguration: Debug Win32 ------ 1> Schiffe versenken.cpp 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(14): error C2143: Syntaxfehler: Es fehlt ';' vor '<' 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(14): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(16): error C2143: Syntaxfehler: Es fehlt ';' vor '{' 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(16): error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil? 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(111): error C2065: 'WHITE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(115): error C2065: 'YELLOW': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(117): error C2065: 'WHITE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(122): error C2065: 'BLUE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(124): error C2065: 'WHITE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(127): error C2065: 'DARKRED': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(129): error C2065: 'WHITE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(134): error C2065: 'YELLOW': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(136): error C2065: 'WHITE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(139): error C2065: 'BLUE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(141): error C2065: 'WHITE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(144): error C2065: 'DARKRED': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(146): error C2065: 'WHITE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(151): error C2065: 'TURQUOIS': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(153): error C2065: 'WHITE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(163): error C2065: 'RED': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(168): error C2065: 'RED': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(171): error C2065: 'TURQUOIS': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(182): error C2065: 'WHITE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(210): error C2065: 'YELLOW': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(215): error C2065: 'BLUE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(220): error C2065: 'DARKRED': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(227): error C2065: 'TURQUOIS': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(232): error C2065: 'BLUE': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(237): error C2065: 'DARKRED': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(256): error C2065: 'YELLOW': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(260): error C2065: 'BLACK': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(293): error C2065: 'YELLOW': nichtdeklarierter Bezeichner 1>c:\users\***\documents\visual studio 2013\projects\schiffe versenken\schiffe versenken\functions.h(297): error C2065: 'BLACK': nichtdeklarierter Bezeichner ========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========Die Fehler mit den Farben kommen wegen dem Farben enum hinter der Array deklaration.
-
und jetzt zeige mal ganz genau Zeile 14. und am besten noch die 13 Zeilen die davor kommen, damit wir nicht im Zweifel raten müssen, ob da ein using namespace std; steht (bitte nicht) oder ob du noch ein std:: davor packen musst.
Du machst es uns echt schwer, dir zu helfen.
-
Ok, habs jetzt hinbekommen. Ich hab die ganze Zeile in das Hauptprogramm gepackt und nicht global definiert, dann gehts.
// Schiffe versenken.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include "functions.h" #include <array> int _tmain(int argc, _TCHAR* argv[]) { array<array<int, 4>, 3> abc;Aber ich hab doch schon
#include <array> in der functions.h stehen, warum muss ich das dann im Hauptprogramm nochmal includen?Und die Warnung unreferenzierte lokale Variable kommt warscheinlich daher, dass sie noch nirgendwo verwendet wird, oder?
EDIT: Und ja, ich habe das using namespace std; in der functions.h stehen. Ist es nicht gut, wenn man using namespace std verwendet oder warum das bitte nicht?
EDIT2: Außerdem habe ich im Hauptprogramm noch SetConsoleTitleA(); stehen, aber da hab ich die windows.h nur einmal in der functions.h eingebunden, musste sie im Hauptprogramm nicht mehr einbinden. Jetzt ist meine Frage halt, warum ich das bei array machen muss.
-
...
-
Swordfish schrieb:
Weniger als Antwort an dich als eher eine Frage an Leute, die sich mit PCH auskennen: Könnte das hier reinpfuschen?
Neee. Aber ich wette, dass der Fehler irgendwo zwischen Zeile 1 und Zeile 14 in functions.h liegt.
-
...
-
Ok, Danke für eure Hilfe

Habe den Fehler mit dem array gelöst bekommen, indem ich Visual Studio neugestartet hab. Keine Ahnung warum das danach auf einmal ging, auf jeden Fall klappt jetzt alles so wie ihr gesagt habt

Danke nochmal an alle

-
Auf den ersten Blick fehlt da entweder ein
using namespace std;oder du solltest den Typnamen voll qualifizieren:std::array<std::array<int,3>,3>.
-
Also using namespace std; hab ich in die function.h geschrieben unter die includes.
-
jkhsjdhjs schrieb:
Also using namespace std; hab ich in die function.h geschrieben unter die includes.
Und das ist auf mehrere Arten und Weisen falsch. Erstens wurde dir schon gesagt, dass ein using namespace niemals(!) in einen Header gehört. Zweitens steht es so doch vor dem
#include<array>(include ist eine einfache Textersetzung!), wodurch es das std::array eben nicht im globalen Namensraum bekannt macht.
-
...
-
Funktioniert doch jetzt alles.
Aber gut, hier:
Schiffe versenken.cpp:
// Schiffe versenken.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include "functions.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { array<array<int, 4>, 2> abc; system("mode con:cols=197 lines=70"); //Fenstergröße ändern setlocale(LC_ALL, "German"); //damit Umlaute angezeigt werden können SetConsoleTitleA("C++ Schiffe Versenken 2"); //Konsolenfenstertitel ändern Field(PLAYER); //Spielfeld des Spielers anzeigen /*for(;;)printf("%d", getKey());*/ PlayerPlaceFlattop(); //Spieler platziert den Flugzeugträger _getch(); }functions.h auf Pastebin, wäre zu lang für hier.
EDIT: Also mit "es funktioniert allles" meine ich nicht, dass das Spiel funktioniert, sondern das ich das mit den std::arrays hinbekommen hab.
-
...
-
Wie trickreich er das gemacht hat, dass in Zeile 14 jetzt einfach nichts steht

-
Swordfish schrieb:
Dir ist schon klar, daß man Header dort einbindet, wo sie benötigt werden? Daß in Header Deklarationen kommen und in Sourcefiles die Definitionen?
Also sollte ich die clocale zum Beispiel in die Schiffe versenken.cpp einbinden, weil dort setlocale verwendet wird?
Und was, wenn ich in beiden Dateien den gleichen Header brauche, z.B. iostream. Den soll ich dann aber nur in die functions.h einbinden, oder?
Und an SeppJ: Warum soll ein using namespace std nicht in die functions.h?
Soll ich dann immer std:: davor schreiben?
-
jkhsjdhjs schrieb:
Swordfish schrieb:
Dir ist schon klar, daß man Header dort einbindet, wo sie benötigt werden? Daß in Header Deklarationen kommen und in Sourcefiles die Definitionen?
Also sollte ich die clocale zum Beispiel in die Schiffe versenken.cpp einbinden, weil dort setlocale verwendet wird?
Ja.
Und was, wenn ich in beiden Dateien den gleichen Header brauche, z.B. iostream. Den soll ich dann aber nur in die functions.h einbinden, oder?
Nein, nur wenn functions.h tatsächlich selber etwas aus iostream benutzt. Sammelheader hingegen sind meistens eher eine schlechte Idee.
Und an SeppJ: Warum soll ein using namespace std nicht in die functions.h?
Soll ich dann immer std:: davor schreiben?Lies die Antworten im Thread:
Swordfish schrieb:
jkhsjdhjs schrieb:
EDIT: Und ja, ich habe das using namespace std; in der functions.h stehen. Ist es nicht gut, wenn man using namespace std verwendet oder warum das bitte nicht?
Echt toller Link - auch mit anderen Eingaben benutzbar!
-
Ah, ok. Weil sonst andere cpp Dateien, die den Header verwenden, automatisch using namespace std mit drin haben. Ich werd dann in functions.h überall std:: davor schreiben. Danke!
EDIT: Wie sähe eigentlich ein typedef für ein 2d std::array aus?