Auf meinem WindowsXP System mit Python 2.5 kommt, wenn ich es direkt hintereinander ausführe immer die selbe Zahl raus. Es macht auch nichts wenn ich dazwischen viele Prozesse starte und Speicher beleg. Gerade hab ichs dann einfach nochmal probiert und es kam wieder ne neue Zahl.
Wäre mal interessant zu erfahren nach welchen System den Prozessen Speicher zugewiesen wird.
HILFE!! Hausaufgabe/ zahlenrate programm!!
Code: Alles auswählen
new_positions = {}
for member in self.members:
position_to_check = member.position
try:
*snip*
new_positions[id(member)] = new_position
# Important checks that may lead to abort
for member in self.members:
new_position = new_positions[id(member)]
`id()` liefert einfach eine Zahl, die eine Art Identität eines Objektes darstellen soll. Dass das die Speicheradresse ist, das ist lediglich ein Implementationsdetail.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
@str1442: Hast Du bei den `member`-Objekten `__cmp__()` implementiert oder oder eine der "rich comparison"-Methoden?
Speicherbelegung bei vielfachen von 2, 4, oder 16 passiert aus Optimierungsgründen. Viele Architekturen greifen langsamer auf Werte zu, wenn sie nicht an solchen Grenzen ausgerichtet sind. Einige SIMD-Maschinenbefehle auf x86-Prozessoren funktionieren nur mit Daten, die an 16-Byte-Grenzen ausgerichtet sind. Das `malloc()` aus der GNU Standardbibliothek liefert auf x86-Architekturen AFAIK auch immer nur Zeiger, die auf 16-Byte-Grenzen ausgerichtet sind.
Speicherbelegung bei vielfachen von 2, 4, oder 16 passiert aus Optimierungsgründen. Viele Architekturen greifen langsamer auf Werte zu, wenn sie nicht an solchen Grenzen ausgerichtet sind. Einige SIMD-Maschinenbefehle auf x86-Prozessoren funktionieren nur mit Daten, die an 16-Byte-Grenzen ausgerichtet sind. Das `malloc()` aus der GNU Standardbibliothek liefert auf x86-Architekturen AFAIK auch immer nur Zeiger, die auf 16-Byte-Grenzen ausgerichtet sind.
Nein. In der Doku hab ich unter __cmp__ grade nur gesehen, daß bei Nichtvorhandensein dieser Magischen Methoden über die Objekt Identität (also wohl mittels id()) eine Gleichheit zwischen Objekten definiert wird. Aber ich sehe nicht worauf du hinaus willst?Hast Du bei den `member`-Objekten `__cmp__()` implementiert oder oder eine der "rich comparison"-Methoden?
Danke für die Info! Aber wenn es sowieso meist virtueller Speicher ist, so wäre es doch quatsch nur jedes zweite virtuelle Byte zu benutzen, das widerspricht ja dann dem (vorhin nachgelesenem ^_^) Konzept von virtuellem Speicher, dem Programm einen ganzen "virtuellen" Block mit Speicher zu geben.
@jonas: Naja er hat auf seine Mutter geschworen jeden Tag hier mitzulesen ...
@str1442: Wenn Du an `__cmp__()` und `__hash__()` nichts änderst, dann bezieht sich beides auf die Objektidentität, d.h. Du kannst die Objekte selbst statt des `id()`-Ergebnisses verwenden. Also:
Es wird ja nicht nur jedes zweite Byte benutzt, sondern nur die Anfänge von Werten die mehr als ein Byte belegen auf solchen Grenzen ausgerichtet. Technisch steckt dahinter, dass nicht einzelne Bytes adressiert werden, sondern grössere Einheiten. Und wenn ein Datenwort über solche Grenzen geht, müssen zwei Zugriffe gemacht werden. Die SIMD-Befehle, die Daten auf 16-Bytegrenzen erwarten, verarbeiten auch 16 Bytes auf einen Schlag.
Code: Alles auswählen
new_positions[member] = new_position
Ich hab' jetzt nicht genau nachgeschaut ob schon eine vorliegt, aber sonst eine weitere Prolog-Lösung:
Code: Alles auswählen
zahl :- write('Ich habe eine Zahl zwischen 1 und 100.\n'), R is random(100)+1, raten(R).
raten(R) :- write('Rate: '), read(X), write('\n'), evaluate(R,X).
evaluate(R,X) :- R==X, write('Richtig\n'); (X<R, T='Zu klein\n'; T='Zu gross\n'), write(T), raten(R).
Ja, gut, sofern man nichts an __cmp__, __hash__ oder den Rich Comparison Methoden ändert ist das Objekt als "immutable" einzustufen. Insofern benutze ich inzwischen solche einfachen Objekte auch direkt in Dictionaries als Keys, nur habe ich es in Tetrix0r nicht getan, und auch nicht dran gedacht, daß das möglich wäre. Da ich Tetrx0r bereits begonnen habe, als ich anfänglich Python gelernt habe, sieht der Quellcode sowieso an allen Ecken und Enden entsprechend aus, und es gäbe vieles, was ich inzwischen verbessern könnte, aber ich werde das Projekt wahrscheinlich ruhen lassen. Dennoch ist sowas eine mögliche Verwendung von id(), auch für "Mutable" Objekte, da man mit id() explizit nach Identität als nach Wert eine Dict Zuordnung aufbauen kann.Du kannst die Objekte selbst statt des `id()`-Ergebnisses verwenden.
Wie konnten nur Applescript vergessen werden.
Code: Alles auswählen
set zufallsZahl to random number from 1 to 100
set zahlErraten to false
repeat until zahlErraten is true
set temp to display dialog "Eine Zahl zwischen 1 und 100. Rate: " default answer ""
set eingabe to text returned of temp
set x to eingabe as number
if x is equal to zufallsZahl then
display dialog "richtig" buttons {"OK"}
set zahlErraten to true
else if x ist less than zufallsZahl then
display dialog "zu klein" buttons {"OK"}
else
display dialog "zu gross" buttons {"OK"}
end if
end repeat
Schade, daß Dein Code so mies kommentiert ist.HWK hat geschrieben:So, ich habe mich einmal gequält: Hier befindet sich eine Version in 16-Bit-X86-Assembler. Turbo-Assembler erzeugt hieraus eine COM-Datei (d.h. für DOS) mit einer Länge von 281 Bytes. Wer keinen Assembler installiert hat, kann die fertige COM-Datei mit diesem Python-Script erstellen.
MfG
HWK