Problem mit der Abfolge von Funktionen
Castorp
- javascript
0 Der Martin0 Castorp
0 Der Martin0 Castorp
0 JürgenB
Hallo,
schon recht lange nutze ich SELFHTML um eigene kleine Projekte in Webseitenform umzusetzen. Bisher bin ich ohne Forenhilfe bei meinen Schustereien ausgekommen, aber gerade macht mich eine Unstimmigkeit verrückt.
Bevor's losgeht: Das Problem selbst – ich wollte es schon mehrfach dabei bewenden lassen, dass 'Programm' funktioniert soweit, aber es lässt mich schlicht nicht los – ist eher nichtig, sehr speziell und möglicherweise leicht gelöst und meine Ausführungen sind sicher etwas unbeholfen und arg lang. Wer sich davon nicht abschrecken lässt…
Also, in aller für nötig befundenen Ausführlichkeit:
(Firefox, neuste Version, Windows XP SP3)
Ich habe eine recht simple Vokabellernhilfe erstellt, die mir ein Deutsches Verb ausgibt (f1), welches ich dann auf Spanisch und konjugiert (insgesamt sieben Formen – abgefragt durch f2-f8) eingeben muss. Ist eine Eingabe richtig, wird in einem rechten Fenster ein Bild eckchenweise aufgedeckt (f9), ist die Eingabe falsch, wird es stattdessen verdeckt (f10). Die betreffenden Funktionen stehen wie folgt da:
function f1()
{
x = parseInt(Math.random()*1 +7);
z = new Array("sein","gehen","wollen","können","haben","denken","fühlen");
document.getElementById("Frage").value = z[x-1];
}
function f2()
{
if (m == 0)
{
var e = (document.Formular.in.value);
z = new Array("ser","ir","querer","poder","tener","pensar","sentir");
var y = z[x-1];
if(e != y)
{document.getElementById("in").value = "";
f10(),f3()}
else
{m++;
f3(),f9()}
}
else
f3()
}
… (Die Funktionen f3 bis f8 wie f2)
function f9()
{
c++;
parent.rechts.document.getElementById(c).src ="../gif.gif";
}
function f10()
{
if(c > 0)
{
parent.rechts.document.getElementById(c).src ="../0.jpg";
c--;
}
}
Das Programm funktioniert soweit. Einzig wenn die Variable c, welche in f9 und f10 verändert und mittels derer das Bild auf- bzw. verdeckt wird, zu Beginn des Antwortvergleichs (beim Auslösen von f2) gleich null ist, scheint die Funktion f10 überhaupt nicht angesprochen zu werden, selbst wenn z.B. f2 bis f5 richtig waren und demnach c in f6 bereits auf vier angewachsen sein müsste. Bisher dachte ich, die Funktionen werden in Reihenfolge angesprochen und ein erster Durchlauf müsste demnach beispielsweise so aussehen:
c=0
f2 (richtig) -> f9: c=1
f3 (richtig) -> f9: c=2
f4 (falsch) -> f10: c=1
f5 (richtig) -> f9: c=2
f6 (richtig) -> f9: c=3
f7 (falsch) -> f10: c=2
f8 (falsch) -> f10: c=1 (Ins Programm übersetzt sollte jetzt nur ein Teil vom Bild aufgedeckt sein)
Stattdessen steht c nach dem ersten Durchlauf auf vier, vier Teile sind aufgedeckt, so als würde alles parallel ausgeführt und es kommt nie zu dem c-- in f10, da c am Anfang des parallelen alles-auf-einmal-Ausführens eben auf null steht. Sobald c größer als null ist, funktioniert (beinahe) alles so, wie es soll.
Kann mir jemand diese Unstimmigkeit in der Reihenfolge erklären? Hat jemand eine Idee, wie ich das ganze lösen könnte? Ich habe schon verschiedene Sachen probiert, stoße jedoch stets auf das gleiche Problem.
Ich hoffe, ich konnte mein Problem verständlich machen.
Grüße
Hi,
x = parseInt(Math.random()*1 +7);
diese Anweisung ist unnötig kompliziert, man kann sie vereinfachen zu:
x = 7;
Warum? Math.random() gibt einen Wert, der immer kleiner als 1 ist. Dazu 7 addieren, ergibt also einen Wert von mindestens 7, aber kleiner als 8. Davon nur den ganzzahligen Anteil - also 7.
Du meintest vielleicht:
x = parseInt(Math.random()*7 +1);
Und selbst das ist nicht schlau. Warum erst 1 addieren, wenn du danach wieder 1 subtrahieren musst?
z = new Array("sein","gehen","wollen","können","haben","denken","fühlen");
document.getElementById("Frage").value = z[x-1];
}
Und schließlich ein logischer Aspekt: Wenn der berechnete Wert von x nachher auch an anderen Stellen des Programms verwendet werden soll, warum gibst du ihn dann nicht als Funktionsergebnis zurück? Globale Variablen in einer Funktion zu ändern, gilt als sehr schlechter Stil und kann zu üblen, schwer auffindbaren Fehlern führen.
function f9()
{
c++;
parent.rechts.document.getElementById(c).src ="../gif.gif";
}
Die schlechte Angewohnheit zieht sich weiter durch: Warum verwendest du überhaupt Funktionen, wenn du darin doch lustig mit den globalen Daten hantierst?
Abgesehen davon: Die Anweisung c++ lässt vermuten, dass c ein Zahlenwert ist. Das ergibt aber keinen Wert, der als ID in HTML gültig wäre - IDs dürfen nicht mit einer Ziffer beginnen.
function f10()
{
if(c > 0)
{
parent.rechts.document.getElementById(c).src ="../0.jpg";
c--;
}
}
Schon mal über einen sinnvollen Einrückungsstil nachgedacht?
Das Programm funktioniert soweit. Einzig wenn die Variable c, welche in f9 und f10 verändert und mittels derer das Bild auf- bzw. verdeckt wird, zu Beginn des Antwortvergleichs (beim Auslösen von f2) gleich null ist, scheint die Funktion f10 überhaupt nicht angesprochen zu werden
Doch natürlich - aber in f10() wird ja gefragt, ob c>0 ist - und nur dann passiert was. Aber nicht, wenn c==0 ist.
Kann mir jemand diese Unstimmigkeit in der Reihenfolge erklären?
Nein. Du zeigst nur einzelne Funktionen, aber nicht die Logik, die darübersteht. Wie rufst du sie auf, wie ist der logische Ablauf? Scheint mir alles sehr holprig.
Ich hoffe, ich konnte mein Problem verständlich machen.
Eher nicht ...
So long,
Martin
Hallo Martin,
mh, schade, dass es mir nicht gelungen zu sein scheint, mein Problem mit den Funktionen nachvollziehbar darzustellen. Ich versuche es noch einmal, obgleich deine Art zu antworten und auf Fehler hinzuweisen recht demotivierend dahingehend ist. Zum Beispiel stellst du viele rhethorische Fragen deren Unter- bzw. Oberton meine Unzulänglichkeit im Umgang mit HTML ist. Die herauszustellen hättest du dir weder für mich noch für andere so viel Mühe machen müssen, da bin ich mir sicher.
x = parseInt(Math.random()*7 +1); - ja, so stimmt's, so stand's auch, hier hatte sich nach Testläufen lediglich ein Fehler eingeschlichen. Die '+1' ist überflüssig, hatte aber, so glaube ich, an anderer Stelle, mit anderem Unterbau mal eine Sinn. Danke für den Hinweis. Ich werd mich zudem zu 'globalen Variablen' belesen, von denen habe ich bisher lediglich eine ferne Ahnung.
Wie gesagt, dass Programm funktioniert, trotz des angesprochenen schlechten Stils. Dass ich nur einen Teil hier reingesetzt habe, liegt schlicht an meinem Wunsche, euch keine 278 Zeilen vorzusetzen. Tatsächlich hatte ich gehofft, auch in der Auswahl gerade den 'logischen Ablauf' ersichtlich gelassen zu haben.
Drückt man einen Knopf, zeigt f1 ein zufällig ausgewähltes Verb an. Dann gibt man in sieben input-Zeilen die spanischen Formen ein, drückt den Knopf erneut und f2 wird ausgelöst, woraufhin bis f8 der Reihe nach (so dachte ich zumindest) der Inhalt der input-Zeilen mit den richtigen Antworten verglichen wird. Stimmt ein Inhalt nicht, f10, c wird kleiner, stimmt er f9, c wird größer.
Mein Verständnis-Problem liegt nun darin, dass, wenn c zu Beginn (beim Auslösen von f2) null ist, es im Durchlauf (f2-f8) keine Rolle zu spielen scheint, wie es sich ändert, f10 wird nicht ausgelöst. Ja, du bemerkst richtig, dass ich in f10 die if-Klausel eingefügt hab, jedoch dachte ich, dass f2 bis f8 der Reihe nach ablaufen, und zum Beispiel beim Passieren von f5 c bereits den Wert drei haben könnte, und also f10 auch ausgelöst werden müsste. Das passiert jedoch nicht. Und das verstehe ich nicht.
Ich fürchte, dass macht's kaum nachvollziehbarer. Sollte ich doch den ganzen Code abbilden?
Grüße
Moin,
mh, schade, dass es mir nicht gelungen zu sein scheint, mein Problem mit den Funktionen nachvollziehbar darzustellen. Ich versuche es noch einmal
das ist gut - aber leider nicht erfolgreich.
obgleich deine Art zu antworten und auf Fehler hinzuweisen recht demotivierend dahingehend ist. Zum Beispiel stellst du viele rhethorische Fragen deren Unter- bzw. Oberton meine Unzulänglichkeit im Umgang mit HTML ist. Die herauszustellen hättest du dir weder für mich noch für andere so viel Mühe machen müssen, da bin ich mir sicher.
Ich nicht, denn ich habe den Eindruck, dass du zumindest mit Javascript sehr ... ähm, unbeholfen bist und dass du nicht nur Schwierigkeiten mit einigen Merkmalen der Sprache an sich hast, sondern auch mit Grundkonzepten strukturierter Programmierung. Die durchnumerierten Funktionen, die im Prinzip alle dasselbe tun sollen, ist ein weiteres Indiz dafür. Erstens hätte man sie etwas günstiger benamsen können, so dass der Funktionsname etwas über den Zweck oder die Operation aussagt, zweitens ist einer der Hauptgründe für die Verwendung von Funktionen, dass man den gleichen Code eben *nicht* mehrfach schreiben muss, sondern ihm die Daten, die er manipulieren soll, als Parameter mitgibt.
Und wenn dein Javascript-Code zeigt, dass du offensichtlich rein numerische IDs im HTML hast, dann sehe ich es als meine Pflicht, dich auf diesem Fehler hinzuweisen.
Ich werd mich zudem zu 'globalen Variablen' belesen, von denen habe ich bisher lediglich eine ferne Ahnung.
Dafür verwendest du, wohl ohne dir dessen bewusst zu sein, ausschließlich globale Variablen.
Wie gesagt, dass Programm funktioniert, trotz des angesprochenen schlechten Stils.
Das will ich nicht bestreiten.
Dass ich nur einen Teil hier reingesetzt habe, liegt schlicht an meinem Wunsche, euch keine 278 Zeilen vorzusetzen. Tatsächlich hatte ich gehofft, auch in der Auswahl gerade den 'logischen Ablauf' ersichtlich gelassen zu haben.
Eben nicht. Du stellst zehn Funktionen vor, aber kein Stück, aus dem hervorgeht, in welcher zeitlichen oder logischen Abfolge sie aufgerufen werden. Und du schreibst ja selbst, dass es dir vorkommt, "als würde alles parallel ausgeführt". Das kann eigentlich nicht sein - aber gerade darum wäre es wichtig, den übergeordneten Code zu kennen, der diese Funktionen aufruft und damit den Grundablauf steuert.
Drückt man einen Knopf, zeigt f1 ein zufällig ausgewähltes Verb an. Dann gibt man in sieben input-Zeilen die spanischen Formen ein, drückt den Knopf erneut und f2 wird ausgelöst, ...
Wie? Wodurch?
woraufhin bis f8 der Reihe nach (so dachte ich zumindest) der Inhalt der input-Zeilen mit den richtigen Antworten verglichen wird. Stimmt ein Inhalt nicht, f10, c wird kleiner, stimmt er f9, c wird größer.
Schön, wie du das beschreibst. Aber wie genau ist es implementiert? Genau in dieser Logik scheint doch irgendwo der Hund begraben zu sein.
Mein Verständnis-Problem liegt nun darin, dass, wenn c zu Beginn (beim Auslösen von f2) null ist, es im Durchlauf (f2-f8) keine Rolle zu spielen scheint, wie es sich ändert, f10 wird nicht ausgelöst. Ja, du bemerkst richtig, dass ich in f10 die if-Klausel eingefügt hab, jedoch dachte ich, dass f2 bis f8 der Reihe nach ablaufen, ...
Wer sorgt überhaupt dafür, dass sie ablaufen? Wer ruft sie auf?
Ich fürchte, dass macht's kaum nachvollziehbarer. Sollte ich doch den ganzen Code abbilden?
Nein. Besser ein Online-Beispiel zeigen, das man austesten kann. Da kann man sich dann auch gezielt die Merkmale anschauen, die man für relevant hält.
Schönes Wochenende,
Martin
Hi,
function f2()
{
if (m == 0)
{
var e = (document.Formular.in.value);
z = new Array("ser","ir","querer","poder","tener","pensar","sentir");
var y = z[x-1];
if(e != y)
{document.getElementById("in").value = "";
f10(),f3()}
else
{m++;
f3(),f9()}
}
else
f3()
}
ich erkenne jetzt erst, dass die Funktionen sich alle irgendwie gegenseitig aufrufen, sorry.
… (Die Funktionen f3 bis f8 wie f2)
Okay - f2 ruft also f3 auf. Und f3 ruft f4 auf? Das heißt, die ganze Kette läuft quasi-rekursiv einmal durch? Oder verstehe ich das falsch? Welche Bedeutung hat m hier?
Das Programm funktioniert soweit. Einzig wenn die Variable c, welche in f9 und f10 verändert und mittels derer das Bild auf- bzw. verdeckt wird, zu Beginn des Antwortvergleichs (beim Auslösen von f2) gleich null ist, scheint die Funktion f10 überhaupt nicht angesprochen zu werden, selbst wenn z.B. f2 bis f5 richtig waren und demnach c in f6 bereits auf vier angewachsen sein müsste.
Vielleicht weil m im Positiv-Fall erhöht wird und der Aufruf von f10() oder f9() dann wegen der Abfrage auf m==0 gar nicht mehr stattfindet? - Wie gesagt, mir fehlt hier komplett das Verständnis für die Zusammenhänge.
So long,
Martin
Hallo,
mein obiger Post bezieht sich auch auf deinen Beitrag, ich hab ihn jedoch falsch gesetzt.
Grüße
Hallo Castorp,
in dem Teil deines Scriptes, den du uns zeigt, werden m und c verwendet, aber nie gesetzt. Welche Startwerte haben die Variablen?
IDs dürfen nicht mit einer Ziffer beginnen, id="1" ist falsch! Du kennst als ID z.B. "Teilbild"+c nehmen, also "Teilbild1", ... .
Am besten lädst du dein Werk mal hoch und postest den Link, damit wir und das mal ansehen können.
Gruß, Jürgen
Hallo,
ich habe das Ding mal im Packet (ca. 160KB) hochgeladen – es war nie als Online-Seite gedacht, ich hoff, derart gepackt und offline ist's dennoch für euch verwaltbar. (Ist's ein komplettes Sicherheits-Unding, euch eine ZIP-Datei vorzulegen?)
Der Link:
http://www.file-upload.net/download-3877843/Spanisch.zip.html
Spanisch/Wissen/1.html – die Hauptdatei, die mit den besprochenen Funktionen – wahrscheinlich als einzige interessant für das vorliegende Problem
Spanisch/Spanisch.html – im normalen Gebrauch die 'Startseite'
Spanisch/Misc/Wahl.html – Auswahlseite, hier auf je eine Auswahl reduziert
Spanisch/Misc/1/b.html – Bildseite, beim normalen Programmablauf rechts auf dem Bildschirm. Hier passiert das richtig-falsch-Feedback mit Hilfe des erscheinenden und verschwindenden Bildes. (Zu Testzwecken ist das Bild mit Nummern versehen)
(Der schlechte Stil zieht sich sicher durch alle Dateien. Wie gesagt, selbst und lediglich für den Eigengebrauch zusammengewurstelt.)
Ich hab ein paar kleine Veränderungen vorgenommen, aber das Problem besteht nach wie vor.
Ja, die Funktionen f2 bis f8 werden der Reihe nach angesprochen. f2 wird vom Anwender ausgelöst, die folgenden jeweils durch die vorhergehende Funktion. Eben wegen dieser eigentlichen Abfolge verstehe ich nicht, warum f10 beispielsweise in f5 bei falscher Antwort nicht angesprochen wird, obgleich 'c' in f2-f4 durch richtige Antworten bereits auf drei angewachsen und demnach das if(c > 0) erfüllt sein müsste.
'm' und 'c' stehen zu Beginn auf null.
'm' (usw.) ist als Schalter eingebaut, damit es nur einmal die Belohnung bei richtiger Beantwortung gibt. Ist für die Funktionen f2 bis f8 je eine andere Variable. Sind alle 'Schalter' umgelegt, geht's mit dem nächsten Verb weiter und 'm' bis 's' werden wieder auf null gesetzt. Dürfte eigentlich nichts mit dem Problem zu tun haben.
Die +1, -1 Sache scheint doch irgendwie notwendig zu sein. Ohne sie gibt's Probleme. Liegt vielleicht an Unsauberkeiten andernorts.
Es scheint trotz dem die IDs lediglich Ziffern sind, zumindest auf meinem Rechner zu funktionieren. (relevant in Spanisch/Misc/1/b.html)
Grüße
Okay, ich hab eine Lösung gefunden. Wenn ich, was in f9 und f10 steht, in f2 bis f8 schreibe, anstelle der Verweise auf f9 und f10, funktioniert es. Mich wundert zwar nach wie vor, dass dies einen Abfolge-Unterschied zu machen scheint, aber die Lösung selbst ist so simpel und naheliegend, dass ich mich mindestes ebensosehr wundere, nicht eher drauf gekommen zu sein.
Dank euch für die Hilfsbereitschaft