Array by referenz/value!?

hallo!

folgendes macht mir gerade kopfzerbrechen:
ich habe ein
int puzzel[9]
das, wie der name schon sagt, ein 9erpuzzel darstellen soll. also eine 3x3 „matrix“ mit den zahlen 1-8 und einer leerstelle und es geht dadrum, dieses puzzel zu sortieren (also dass das array in reihenfolge {1,2,3,4,5,6,7,8,0} darstellt).
dafür lass ich mir per funktion immer die folgearrays (also mit vertauschten zahlen 0 und x) generieren und zurückgeben.

und hier hakt es anscheinend. denn man kann ja arrays nicht einfach kopieren. so sieht das dann etwa aus:

int i,j;
int help[9];
for (i=0; i
und je nach "j" möchte ich dann die nächsten arraykonstellationen generieren. aber es gibt da glaub ich probleme, wenn ich einfach sage:


    
    if (j==0)
    {
     help[0]=help[1];
     help[1]=0;
     ret.push\_back(new testNode(help)); // geht in einen vector
     help[0]=help[3];
     help[3]=0;
     ret.push\_back(new testNode(help));
    }


irgendwie hat das mit übergabe by referenz bzw. value zu tun, dass die alten werte "überschrieben" werden.
wie kann ich das verhindern? also wie kann ich sozusagen jedesmal auf "einfache weise" ein völlig neues array initzialisieren? ich hab es schon mit mehrfachen arrays [4][9] versucht, aber tut auch nicht so, wie ich will. bei meinem testarray sollte nämlich eigentlich keine lösung zu finden sein (laut meinen prof), aber ich finde was...

jemand ideen und/oder anregungen?

grüßle
Geisterkarle

Hiho

irgendwie hat das mit übergabe by referenz bzw. value zu tun,
dass die alten werte „überschrieben“ werden.

Naja, in den Vektor setzte du ja nur die Adresse des Arrays rein, d.h. die
Standardcontainer arbeiten auch nur mit den Adressen (also die haben keine
Ahnung von Arrays, kopieren sie also nicht per Wert).

wie kann ich das verhindern? also wie kann ich sozusagen
jedesmal auf „einfache weise“ ein völlig neues array
initzialisieren?

Hehe, viele Möglichkeiten, vielleicht überlegst du mal, ob du nicht einfach
überall die Standardcontainer verwendest (da du ja schon bei C++ bist :wink:
*hint* *hint*.

Und: die Klasse testNode könntest du ja genauso für das Kopieren
zuständig machen (also dann im Konstruktor, wo du das Array übergibst).

Also den zweiten Teil da vielleicht so (ich mach mal low-level):

/\* ... \*/
 help[1] = 0;
 int\* tmp = new int[9]; /\* wird jedesmal aus neuem speicher konstruiert \*/
 for (i = 0; i 
Anmerkung: nicht drauf vertrauen, das der angelegte Speicherbereich mit 0
gefüllt ist, also immer mit definierten Werten füllen.

So, hoffe das hilft weiter (ach ja, c++-syntax sucks, jedenfalls bei dem Array
da oben).

mfg TLF

Oh und noch ein Corvus Corax (und andere)-Fan - Ergo bibamus :wink:
mfg TLF

Hallo

das, wie der name schon sagt, ein 9erpuzzel darstellen soll.
also eine 3x3 „matrix“ mit den zahlen 1-8 und einer leerstelle
und es geht dadrum, dieses puzzel zu sortieren (also dass das
array in reihenfolge {1,2,3,4,5,6,7,8,0} darstellt).
dafür lass ich mir per funktion immer die folgearrays (also
mit vertauschten zahlen 0 und x) generieren und zurückgeben.
und hier hakt es anscheinend. denn man kann ja arrays nicht
einfach kopieren. so sieht das dann etwa aus:

Du solltest einfach mal klar und verständlich be-
schreiben, was Du wirklich *genau* machen *sollst*.
Danach könntest Du anfügen, was Du unter einer solchen
Aufgabe *verstehst* oder zu glauben verstehst.

Wieso kommen einmal reine C Konstrukte vor und
ein andermal plötzlich C++ Elemente aus dem
nichts?

Grüße

CMБ

Du solltest einfach mal klar und verständlich be-
schreiben, was Du wirklich *genau* machen *sollst*.
Danach könntest Du anfügen, was Du unter einer solchen
Aufgabe *verstehst* oder zu glauben verstehst.

eigentlich hab ich das problem gelöst, denn der fehler lag woanders (debuggen ist doch irgendwie hilfreich *g*). aber falls interesse besteht:

im prinzip muss ich ein schiebepuzzel lösen. also eine 3x3 matrix, ich versuch das mal hier zu „zeichnen“:

-------------
| 1 | 2 | 3 |
-------------
| 4 | 5 | 6 |
-------------
| 7 | 8 | |
-------------

also das soll das ergebnis sein. allerdings ist es am anfang falsch und man muss die „plättchen“ (also die einzelnen zahlen) über das leerfeld schieben. könnte z.b. so aussehen:

-------------
| 5 | 1 | 7 |
-------------
| 2 | 8 | 3 |
-------------
| | 6 | 4 |
-------------

das ganze mach ich für ein praktikum, und ich muss das auf eine spezielle weise lösen. dafür lasse ich mir bei jedem „schleifendurchlauf“ auf einen priority_queue (nach der manhattendistanz sortiert) die möglichen neuen konstellationen (also verschiebungen) abspeichern. letzendlcih wird halt möglichst das endergebnis gefunden (teilweise scheint es nicht zu gehen)

Wieso kommen einmal reine C Konstrukte vor und
ein andermal plötzlich C++ Elemente aus dem
nichts?

ich hab jetzt keine ahnung, was jetzt „reine“ c-konstrukte sind und was c++; also ich programmier das objektorientiert in c++. das dort halt viel „normales“ c angewendet wird ist vielleicht nicht sonderlich verwunderlich. wüsste jetzt auch nichts, was in C funktioniert und in C++ nicht…

Grüße

CMБ

grüßle
Geisterkarle

Hallo geisterkarle,

im prinzip muss ich ein schiebepuzzel lösen. also eine 3x3
matrix, ich versuch das mal hier zu „zeichnen“:

also das soll das ergebnis sein. allerdings ist es am anfang
falsch und man muss die „plättchen“ (also die einzelnen
zahlen) über das leerfeld schieben. könnte z.b. so aussehen:

das ganze mach ich für ein praktikum, und ich muss das auf
eine spezielle weise lösen. dafür lasse ich mir bei jedem
„schleifendurchlauf“ auf einen priority_queue (nach der
manhattendistanz sortiert) die möglichen neuen konstellationen
(also verschiebungen) abspeichern. letzendlcih wird halt
möglichst das endergebnis gefunden (teilweise scheint es nicht
zu gehen)

Ah! Sehr schöne Beschreibung. Leider hast Du
schon alles hinbekommen, da hätte man nämlich
gerne mitgeholfen :wink:

Wieso kommen einmal reine C Konstrukte vor und
ein andermal plötzlich C++ Elemente aus dem
nichts?

ich hab jetzt keine ahnung, was jetzt „reine“ c-konstrukte
sind und was c++; also ich programmier das objektorientiert in
c++. das dort halt viel „normales“ c angewendet wird ist
vielleicht nicht sonderlich verwunderlich. wüsste jetzt auch
nichts, was in C funktioniert und in C++ nicht…

Du hattest zwei Codeblöcke gepostet, einer war reines
C und einer enthielt stdc+±Elemente, aber ohne jeden
Hinweis, was womit zu tun hat.

Übrigens, wenn Du zwei normale Integer-Feldelemente (i,j)
innerhalb eines ‚Sequenzpunktes‘ vertauschen möchtest,
geht das mit:

 feld[i]^=feld[j]^=feld[i]^=feld[j];

Grüße

CMБ

Hallo geisterkarle,
Ah! Sehr schöne Beschreibung. Leider hast Du
schon alles hinbekommen, da hätte man nämlich
gerne mitgeholfen :wink:

also falls du interesse hast!? :smile:
das jetzt hier war die realisierung der bestensuche
http://kik.informatik.fh-dortmund.de/visual/kurs_bes…

als nächstes muss ich die a*-suche implementieren. wenn du da ideen hast, immer her :wink:
http://kik.informatik.fh-dortmund.de/visual/kurs_ast…

Übrigens, wenn Du zwei normale Integer-Feldelemente (i,j)
innerhalb eines ‚Sequenzpunktes‘ vertauschen möchtest,
geht das mit:

feld[i]^=feld[j]^=feld[i]^=feld[j];

ah, das hab ich schonmal gesehen und fand es sehr geil! so manche programmiercodes sind einfach genial!
manchmal sind sie auch nur „evil“

int getmessage (int c) 
{ 
return (!(c&~3))["(c&3)"]&c&3; 
}

na, was macht die funktion?? :smile: (so zur zwischendurchunterhaltung)

CMБ

grüßle
Geisterkarle

Hallo

int getmessage (int c)
{
return (!(c&~3))["(c&3)"]&c&3;
}

na, was macht die funktion?? :smile: (so zur
zwischendurchunterhaltung)

 !(c&~3) 
 ~3 =\> bitweises Komplement von 3 zu unsigned
 c&~3 =\> \> 0, wenn c \> 3, sonst 0
 !(c&~3) =\> 0, wenn c \> 3, sonst 1

!(c&~3) ist also 0 oder 1

"(c&3)"
 ein string mit '(' =\> 010-1000 und 'c' =\> 110-0011

(!(c&~3))["(c&3)"]
 identisch zu "(c&3)"[(!(c&~3))], im o.g. Kontext
 also '(' oder 'c'

 Bei Zahl größer 3: "(c&3)"[0] =\> '(' =\> 010-1000
 Bei Zahl 1,2,3: "(c&3)"[1] =\> 'c' =\> 110-0011

 ... & c & 3
 Die 3 maskiert alle Bits ausser eben den Letzten,
 angewendet auf 110-0011 oder 010-1000, 

Es kommt also 1,2,3 raus (wenn c im Bereich liegt),
ansonsten 0.

Richtig geraten?

Grüße

CMБ

Hallo.

Übrigens, wenn Du zwei normale Integer-Feldelemente (i,j)
innerhalb eines ‚Sequenzpunktes‘ vertauschen möchtest,
geht das mit

feld[i]^=feld[j]^=feld[i]^=feld[j];

Bevor noch jemand auf die Idee kommt, das so zu machen:
Das muss nicht funktionieren, das Verhalten dieses Programmcodes ist unspezifiziert und compilerabhängig. Genaugenommen kann sogar ein- und derselbe Compiler unterschiedliche Ergebnisse dafür liefern. Eben weil kein Sequenzpunkt dazwischen liegt. Siehe auch hier:
http://c-faq.com/expr/xorswapexpr.html

Sebastian.