Wie bekomme ich ein mehrfaches array aus einer methode in eine klasse übergeben?



  • Moin Leute,
    kann mir vlt jemand sagen, wie ich ein mehrfaches array aus einer Methode der übergeordneten klasse zurückgebe?
    Funktioniert dies auch mit der Konstruktion?

    mfg black Sheep



  • Ich habe Probleme mit deiner Begriffswahl:

    Mehrfaches Array = Mehrdimensionales Array?
    Übergeordnete Klasse einer Methode? Die Klasse selbst oder irgendeine Art von Basisklasse?

    MfG SideWinder



  • ja sorry
    ich meine ein mehrdimensionales array.
    und die Methode steckt in der selben klasse



  • class Sample
    {
        char** strings;
    
        Sample(int sizex, int sizey) : strings(new char*[sizex]) { for(...) strings[i] = new char[sizey]; }
        ~Sample () { ... }
        Sample (const Sample&) { ... }
        Sample& operator= (const Sample& rhs) { ... }
    
        // einfach ganz normal zurcükgeben, aber bitte const sonst passieren irgednwann böse dinge
        const char** getStrings const ( return strings; }
    };
    

    Viel besser: Das 2D-Array durch einen Container ersetzen.

    MfG SideWinder



  • mhn..das problem dabei ist nur, dass das array berreits vorhanden ist.
    Es soll durch die Methode nur verändert werden.
    Kann man die Adresse des Arrays nicht irgendwie übergeben?

    EDIT: odervlt kann man dies auch mit der Zugriffsmethode Set_Methode erledigen?



  • Wo genau wurde das 2D-Array erstellt? In der Klasse oder woanders? Im zweiten Fall sieht das so aus:

    class Sample
    {
        void doSmth ( char ** array )
        {
            // mach was mit array
        }
    };
    

    MfG SideWinder



  • es wurde in der selben Klasse wo auch die Methode drinne ist erstellt.
    mhn ich werde es so mal ausprobieren danke 🙂



  • Dann greif doch einfach ganz normal darauf zu, wo musst du es dann übergeben?! Zeig mal deinen Code, ich verstehs nicht.

    MfG SideWinder


  • Mod

    @Sidewinder: Du meinst sicher

    const char* const* getStrings const ( return strings; }
    

    Sonst passieren schlimme Dinge 🙂 Naja, wer solche Konstrukte verwendet, hat den Schuss in den Fuß auch verdient.



  • Das habe ich versucht..aber irgendwie funktioniert es nicht

    //Definiert Ausgabefarben
    #define BLUE     "\033[34;1m"  //blaue Textausgabe
    #define RED      "\033[31;1m"  //rote Textausgabe
    #define GREEN    "\033[32;1m"  //grüne Textausgabe
    #define BLACK    "\033[30;1m"  //schwarze Textausgabe
    #define STANDARD "\033[0;0m"   //standard Textausgabe
    
    class schiff_spieler
    	{
    		public:
    		char spieler_farbe[2][9]; // Definiert die Spielerfarbe
    		void spieler_farb_auswahl()
    			{
    				int i,farbe;
    				for(i=0;i<2;i++)
    					{
    						cout <<STANDARD << "Spieler "<< i+1 <<"  bitte geben Sie Ihre Spielfarbe an" << endl;
    						cout << BLUE     << "1.Blau"    << endl;
    						cout << RED      << "2.Rot"     << endl;
    						cout << GREEN    << "3.Grün"    << endl;
    						cout << BLACK    << "4.Schwarz" << endl;
    						do
    							{
    								cin >> farbe;
    								switch(farbe)
    									{
    										case 1: strcpy(spieler_farbe[i],BLUE); break; //ANSI-Escape Farbe Blau
    										case 2: strcpy(spieler_farbe[i],RED);  break; //ANSI-Escape Farbe Rot
    										case 3: strcpy(spieler_farbe[i],GREEN); break; //ANSI-Escape Farbe Grün
    										case 4: strcpy(spieler_farbe[i],BLACK); break; //ANSI-Escape Farbe Schwarz
    										default : cout << "Bitte geben Sie eine gültige Farbe an"; break;
    									}
    								}while(farbe > 4 || farbe==0);
    
    						}
    				cout << spieler_farbe[0] << "Spieler 1" << endl;            //Funktioniert
    				cout << spieler_farbe[1] << "Spieler 2" << STANDARD;  //Funktioniert
    				}
    				cout << spieler_farbe[0] << "Spieler 1"; //Funktioniert nicht (siehe Compiler-Fehlerausgabe)
    
    		};
    

    Innerhalb der Methode funktioniert alles...aber nachdem die Methode beendet wird kommt folgender Fehler:

    schiffe_blub.cpp:55: error: ISO C++ forbids declaration of ‘cout’ with no type
    schiffe_blub.cpp:55: error: expected ‘;’ before ‘<<’ token
    

    aus diesem Grunde dachte ich, dass man das Array trotz Klasse zurückgeben muss



  • Okay ich könnt mich selber in den Hintern beißen...-.-

    Habe die Ausgabe ja einfach so ohne Methode in die Klasse geschrieben...
    Tut mir Leid beim nächsten mal gug ich erstmal genauer 😃

    mfg black Sheep007



  • (1) Verwende keine #define-Konstanten (Makros) sondern String-Literale
    (2) Verwende doch statt char[2][9] besser std::string[2] oder noch besser:

    enum Color { BLUE , RED , GREEN , BLACK , STANDARD };
    static const char* COLORS = { "\033[34;1m", ... };
    
    struct Player
    {
        string color;
        ... // weitere sachen die ein spieler hat
    };
    
    class Game
    {
        Player players [2];
    
        void choose_colors ()
        {
            ...
            players[0] = COLORS[i];
            ...
        }
    };
    
    (3) Das eigetnliche Problem ist, dass du eine Ausgabe außerhalb irgendeiner Funktion machst. Das sollst du nicht hier machen sondern im Hauptprogramm:
    [cpp]
    int main ()
    {
        schiff_spieler game;
        game.spieler_farb_auswahl();
        cout << game.spieler_farbe[0] << "Spieler 1"; // Hier gehts
    }
    

    MfG SideWinder


  • Mod

    Man kann auch einfach op<< für Color überladen und strings völlig vergessen:

    enum Color { BLUE , RED , GREEN , BLACK , STANDARD };
    std::ostream& operator<<(std::ostream& s, Color c)
    {
        static const char* const COLORS[] = { "\033[34;1m", ... };
        return s << COLORS[c];
    }
    

    und arbeitet sonst überhaupt nur mit Color und gewinnt noch etwas Typsicherheit hinzu.



  • Glaubst du nicht, dass das noch etwas zu kompliziert für unseren Probanden ist? 😉

    Edit: Außerdem wurde mir zB verboten das für die IC zu implementieren. Da hieß es was von "dafür nicht gemacht" 😃

    MfG SideWinder


  • Mod

    SideWinder schrieb:

    Glaubst du nicht, dass das noch etwas zu kompliziert für unseren Probanden ist? 😉

    Persönlich finde ich das weniger kompliziert. Schließlich ist diese ganze Stringgeschichte ja sowieso nur eine Frage der Ausgabe. Aber soll sowieso nur ein Anstoß sein.

    Edit: Außerdem wurde mir zB verboten das für die IC zu implementieren. Da hieß es was von "dafür nicht gemacht" 😃

    Ich kann nicht folgen.


Log in to reply