enum und Variablen Problem, nicht global, geht totzdem



  • N'Abend zusammen,

    ich habe vorhin angefangen ein Programm zur Tiefensuche von Pascal in C++ umzuschreiben.

    Allerdings hab ich schon direkt am Anfang mit ein paar Merkwürdigkeiten zu tun.

    #include <iostream>
    
    using namespace std;
    
    enum TOrt { dummy = -1, A, B, C, D, E, F, MATRIX_SIZE };
    
    typedef int TMatrix[MATRIX_SIZE][MATRIX_SIZE];
    
    struct TStrecke {
    	TOrt von, nach;
    	};
    
    typedef TStrecke Tweg[13];
    
    const TOrt cMaxOrt 	= F;
    const TOrt cStartOrt = A;
    const TOrt cZielOrt  = E;
    
    void ErzeugeAdjazenzmatrix(TMatrix karte)
    {
    	int i = 0;
    	int j = 0;
    	for(i; i < MATRIX_SIZE; i++)
    	{
    		j = 0;
    		for(j; j < MATRIX_SIZE; j++)
    		{
    			karte[i][j] = 2;
    		}
    	}
    }
    
    int main()
    {
    	TMatrix karte;
    	ErzeugeAdjazenzmatrix(karte);
    
    	int i = 0;
    	int j = 0;
    	for(i; i < MATRIX_SIZE; i++)
    	{
    		j = 0;
    		for(j; j < MATRIX_SIZE; j++)
    		{
    			cout << karte[i][j] << " ";
    		}
    		cout << "\n";
    	}
    
    	return 0;
    }
    

    Warum funktioniert der Zugriff auf MATRIX_SIZE und warum enthält "karte" in der main definierte Werte, obwohl die Variable nicht als Zeiger übergeben wird und nicht global ist ?

    Ich hoffe jemand kann mir sagen, was ich falsche gemacht habe, ich mich berichtigen 🙂

    mfg Stefan



  • _stefan schrieb:

    Warum funktioniert der Zugriff auf MATRIX_SIZE...

    weil du MATRIX_SIZE in dem enum definierst (als 6 glaub ich).
    🙂



  • Muss ich denn nicht erst eine Variable von TOrt erstellen?
    bzw. wie kann ich das den anders machen?

    Und warum funktioniert das mit karte?

    Stefan



  • in c++ werden arrays per reference übergeben



  • _stefan schrieb:

    Muss ich denn nicht erst eine Variable von TOrt erstellen?
    bzw. wie kann ich das den anders machen?

    nein, du kannst die werte eines enums direkt verwenden. was gefällt dir nicht daran?

    _stefan schrieb:

    Und warum funktioniert das mit karte?

    gleicheermassen, weil du den typ 'TMatrix' oben definiert hast, kannst du ein objekt davon anlegen (deins ist allerdings nicht initialisiert d.h. es enthält unvorhersehbare werte).
    🙂



  • Dass ich ein Objekt anlegen kann ist klar.
    Aber ich übergebe die Variable karte an die Funkion, wo dann das Array gefüllt wird. Und wenn ich karte in mein() ausgebe enthält es immer die Werte, die ich in der Funtktion zugewiesen habe.

    Falls jemand Pascal kann, hier ist der type-Deklerationsteil:

    type tort = (dummy, a, b, c, d, e, f);
    tpye tmatrix = array[tort, tort] of integer;
    type tstrecke = record von, nach : tort; end;
    type tweg = array[1..12] of tstrecke;
    

    Ich wollte nun eine Funktion schreiben die die Matrix füllt, und zurück gibt (als Pointer). Über tort (als index) sollte man auf die Matrix zugreifen können.



  • _stefan schrieb:

    warum enthält "karte" in der main definierte Werte, obwohl die Variable nicht als Zeiger übergeben wird und nicht global ist ?

    "in c++ werden arrays per reference übergeben"
    vieleich hab ich mich falsch ausgedrückt,
    in c++ werden arrays immer als pointer übergeben.
    Deshalb wird das array karte in der funktion ErzeugeAdjazenzmatrix
    auch initialisiert und deshalb hat karte in main auch gültige Werte.



  • Alles klar, das mit dem Array hab ich verstanden.

    Allerdings ägert es mich, dass auf

    enum TOrt { dummy = -1, A, B, C, D, E, F, MATRIX_SIZE };
    

    von überall zugegriffen werden kann.

    Demnach könnte ich ja kein

    enum Test { C = 1 };
    

    definieren, da ich ja ansonsten Probleme mit dem C von TOrt bekomme.



  • _stefan schrieb:

    da ich ja ansonsten Probleme mit dem C von TOrt bekomme.

    Ja, das stimmt.

    _stefan schrieb:

    type tort = (dummy, a, b, c, d, e, f);
    tpye tmatrix = array[tort, tort] of integer;
    type tstrecke = record von, nach : tort; end;
    type tweg = array[1..12] of tstrecke;

    Von Pascal nach C++ so dierect zu portiren ist nicht gut.

    Du willst ja ein Tiefensuche Algorithmus nach c++ portiren,
    verwende doch den std::vector als Datenstruktur.
    Dann ist es leichter.



  • Hatte das schon in std::vector geändert 😉

    Das Problem mit dem enum hab ich in sofern gelöst, das ich das ganze in einen Namensraum gepackt habe.

    -> Der Thread hat sich damit für mich erledigt 🙂



  • Hmm zeig vllt mal lieber deinen Pascal code(oder schreib einfach direkt komplett neu und C++), denn das sieht sehr gefrickelt usw. aus.


Anmelden zum Antworten