Abfrage von Array: Wieso ergibt es 'False'?

Heyho!

Ich habe folgenden Programmcode:

(Einbindung der Bibliotheken etc.)

typedef int wuerfelstellung[24];

(Ein Auszug (!) aus Class Wuerfel, der Konstruktor:smile:

class Wuerfel {
public:
 wuerfelstellung temp;

 Wuerfel() {
 wuerfelstellung temp = {2,2,2,2,4,4,4,4,3,3,3,3,5,5,5,5,6,6,6,6,1,1,1,1};
 //scramble();
 }
}

Wie ihr seht, wird hier nur die Wuerfelstellung belegt, das Scramblen habe ich ja bewusst auskommentiert. So, nun habe ich zum Prüfen einfach einmal eine einfache Main-Routine geschrieben:

int main()
{
 Wuerfel wuerfel;
 bool ja = wuerfel.geloest();
 if(ja)
 {
 coutin\_avail()); cin.get();
}

(So. Nun kommt noch Wuerfel::geloest():smile:

bool Wuerfel::geloest()
{
 if((temp[0]==2) && (temp[1]==2) && (temp[2]==2) && (temp[3]==2)
 && (temp[4]==4) && (temp[5]==4) && (temp[6]==4) && (temp[7]==4)
 && (temp[8]==3) && (temp[9]==3) && (temp[10]==3) && (temp[11]==3)
 && (temp[12]==5) && (temp[13]==5) && (temp[14]==5) && (temp[15]==5)
 && (temp[16]==6) && (temp[17]==6) && (temp[18]==6) && (temp[19]==6)
 && (temp[20]==1) && (temp[21]==1) && (temp[22]==1) && (temp[23]==1))
 {
 return true;
 }
 else
 {
 return false;
 }
}

Das war soweit der relevante Quelltext. Wieso wird mir in Main() „Neeeeeein“ ausgegeben? Ich verändere ‚Temp‘ doch garnicht, und die Abfrage sollte doch genau bei dieser Stellung der Zahlen ein ‚True‘ zurückgeben.

hintergrund ist, dass ich mit meinem Rubik’s Cube Programm testen will, wann der Würfel fertig ist, dafür ist diese Funktion zuständig. Nur leider funktioniert sie nicht, könnt ihr mir sagen, warum??

Liebe Grüße & Dank
Shisu

class Wuerfel {
public:
wuerfelstellung temp;

Wuerfel() {
wuerfelstellung temp =
{2,2,2,2,4,4,4,4,3,3,3,3,5,5,5,5,6,6,6,6,1,1,1,1};
//scramble();
}
}

Das war soweit der relevante Quelltext. Wieso wird mir in
Main() „Neeeeeein“ ausgegeben?

Weil Du im Konstruktor eine lokale Variable „temp“ deklarierst und initialisiert, deren Scope die Klasseneigenschaft „temp“ überdeckt.

Gruß,
LC

Hallo!

Ich freue mich schon über deine antwort, jedoch verstehe ich im Prinzip kein Wort. Werde ich dazu gezwungen sein, mir diese Begriffe einen nach dem anderen zu entschlüsseln, oder kannst du mir sagen, wie ich den Fehler beheben kann? Ich weiß nicht, was ‚Scope‘ heißt, ebenso habe ich im Moment keine Ahnung, wie ich das Problem lösen soll.

Liebe Grüße
Shisu

Hallo Shisu,

1: class Wuerfel {
2: public:
3: wuerfelstellung temp;
4:
5: Wuerfel() {
6: wuerfelstellung temp = {2,2,2,2,4,4,4,4,3,3,3,3,5,5,5,5,6,6,6,6,1,1,1,1};
8: //scramble();
9: }
10:}

In Zeile 3 erzeugst du temp.
In Zeil6 6 erzeugst du nochmals eine Variable temp.
Dies ist in C/C++ zulässig.
Der Compiler übersetzt nun folgendes:

1: class Wuerfel {
2: public:
3: wuerfelstellung temp1;
4:
5: Wuerfel() {
6: wuerfelstellung temp2 = {2,2,2,2,4,4,4,4,3,3,3,3,5,5,5,5,6,6,6,6,1,1,1,1};
8: //scramble();
9: }
10:}

temp2 ist ein lokale Variable welche nur zwischen Zeile 6 bis Zeile 9 existiert. Nach Ausführung von Zeile 9 verschwindet temp2 im Datennirvana.
Zwischen Zeile 9 und 10 gilt wieder temp = temp1.

MfG Peter(TOO)

Hallo!

Ja, toll, das Problem sehe ich nun auch. Wenn ich das ‚Würfelstellung‘ wegnehme, wird der Befehl

temp = {2,2,2,2,4,4,4,4,3,3,3,3,5,5,5,5,6,6,6,6,1,1,1,1};

Aber ungültig, wieso? Kann ich so kein Array befüllen? Oder wo liegt das Problem…?
Oder gibt es noch andere Lösungen, wie ich diese ‚doppelte Variable‘ wegbekomme?? Helft mir bitte…

Liebe Grüße
Shisu

Hallo Shisu

Oder gibt es noch andere Lösungen, wie ich diese ‚doppelte
Variable‘ wegbekomme?? Helft mir bitte…

Klar gibt es die. Einmal geht es so, dann bleiben die Werte in „temp“ erhalten:

// besser so:
typedef int wuerfelstellung;

class Wuerfel {
public:
 wuerfelstellung temp[24];

 Wuerfel() {
 wuerfelstellung temp2[24] = {2,2,2,2,4,4,4,4,3,3,3,3,5,5,5,5,6,6,6,6,1,1,1,1};
 // einzeln rüberkopieren:
 for (int i=0; i 
Noch einfacher geht es "quick and dirty":



    
    namespace {
     wuerfelstellung[24] temp = {2,2,2,2,4,4,4,4,3,3,3,3,5,5,5,5,6,6,6,6,1,1,1,1};
    };
    
    class Wuerfel {
    public:
     // hier gar nichts mehr noetig
     Wuerfel() {}
    }



Der anonyme namespace ist praktisch "private", da nur dieses eine Modul darauf zugreifen kann.

Gruesse an alle
lG
Martin B

Huhu!

Dankesehr! Habe erstmal mein halbes Programm umgeschrieben, da ich nicht weiß, wie ich ‚Gleichen‘, dem zwei Würfelstellungen übergeben wurden, wieder zum laufen bringe. Drum habe ich diesen Teil, also:

void Wuerfel::gleichen(wuerfelstellung a, wuerfelstellung b)
{
 for(int i=0;i

...zwangsweise rausgelassen. Gibts eine Alternative, wie ich gleichen beibehalten kann? Jede mir erdenkliche Möglichkeit, weiterhin zwei Würfelstellungen zu übergeben, endet in einem Chaos.

Das Programm läuft im Moment, ergo sind es schonmal mehr als 360.000 Züge ^,^

Liebe Grüße und hoffe auf letzte Antwort bzgl. Übergabe der Würfelstellungen,
Shisu

Hallo Shisu

Dankesehr! Habe erstmal mein halbes Programm umgeschrieben, da
ich nicht weiß, wie ich ‚Gleichen‘, dem zwei Würfelstellungen
übergeben wurden, wieder zum laufen bringe.

Gibts eine Alternative, wie ich
gleichen beibehalten kann?

Das ist nun mehr ein logisches Problem als ein syntaktisches. Ich kenne weder den Rubik’s Cube, noch weiss ich, was du mit „Gleichen“ bezweckst. Kannst du das genauer beschreiben, um was es Dir geht?

Jede mir erdenkliche Möglichkeit,
weiterhin zwei Würfelstellungen zu übergeben, endet in einem
Chaos.

„zwei“ heisst „6 * 6 Möglichkeiten“, warum dann ein Array mit 24?

lG
Martin B

Hallo Shisu

Das ist nun mehr ein logisches Problem als ein syntaktisches.
Ich kenne weder den Rubik’s Cube, noch weiss ich, was du mit
„Gleichen“ bezweckst. Kannst du das genauer beschreiben, um
was es Dir geht?

Also, wie du hier siehst, ist ein Rubik’s Cube ein Würfel, andem man eben verschiedene Seiten drehen kann, ich bezweifle, dass du ihn wirklich nicht kennst:
http://www.amansis.de/pic/zauberwuerfel/Rubik_cube.jpg

Die Funktion gleichen bekommt zwei ‚Würfelstellungen‘, also zwei Arrays mit 24 Inhalten übergeben und gleich das erste dem zweiten übergebenen an. Ich will einfach nicht an jeder erdenklichen Stelle diese Schleife aufrfen, sondern es in eine neue Funktion auslagern. Wie kann ich das tun? Er bringt mir nur Fehler bei etwas wie:

void gleichen(wuerfelstellung a, wuerfelstellung b)
{
 //....
}

Jedenfalls kann ich so keine Wuerfelstellungen übergeben lassen.

„zwei“ heisst „6 * 6 Möglichkeiten“, warum dann ein Array mit
24?

lG
Martin B

Das 24-stellige Array ist ganz einfach zu erklären: Es ist ein 2x2x2 Würfel, also sind es weniger Steine, als oben im Bild. Und dabei hat jede Seite 4 Einzelne Facetten, das mal 6 Seiten ergibt die 24. Ich habe mir einen Würfel ‚vorgestellt‘ und die einzelnan Flächen durchnummeriert, von 0 bis 23, und die Stelle im Array gibt an, wo die Facette liegt, die Zahl an der Stelle gibt an, wie sie gefärbt ist.

Ich wusste mein Problemchen nicht anders zu lösen, also habe ich es so gemacht und auch die Drehungen (Oben, Unten, etc.) darauf abgestimmt. Weißt du, wie ich es einfacher hinbekomme?? Also das Speichern o.ä. …

LG & thx für die antwort
Shisu