zweidimensionales Array



  • Hallo Leute

    kann mir jemand helfen? ich versuche mich im oop und habe ein paar fragen bezüglich mehrdimensionale arrays.
    Also ich initialisiere das array im konstruktor und möchte nur auf einen einzigen eintrag zugreifen im spin.cpp (ein einzelner zufällig gewählter spin soll gewechselt werden). wie mache ich das? hier mal ein versuch von mir:

    spin.h:

    const int up = 1;	//Spin up
    const int down = -1;	//Spin down
    
    const int L = 3;	//Number of sites in one dimension
    
    class Spin
    {
    	int **site;		
    	int T;
    int ROW;
    int COLUMN;
    public:
    	Spin();
    	Spin(int);		
    	int get_spin(int, int);
    	~Spin();			
    };
    

    spin.cpp:

    #include "spin.h"
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    Spin::Spin() {}
    
    //Konstruktor with initialized sites
    //----------------------------------
    
    Spin::Spin(int t) 
    {
    	T = t;
    	srand(2);				//get random number
    	site = int*site[L];		
    
    	for (int i = 0; i < L; i++) 
    	{
    		site[i] = new int[L];		//twodimensional array
    	}
    
    	for (int i = 0; i < L ; i++) 
    	{
    		for (int j = 0; j < L; j++) 
    		{
    			if (T == 0) 
    				site[i][j] = up;	//if temperature is 0
    			}
    			else 
    			{
    				double x = (double)rand()/(double)RAND_MAX;
    
    				if (x < 0.5) 
    					site[i][j] = down;
    
    				else 
    					site[i][j] = up;
    			}
    			cout << "site[" << i << "][" << j << "]= " << site[i][j] << endl;
    		}
    	}
    	cout << '\n';
    }
    
    //Get spin on a particular site
    //-----------------------------
    
    int Spin::get_spin(int r, int c)
    {
    	ROW = r;
    	COLUMN = c;
    
    	site[ROW][COLUMN] = site[ROW][COLUMN]*(-1);   //FEHLER!!!!!
    
    	return site;		//return spin up or down
    }
    
    //Destruktor
    //----------
    
    Spin::~Spin()
    {
    	if(site) 
    		for( int i = 0; i < L; i++ )
    			delete [] site[i];
    			delete [] site;
    }
    
    int main () 
    {
    	Spin(1);
            srand(time(0));
    
    	int r = rand() %L;
    	int c = rand() %L;	
    
    	cout << r << ", " << c << endl;
    
    	int spinD = direction.get_spin(r, c);
    return 0;
    }
    

    wenn ich das so mache, bekomme ich irgendeinen wert und nicht den initialisierten. Was mache ich falsch?

    Mit einer schleife im main programm könnte ich zwar alle spins immer wieder neu berechnen, aber das programm läuft sicher schneller, wenn man nur mit einem eintrag weiter rechnet vor allem, wenn die Länge des arrays sehr gross wird.

    danke und noch schönen abend
    nijntje



  • nijntje schrieb:

    Mit einer schleife im main programm könnte ich zwar alle spins immer wieder neu berechnen, aber das programm läuft sicher schneller, wenn man nur mit einem eintrag weiter rechnet vor allem, wenn die Länge des arrays sehr gross wird.

    Ich nehme an, du bist'n Anfänger - da macht es bestimmt keinen für dich relevanten Performance-Unterschied. Falls doch seh ich mir das gleich nochmal an, aber es geht bestimmt auch ohne OOP- such dir da was geeigneteres, damit du auch ein Gefühl dafür kriegst wo es Sinn macht.



  • Die Aufgabe ist eigentlich nicht schwierig. In c könnte ich das ohne Probleme implementieren. Würde aber gerne wissen, was hier das Problem ist.
    Danke



  • Kann mir hier niemand einen tipp geben? 😞

    ich brauche nur einen wert aus dem initialisierten array, mit dem ich weiterrechnen kann.
    da ich etwa 100000 mal irgendeinen spin wechseln muss, wäre es toll, wenn ich nicht jedes mal über alle werte im array laufen müsste.

    ich stehe da ziemlich auf der leitung...

    danke



  • hat sich erledigt, danke...

    im konstruktoraufruf lag der fehler!



  • nijntje schrieb:

    srand(2);				//get random number
    

    Der Kommentar widerspricht dem Code davor.

    Ein paar Tipps:

    • std::vector für Arrays
      - vernünftige Namen für Variablen und Konstanten
      - der Standardkonstruktor erzeugt kein gültiges Objekt (-> vector )
      - geschweifte Klammern bei allen Blöcken


  • TyRoXx schrieb:

    - geschweifte Klammern bei allen Blöcken

    👎

    Deine Sig ist übrigens auch Schwachsinn.



  • 314159265358979 schrieb:

    👎

    👎
    In der äussersten Ebene gebe ich dir recht, aber bei inneren Verschachtelungsebenen, bei denen die äusseren Klammern benutzen, finde ich nicht schlecht. Auch wenn der else-Zweig Klammern hat, sollte der if-Zweig auch welche haben. Wohin die Nichtbeachtung dieser Regel führt, sehen wir ja hier:

    nijntje schrieb:

    for (int j = 0; j < L; j++)
            {
                if (T == 0)
                    site[i][j] = up;    //if temperature is 0
                }
                else
                {
                    // ...
    

    Wenn hier schon alles kritisiert wird, dann darf das folgende nicht unerwähnt bleiben:
    - Vergleich a == 0 in !a umändern
    - ++j statt j++
    - Keine Variablen/Konstanten in lauter Grossbuchstaben
    - Konstantendefinitionen (bei dir) nicht auf globaler Ebene, sondern auf Klassenebene
    - Parameternamen im Header nicht weglassen



  • nittpicker schrieb:

    Wohin die Nichtbeachtung dieser Regel führt, sehen wir ja hier: [...]

    Ich kann mich nicht erinnern, jemals dieses Problem gehabt zu haben. Ich kann mich auch noch nicht erinnern, jemals Range-Checks bei Arrays gebraucht zu haben, oder Probleme durch implizite Konvertierungen gehabt zu haben. Oder durch überladene Operatoren.

    Worauf ich hinaus will damit? Lustigerweise habe ich nie die Probleme, die immer irgendwo kritisiert werden. Entweder, ich bin einfach der Oberprofi, oder alle anderen sind doof. Suchs dir aus. 😉

    nittpicker schrieb:

    - Vergleich a == 0 in !a umändern

    Ney, das ist absolut okay.

    nittpicker schrieb:

    - Konstantendefinitionen (bei dir) nicht auf globaler Ebene, sondern auf Klassenebene

    Das sind bei ihm doch nicht mal Konstanten. Die Variablen sind einfach komplett unnötig.



  • nittpicker schrieb:

    - Vergleich a == 0 in !a umändern

    Das mag hustbaer nicht, und den finde ich cool (hab es früher auch immer gemacht) 🕶



  • 314159265358979 schrieb:

    Worauf ich hinaus will damit? Lustigerweise habe ich nie die Probleme, die immer irgendwo kritisiert werden. Entweder, ich bin einfach der Oberprofi, oder alle anderen sind doof. Suchs dir aus. 😉

    Du bist zu gut für dieses Forum, geh weg.
    Such dir andere Aufgaben, zum Beispiel deinen Grundschulabschluss machen.



  • Netter Versuch. 😃
    Finds voll süß, dass ich nun in deiner Sig bin. Dazu fällt mir folgendes Zitat ein:

    Du hast es geschafft. Du bist zur Identifikationsfigur des Bösens etc. aufgestiegen. Jetzt gehörst du zu einer Reihe von großartigen Leute wie ..., ... und meiner Wenigkeit.



  • Wie niedlich TyRoXx versucht, PI zu dissen 🙄



  • 314159265358979 schrieb:

    Netter Versuch. 😃
    Finds voll süß, dass ich nun in deiner Sig bin. Dazu fällt mir folgendes Zitat ein:

    Du hast es geschafft. Du bist zur Identifikationsfigur des Bösens etc. aufgestiegen. Jetzt gehörst du zu einer Reihe von großartigen Leute wie ..., ... und meiner Wenigkeit.

    Hacker schrieb:

    Wie niedlich TyRoXx versucht, PI zu dissen 🙄

    Mitläufer



  • TyRoXx schrieb:

    314159265358979 schrieb:

    Netter Versuch. 😃
    Finds voll süß, dass ich nun in deiner Sig bin. Dazu fällt mir folgendes Zitat ein:

    Du hast es geschafft. Du bist zur Identifikationsfigur des Bösens etc. aufgestiegen. Jetzt gehörst du zu einer Reihe von großartigen Leute wie ..., ... und meiner Wenigkeit.

    Hacker schrieb:

    Wie niedlich TyRoXx versucht, PI zu dissen 🙄

    Mitläufer

    Nein, es war nur niedlich, wie du versuchst mit einem so lächerlichen Spruch Aufmerksamkeit zu erregen (naja, erregen würdest du wahrscheinlich sowieso nichts).

    Edit: Haha, ist einfach zu komisch das du es in deine Signatur schreibst. Wieviel unnötiger wirste denn noch?



  • Hacker schrieb:

    Nein, es war nur niedlich, wie du versuchst mit einem so lächerlichen Spruch Aufmerksamkeit zu erregen (naja, erregen würdest du wahrscheinlich sowieso nichts).

    Edit: Haha, ist einfach zu komisch das du es in deine Signatur schreibst. Wieviel unnötiger wirste denn noch?

    Hat doch funktioniert, und dir fällt auch nichts besseres ein.

    Die Signatur hat er sich verdient, nicht nur heute.



  • TyRoXx schrieb:

    Die Signatur hat er sich verdient, nicht nur heute.

    Deine Signatur bestätigt eigentlich nur: Neid ist, wenn man Niveau von unten betrachtet.



  • Da habe ich ja eine Diskussion verursacht... 😞

    Hilft mir jedoch gar nichts. ich bin physiker und nicht informatiker. das ist mein erster versuch in oop (könnte ich eventuell jemanden den Code schicken, der mir den code verbessert mit konkrete Kritiken und Begründung?)

    Noch eine andere Frage zum zweidimensionalen array:

    ich sollte aus einem array 100X100 jeden spin einmal zufällig betrachten. dabei soll jeder spin nur einmal gewählt werden.

    wie mache ich das?
    meine idee wäre die stellen zu nummerieren von 1 bis 10000 und dann wie bei den lottozahlen kontrollieren, ob eine doppelte zahl entdeckt wurde.

    #include <iostream>
    #include <stdlib.h>
    using namespace std;

    int main()
    {
        int lotto[6];
        int i, j;
        bool neueZahl;
    
        srand(0);
        for(i=0; i<6; i++) // ziehe nacheinander sechs Zahlen
        {
            do  // wiederhole die Ziehung, bis die neue Zahl
            {   // nicht mit einer der vorigen identisch ist.
                lotto[i] = rand() % 49 + 1;
                neueZahl = true; // positive Grundeinstellung
                for (j=0; j<i; j++)
                {  // durchlaufe alle bisher gezogenen Kugeln
                    if (lotto[j]==lotto[i])
                    { // Hier wurde ein Doppelter entdeckt
                        neueZahl = false;
                    }
                }
            } while (!neueZahl);
        }
        for (i=0; i<6; i++)
        {
            cout << lotto[i] << " ";
        }
        cout << endl;
    }
    

    (aus willemer, einstieg in c++)

    gibt es da eine andere methode?

    danke
    nijntje



  • Der naechste Thread, der von den Kiddies Pi und Hacker zerstoert wurde. 👎



  • das heisst??

    soll ich einen neuen thread öffnen oder mich nach einem anderen forum umsehen???
    oder kannst du mir da helfen...


Log in to reply