Woher kommt das Type = NoneType?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Hyperion hat geschrieben: Es ist eben nicht wirklich behoben und wo hast Du es benannt?
In irgend einem vorherigem Post, glaub ich zumindest :p
Jedenfalls sieht's jetzt so aus und funktioniert (bisher) einwandfrei:

Code: Alles auswählen

    def loop_begin(self, i):
        """
        This is called when a loop is starting (or not if the field is 0)
        Brainfuck character: [
        """
        if self.array[self.pointer] == 0:
            x = 0
            while i <= (self.code):
                if self.code[i] == "[":
                    x += 1
                elif self.code[i] == "]":
                    x -= 1
                    if x <= 0:
                        return i
                i += 1
        else:
            self.tmp.append(i)
            return i
Die while-Schleife hab ich jetzt drin, weil ich die Funktion nochmal neugeschrieben hab und's diesmal einfach mit while probiert hab, weil ich dann eher von meiner alten Lösung wegkomme und das Problem freier angehen kann. Hat auch geklappt ;)
Hyperion hat geschrieben: Und bei unkorrektem Brainf**ck? (Was uns der Lösung langsam näher führt)
Bei unkorrektem Brainfuck? Tja, da hat derjenige, der kein Brainfuckcode schreiben kann eben pech gehabt ;)
Oder er lässt vorher einfach eine check Syntax Methode drüberlaufen, was ich vielleicht auch noch einbaue.

Hyperion hat geschrieben:hehe ... naja, tus lieber noch weiter hier - auch damit am Ende des Threads etwas brauchbares rauskommt, was Suchende weiterbringt! Also besser noch nicht hier abschalten, sondern noch einmal das eigene "Brain" anstregen, damit der Thread nicht so unbefreidigend offen bleibt ;)
Naja ob das hier überhaupt einem Suchendem weiterhelfen kann? Das ist ein ziemlich spezielles Problem, das sich auf ein Logikproblem zurückführen lässt und deshalb wahrscheinlich auch niemandem weiterhilft ;)
Wenn ihr wollt kann ich natürlich auch die ganze Klasse posten ...

Nochmal sorry, dass ich mich wie ein Idiot benommen hab, ist ja echt peinlich :o[/code]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, ohne jetzt noch einmal auf die einzelnen Sachen einzugehen: Tust Du mir bitte bitte bitte einen Gefallen? Male einmal den Verzweigungsbaum deines Codes auf ein Stück Papier bitte! Und dann Schreib an die Blätter ein return hin, wenn eines im Code drin steht. Danach wirst Du die Lücken feststellen und erkennen, wo Dein Code noch Schwachstellen hat.

@all: Hab mich übrigens mit dem Binärbaum geirrt. Ist natürlich bei Sprachen, die "elif" als Konstrukt haben Unsinn. Aber zumindest muss mindestens ein "else"-Zweig da sein und am Ende eines jeden Zweiges muss ein return stehen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Der Code ist immer noch nicht in Ordnung - dass etwas "funktioniert" ist kein gutes Argument, wenn man nicht weiß warum.

Warum nimmst du (Zeile 8ff) keine Zählschleife?
Möglicherweise braucht es hier überhaupt keine Schleife (aber dazu habe ich mich - und da hast du mal Recht mit einer deiner Äußerungen - zu wenig in Brainfuck bzw. deinen Code hineingedacht), und du kommst mit der count()-Methode von Zeichenketten aus.
Auf jeden Fall: Die Bedingung in der while-Schleife ist unsinnig, weil sie immer True ist: i ist eine Ganzzahl, self.code (warum in Klammern?) eine Zeichenkette. Die Schleife beendet sich nicht, weil die Bedingung irgendwann falsch ist, sondern wenn das abschließende "]" gefunden ist und die Funktion verlassen wird.

Und: Deine Bedingungen im Schleifenkörper sind immer noch so, dass je nach Inhalt von self.code das return gar nicht erreicht wird. Wg. der immer wahren Bedingung erhältst du bei dieser Version dann eine Endlosschleife.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

So, ich hab mir mal ein wenig Mühe gemacht, um zu verdeutlichen, was an Unwägbarkeiten da drin sind im Moment. Die roten Kästen mit "return" zeigen die fehlenden Anweisungen. die roten "else" zeigen fehlende Äste.

Bild

Alles was rot ist, ist da quasi schlecht ;)
(Ich hoffe ich hab im Graf jetzt keine Fehler gemacht)
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Sorry, ich find's wirklich nett von euch, dass ihr mir helfen wollt.
Aber wenn ihr euch so viel Mühe macht, dann schaut euch den Code vielleicht nochmal besser an.
Der Code ist immer noch nicht in Ordnung - dass etwas "funktioniert" ist kein gutes Argument, wenn man nicht weiß warum.
Wo schreib ich, dass ich nicht weiß warum? Ich verstehe meinen Code zu 100%. Zugegebenermaßen, ich hab ihn, als er nicht funktionierte nicht verstanden, da ich nicht wusste, wieso er nicht funktioniert ;)
Ich glaube, ihr versteht ihn nicht ganz, drum erläutere ich ihn mal gleich etwas genauer.
Warum nimmst du (Zeile 8ff) keine Zählschleife?
Möglicherweise braucht es hier überhaupt keine Schleife (aber dazu habe ich mich - und da hast du mal Recht mit einer deiner Äußerungen - zu wenig in Brainfuck bzw. deinen Code hineingedacht), und du kommst mit der count()-Methode von Zeichenketten aus.
Auf jeden Fall: Die Bedingung in der while-Schleife ist unsinnig, weil sie immer True ist: i ist eine Ganzzahl, self.code (warum in Klammern?) eine Zeichenkette. Die Schleife beendet sich nicht, weil die Bedingung irgendwann falsch ist, sondern wenn das abschließende "]" gefunden ist und die Funktion verlassen wird.
Du sagst mir, wie unsinnig mein Code ist, aber vorher sagst du "vielleicht hab ich mich zu wenig hineingedacht"?
Du magst recht damit haben, dass man das auch ohne while-Schleife beziehungsweise mit einer Zählschleife (meinst du damit for?) machen könnte, aber das ist mir erstmal relativ egal. Ich hab die while-Schleife genommen, weil ich vorher die for-Schleife hatte, ich dort aber noch den Bug drin hatte, den ich beseitigen wollte. Also habe ich die gesamte Funktion neugeschrieben und um mich nicht wieder im selben Fehler zu verlieren, die while-Schleife genommen, da ich da gezwungen bin, den Code nochmal ein (bisschen) anders zu schreiben. Ich hab mir gedacht, dass mir das eventuell hilft, um nicht wieder denselben Fehler zu machen.
Dass meine Bedingung in der Schleife unsinnig ist, mag auch sein. Ein True würde es auch tun, sofern die Brainfuck-Syntax korrekt ist. Aber ansonsten hätte ich eine Endlosschleife, das wollte ich auch erstmal vermeiden, bis ich eine Methode zum Überprüfen der Syntax habe.
Warum ich die Klammern um self.Code habe, weiß ich nicht mehr, aber ist ja auch eigentlich egal.
Und: Deine Bedingungen im Schleifenkörper sind immer noch so, dass je nach Inhalt von self.code das return gar nicht erreicht wird. Wg. der immer wahren Bedingung erhältst du bei dieser Version dann eine Endlosschleife.
Habe ich ja gerade oben erklärt ;) Die Schleife ist auch nicht endlos, da die Bedingung nicht immer wahr ist. Ich erhöhe ja schließlich i am Ende?

@Hyperion:
Ich hab schon oft genug wiederholt, dass es keine anderen Möglichkeiten für die Funktion gibt, als ein return auszugeben. Okay ... Am Anfang hat's auch nicht gestimmt, aber das war, weil ich einen Bug im Code hatte, der etwas gemacht hat, was ich nicht wollte.
WIE soll denn bitte bei einem korrektem Brainfuck-Programm (davon gehen wir jetzt mal aus) KEIN Schleifenanfang zu einem Schleifenende gehören können?
Der Code macht nur folgendes: Falls das Feld == 0 ist, ignoriere die Schleife -> Suche dazu das passende Ende und springe dorthin, laufe anschließend einfach vom Ende aus weiter.
Da gibt es kein else oder sonst irgendwas.
Ich versteh auch nicht, warum zu jedem if ein return gehören soll. DAS ist doch gerade der Sinn: Wenn dies und das der Fall ist, tue dies und das und dreh noch ne Runde in der Schleife! Was soll da ein return? Das würde doch das Programm direkt beenden ohne dass die Schleife ein zweites Mal durchgelaufen ist. Außer ich habe einen else-Zweig, wenn der aber auch noch n return hat, dann überlebt die Schleife echt keine Runde.

Hier hab ich nochmal ein Beispiel dafür, dass der Code funktioniert:

Code: Alles auswählen

x = Brainfuck()
x.code = ",>++++>+<<[>-<-]>[>-<[-]]>[>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[-]]"
x.run()
x.reset()
x.code = ",->,>+>>+<<<[>>>[<<<<+>>>>-]<<[-]<<[>>+<<-[>>>>+<<<<-]]>-]>[++++++.[-]]"
x.run()
x.reset()
x.code = """"->+>+++>>+>++>+>+++>>+>++>>>+>+>+>++>+>>>>
+++>+>>++>+>+++>>++>++>>+>>+>++>++>+>>>>+++
>+>>>>++>++>>>>+>>++>+>+++>>>++>>++++++>>+>>
++>+>>>>+++>>+++++>>+>+++>>>++>>++>>+>>++>+>
+++>>>++>>+++++++++++++>>+>>++>+>+++>+>+++>>>
++>>++++>>+>>++>+>>>>+++>>+++++>>>>++>>>>+>+>
++>>+++>+>>>>+++>+>>>>+++>+>>>>+++>>++>++>+>
+++>+>++>++>>>>>>++>+>+++>>>>>+++>>>++>+>+++>
+>+>++>>>>>>++>>>+>>>++>+>>>>+++>+>>>+>>++>+>
++++++++++++++++++>>>>+>+>>>+>>++>+>+++>>>++>
>++++++++>>+>>++>+>>>>+++>>++++++>>>+>++>>+++
>+>+>++>+>+++>>>>>+++>>>+>+>>++>+>+++>>>++>>+
+++++++>>+>>++>+>>>>+++>>++++>>+>+++>>>>>>++>
+>+++>>+>++>>>>+>+>++>+>>>>+++>>+++>>>+[[->>+
<<]<+]+++++[->+++++++++<]>.[+]>>[<<+++++++
[->+++++++++<]>-.------------------->-[-<.<+>>]<[+]<+>>>]
<<<[-[-[-[>>+<++++++[->+++++<]]>++++++++++++++<]>+++
<]++++++[->+++++++<]>+<<<-[->>>++<<<]>[->>.<<]<<]"""
x.run()
Ausgabe:

Code: Alles auswählen

>>> ================================ RESTART ================================
>>> 
4                  # Input zum 1.
T                  # Output zum 1.
23                # Input zum 2.
12                # Input zum 2.
                    # Output zum 2. unten drunter folgt die 3. Ausgabe
->+>+++>>+>++>+>+++>>+>++>>>+>+>+>++>+>>>>+++
>+>>++>+>+++>>++>++>>+>>+>++>++>+>>>>+++>+>>>
>++>++>>>>+>>++>+>+++>>>++>>++++++>>+>>++>+>>
>>+++>>+++++>>+>+++>>>++>>++>>+>>++>+>+++>>>+
+>>+++++++++++++>>+>>++>+>+++>+>+++>>>++>>+++
+>>+>>++>+>>>>+++>>+++++>>>>++>>>>+>+>++>>+++
>+>>>>+++>+>>>>+++>+>>>>+++>>++>++>+>+++>+>++
>++>>>>>>++>+>+++>>>>>+++>>>++>+>+++>+>+>++>>
>>>>++>>>+>>>++>+>>>>+++>+>>>+>>++>+>++++++++
++++++++++>>>>+>+>>>+>>++>+>+++>>>++>>+++++++
+>>+>>++>+>>>>+++>>++++++>>>+>++>>+++>+>+>++>
+>+++>>>>>+++>>>+>+>>++>+>+++>>>++>>++++++++>
>+>>++>+>>>>+++>>++++>>+>+++>>>>>>++>+>+++>>+
>++>>>>+>+>++>+>>>>+++>>+++>>>+[[->>+<<]<+]+++++
[->+++++++++<]>.[+]>>[<<+++++++[->+++++++++
<]>-.------------------->-[-<.<+>>]<[+]<+>>>]<<<[-[-[-[>>+
<++++++[->+++++<]]>++++++++++++++<]>+++<]++++++
[->+++++++<]>+<<<-[->>>++<<<]>[->>.<<]<<]
>>> 
Klar ist das kein Beweis.
Aber imho ist das Programm auch nicht so kompliziert, dass man das mit irgendwelchen besonderen Methoden beweisen müsste.

Edit: Bei der Ausgabe des 2. Brainfuck-Codes wird irgendein Zeichen ausgegeben, das hier nicht dargestellt werden kann, aber es kommt trotzdem eine, was ja auch schon die Leerzeile beweist.

Edit (Georg): BF-Code umbrochen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Karl hat geschrieben:
Der Code ist immer noch nicht in Ordnung - dass etwas "funktioniert" ist kein gutes Argument, wenn man nicht weiß warum.
Wo schreib ich, dass ich nicht weiß warum? Ich verstehe meinen Code zu 100%.
Nein, du verstehst ihn eben nicht, und zwar immer noch nicht, wie die nachfolgenden Ausführungen zeigen!
Karl hat geschrieben:Du sagst mir, wie unsinnig mein Code ist, aber vorher sagst du "vielleicht hab ich mich zu wenig hineingedacht"?
Du liest nicht richtig! Das bezog sich nur auf die Idee mit dem count(). Was die Schleife angeht, so braucht man sich da nicht in irgendetwas groß hinzudenken, weil die Bedingung einfach unsinnig ist. Das habe ich dir erklärt und in dem, was du nachfolgend noch äußerst, zeigst du deutlich, dass du es immer noch nicht verstanden hast.
Karl hat geschrieben:Dass meine Bedingung in der Schleife unsinnig ist, mag auch sein. Ein True würde es auch tun, sofern die Brainfuck-Syntax korrekt ist. Aber ansonsten hätte ich eine Endlosschleife, das wollte ich auch erstmal vermeiden, bis ich eine Methode zum Überprüfen der Syntax habe.

Habe ich ja gerade oben erklärt ;) Die Schleife ist auch nicht endlos, da die Bedingung nicht immer wahr ist. Ich erhöhe ja schließlich i am Ende?
Du HAST eine Endlosschleife mit deiner Bedingung. Das habe ich dir oben erklärt. Du hast es nicht begriffen. Ich für meinen Teil klinke mich jetzt aus ...
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

pütone hat geschrieben:
Karl hat geschrieben:
Der Code ist immer noch nicht in Ordnung - dass etwas "funktioniert" ist kein gutes Argument, wenn man nicht weiß warum.
Wo schreib ich, dass ich nicht weiß warum? Ich verstehe meinen Code zu 100%.
Nein, du verstehst ihn eben nicht, und zwar immer noch nicht, wie die nachfolgenden Ausführungen zeigen!
Karl hat geschrieben:Du sagst mir, wie unsinnig mein Code ist, aber vorher sagst du "vielleicht hab ich mich zu wenig hineingedacht"?
Du liest nicht richtig! Das bezog sich nur auf die Idee mit dem count(). Was die Schleife angeht, so braucht man sich da nicht in irgendetwas groß hinzudenken, weil die Bedingung einfach unsinnig ist. Das habe ich dir erklärt und in dem, was du nachfolgend noch äußerst, zeigst du deutlich, dass du es immer noch nicht verstanden hast.
Karl hat geschrieben:Dass meine Bedingung in der Schleife unsinnig ist, mag auch sein. Ein True würde es auch tun, sofern die Brainfuck-Syntax korrekt ist. Aber ansonsten hätte ich eine Endlosschleife, das wollte ich auch erstmal vermeiden, bis ich eine Methode zum Überprüfen der Syntax habe.

Habe ich ja gerade oben erklärt ;) Die Schleife ist auch nicht endlos, da die Bedingung nicht immer wahr ist. Ich erhöhe ja schließlich i am Ende?
Du HAST eine Endlosschleife mit deiner Bedingung. Das habe ich dir oben erklärt. Du hast es nicht begriffen. Ich für meinen Teil klinke mich jetzt aus ...
Oh, sorry.
JETZT seh ich's auch.
Daher auch die Klammern.
Da stand glaub ich ursprünglich mal ein len().
So steht es auch in der ersten Fassung, die ich hier geschrieben habe:

Code: Alles auswählen

for i in xrange(len(self.code)): 
(auf der 1. Seite)
Ich hab das gerade total verpeilt, dass das nicht len(self.code) ist.
Okay, dann hast du eben doch recht.
Aber in fact ist das trotzdem egal, da die Schleife niemals endlos sein wird, außer der Brainfuck Code ist falsch.
Okay, ich geb zu, das lässt mich gerade etwas dumm dastehen, dass ich dir im Bezug auf die Bedingung widersprochen habe, aber ich hatte echt len(self.code) im Kopf.
Naja ...
Der Ton wird irgendwie wieder zu feindselig, finde ich ...
Das muss ja eigentlich nicht sein. Und nein, ich weise jetzt nicht dir die Schuld zu sondern auch mir.
Wir reden hier alle die ganze Zeit aneinander vorbei, habe ich das Gefühl.
Ich bin jedenfalls davon überzeugt, dass mein Code funktioniert, auch wenn er hier und da vielleicht den einen oder anderen "Schönheitsfehler" hat, wie eben diese Bedingung.
Wir können das Thema auch hier beenden wenn ihr wollt ...
Soll jetzt keine Aufforderung sein, ihr könnt natürlich auch gerne noch weiter schreiben.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Naja, auf jeden Fall solltest Du Deine Annahme "es kommt korrekter BF-Code" überdenken - ich persönlich freue mich über jeden Compiler / Interpreter, der mich darauf hinweist, dass ich Mist geschrieben habe. Endet so etwas schlimmsten Falles in einer Endlosschleife wirds noch heftiger, weil ich dann quasi gar keine Chance mehr habe etwas an Debug-Info aus dem Interpreter zu ziehen.
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Hyperion hat geschrieben:Naja, auf jeden Fall solltest Du Deine Annahme "es kommt korrekter BF-Code" überdenken - ich persönlich freue mich über jeden Compiler / Interpreter, der mich darauf hinweist, dass ich Mist geschrieben habe. Endet so etwas schlimmsten Falles in einer Endlosschleife wirds noch heftiger, weil ich dann quasi gar keine Chance mehr habe etwas an Debug-Info aus dem Interpreter zu ziehen.
Deshalb gibt's doch OOP ;)
def checksyntax blablubb und fertig :)
Aber finde ich jetzt gut, dass mir mal jemand glaubt, was die Funktionsfähigkeit des Programms angeht :p
Antworten