Computer Hardware Forum - TweakPC

Computer Hardware Forum - TweakPC (https://www.tweakpc.de/forum/)
-   Programmiersprachen (https://www.tweakpc.de/forum/programmiersprachen/)
-   -   Warum eine Endlosschleife? (https://www.tweakpc.de/forum/programmiersprachen/57110-warum-eine-endlosschleife.html)

Greeven 09.06.2008 17:16

Warum eine Endlosschleife?
 
Guten Tag,
ich habe mir vorgenommen mit einem Buch näher an Java ran zu kommen. Dort gibt es ein Beispielprogramm, was ich ihr unten seht. Leider kommt das Programm wohl aus der while-Schleife nicht raus, was ich nicht verstehe.

[php]public class Zeichen
{
public static void main (String[] args) throws Exception
{
int c = 0;
int anzahl = 0;

while (c != -1)
{
c = System.in.read();

if (c != -1)
{
System.out.println ("ASCII-Code: " + c + " Zeichen: " + (char) c);
anzahl = anzahl + 1;
}

}

System.out.println ("nAnzahl, die irgendwie nich kommt evtl.?: " + anzahl);
}
}[/php]
Ist das ausreichend um Hilfe zu bekommen oder fehlt noch was?
PS.: Das Buch sagt, dass man Strg + Z drücken muss, damit System.in.read () -1 zurück gibt, was ich aus der Documentation aber nicht erkennen kann.

bigfoot996 10.06.2008 07:59

AW: Warum eine Endlosschleife?
 
Hi, ich bin jetzt nich so der ultra programmer, gleich gar nich in Java, aber ich hoffe mal ich kann dir helfen:

Eine While Schleife ist eine sogenannte "Kopfgesteuerte Schleife", d.h. die Schleife überprüft erst jedes mal die Bedinngung bevor es eigentlich losgeht. In deinem Fall wird das aber nich passieren, da deine variable "c" immer ungleich -1 sein wird, daher springt er gar nich in den 2. Teil rein sondern macht solange den 1. bis c mal verändert werden würde.


[I]while (c != -1)[/I] wird also immer true sein, weil c nie verändert wird.

Hoffe das is richtig und verständlich.

MfG
bigfoot996

Fr@ddy 10.06.2008 08:18

AW: Warum eine Endlosschleife?
 
Also ich würde vermuten, dass System.in.read() keine -1 zurückgibt.
lass doch mal testweise den eingelesenen int wieder ausgeben, noch vor dem if, dann siehst du ja ob da ein -1 kommt.

EoN 10.06.2008 08:38

AW: Warum eine Endlosschleife?
 
[quote=bigfoot996;555087]Hi, ich bin jetzt nich so der ultra programmer, gleich gar nich in Java, aber ich hoffe mal ich kann dir helfen:

Eine While Schleife ist eine sogenannte "Kopfgesteuerte Schleife", d.h. die Schleife überprüft erst jedes mal die Bedinngung bevor es eigentlich losgeht. In deinem Fall wird das aber nich passieren, da deine variable "c" immer ungleich -1 sein wird, daher springt er gar nich in den 2. Teil rein sondern macht solange den 1. bis c mal verändert werden würde.


[I]while (c != -1)[/I] wird also immer true sein, weil c nie verändert wird.

Hoffe das is richtig und verständlich.

MfG
bigfoot996[/quote]

Das stimmt so leider nicht.
C wird genau hier " c = System.in.read();" überschrieben.
Das mit der kopfgesteuerten Schleife hat dann den Einfluss, dass man in die Schleife mindestens einmal hinein gelangt und diese dann frühestens nach dem ersten Durchlauf terminiert.

Dass bei Strg + z ein -1 zurückgegeben wird wundert mich jetzt doch ein wenig. Hast Du es denn mal mit Strg + c probiert? Das ist normalerweise die Abbruchstastenkombination von Konsolenanwendungen und könnte evtl einen Fehlercode in der Art von -1 werfen.

bigfoot996 10.06.2008 08:50

AW: Warum eine Endlosschleife?
 
[quote=EoN;555092]Das stimmt so leider nicht.
C wird genau hier " c = System.in.read();" überschrieben.
Das mit der kopfgesteuerten Schleife hat dann den Einfluss, dass man in die Schleife mindestens einmal hinein gelangt und diese dann frühestens nach dem ersten Durchlauf terminiert.

Dass bei Strg + z ein -1 zurückgegeben wird wundert mich jetzt doch ein wenig. Hast Du es denn mal mit Strg + c probiert? Das ist normalerweise die Abbruchstastenkombination von Konsolenanwendungen und könnte evtl einen Fehlercode in der Art von -1 werfen.[/quote]

Hm mist, ich hätte doch den javakurs auch noch machen sollen xD ;)

Aber es kommt ja auch drauf an weis er eingibt oder? wenn er jedes mal sowas eingibt das es ungleich -1 is dann geht er ja trotzdem nich aus dem while raus oder?

EoN 10.06.2008 08:52

AW: Warum eine Endlosschleife?
 
[quote=bigfoot996;555094]Hm mist, ich hätte doch den javakurs auch noch machen sollen xD ;)

Aber es kommt ja auch drauf an weis er eingibt oder? wenn er jedes mal sowas eingibt das es ungleich -1 is dann geht er ja trotzdem nich aus dem while raus oder?[/quote]

Richtig, ist halt die Frage was die Strg + irgendwas Tastenkombinationen zurückgeben. Da sind leider meine Javakenntnisse am Ende.

bigfoot996 10.06.2008 09:01

AW: Warum eine Endlosschleife?
 
[quote=EoN;555095]Richtig, ist halt die Frage was die Strg + irgendwas Tastenkombinationen zurückgeben. Da sind leider meine Javakenntnisse am Ende.[/quote]

Ach sei getröstet, ich kenn nichmal irgendwelche strg + xx Kombinationen xD Ich kenn mich in java absolut 0 aus, programmier so gut wie nur C# und selbst das noch miserabel ;)

Für mein eigenes Verständniss nochmal: Meine Erklärung vorher was soweit richtig bis auf das das die Variable C doch verändert wird oder? Dann is sein Problem doch eig gar kein Problem, nur dass er halt nie das richtige eingibt das nich -1 rauskommt und er somit in den 2. Teil der Schleife geht oder?:mrgreen:

EoN 10.06.2008 09:20

AW: Warum eine Endlosschleife?
 
[quote=bigfoot996;555096]Ach sei getröstet, ich kenn nichmal irgendwelche strg + xx Kombinationen xD Ich kenn mich in java absolut 0 aus, programmier so gut wie nur C# und selbst das noch miserabel ;)

Für mein eigenes Verständniss nochmal: Meine Erklärung vorher was soweit richtig bis auf das das die Variable C doch verändert wird oder? Dann is sein Problem doch eig gar kein Problem, nur dass er halt nie das richtige eingibt das nich -1 rauskommt und er somit in den 2. Teil der Schleife geht oder?:mrgreen:[/quote]
Ja es kommt anscheinend durch Strg + Z kein "-1" zurück.

BenniG. 10.06.2008 10:12

AW: Warum eine Endlosschleife?
 
[quote=EoN;555097]Ja es kommt anscheinend durch Strg + Z kein "-1" zurück.[/quote]
Also bei mir klappt das prima..
Ich hab es aber auf die Schnelle nirgendwo offiziell dokumentiert gefunden. Aber STRG+Z soll dafür sorgen, dass der InputStream der Tastatur beendet wird (EOF bzw. End of Stream).

Bei mir im Eclipse klappt das..

Edit: Hier stehen ein paar Sätze dazu:
[url=http://www.uni-koeln.de/rrzk/kurse/unterlagen/java/javaref/io/textio.htm]Ein-/Ausgabe[/url]
[quote][LIST][*] Ende der Eingabe
Ctrl-Z signalisiert das Ende der Eingabe (end of file). Häufig ist mindestens unter DOS/Windows nach Ctrl-Z noch ein Enter nötig, damit das lesende Programm das Ctrl-Z auch erhält.[/LIST][/quote]

Greeven 10.06.2008 10:38

AW: Warum eine Endlosschleife?
 
Habe es mit Strg + fast die ganze Tastatur versucht. Schade, dass diese Abbruchkombinationen alle nicht funktionieren. So will es ja das Buch.
Schlimmer find ich, dass die eingefügten Ausgaben nicht erscheinen. Warum die Ausgaben nicht kommen, ist dann bestimmt etwas, was mir später noch erklärt wird. Eine Erklärung wäre trotzdem schön, weswegen die nicht kommen und Abbruchkombinationen müssten doch eigentlich irgendwo nachzulesen sein, oder?

[php]public class Zeichen
{
public static void main (String[] args) throws Exception
{
int c = 0;
int anzahl = 0;

System.out.println (c + " " + anzahl);

while (c != -1)
{
c = System.in.read();
System.out.print (c);
System.out.println ("Wäre schön, wenn ich dies sehen würde:" + anzahl);

if (c != -1)
{
System.out.println ("ASCII-Code: " + c
+ " Zeichen: " + (char) c);
anzahl = anzahl + 1;
}
}
System.out.println ("nAnzahl: " + anzahl);
}
}
[/php]

BenniG. 10.06.2008 10:48

AW: Warum eine Endlosschleife?
 
Drückst du zwischendurch auch [Enter]? Der Input-Stream hat da wohl einen Puffer (bin mir fast sicher, dass man den irgendwo abschalten kann, hab ich aber nicht gefunden), der erst bei [Enter] geflusht wird.

Deine Ausgabe "0 0" erscheint?

Greeven 10.06.2008 11:40

AW: Warum eine Endlosschleife?
 
Also zwischendurch Enter drücken würde nix bringen, da dann mein schon eingegebener Input nochmal gegeben wird. Du kannst auch "blablabla" eingeben, nicht nur Zahlen. Hab grad mit einem Kumpel drüber sinniert, der hatte es auch erst so aufgefasst. Bei ihm allerdings kamen - bis auf die letzte - die anderen Ausgaben. meine Ausgabe sieht wie folgt aus, nachdem ich "testbla" eingegeben habe und Enter gedrückt hab:

testbla
ASCII-Code: 116 Zeichen: t
ASCII-Code: 101 Zeichen: e
ASCII-Code: 115 Zeichen: s
ASCII-Code: 116 Zeichen: t
ASCII-Code: 98 Zeichen: b
ASCII-Code: 108 Zeichen: l
ASCII-Code: 97 Zeichen: a
ASCII-Code: 10 Zeichen:

Merkwürdig dabei ist, dass testbal am Anfang angezeigt wird, was ich nicht erwartet hätte und dass halt keine der anderen Ausgaben kommt.

BenniG. 10.06.2008 11:48

AW: Warum eine Endlosschleife?
 
[quote]
Merkwürdig dabei ist, dass testbal am Anfang angezeigt wird, was ich nicht erwartet hätte und dass halt keine der anderen Ausgaben kommt.[/quote]
javac vergessen? Sieht mir so aus, als hast du noch eine alte Class-Datei..

Greeven 10.06.2008 13:04

AW: Warum eine Endlosschleife?
 
Habe eine Entwicklunsumgebung (Kürzel dafür vergessen). Weiß nicht wie man auf sowas, wie du kommen könnte, da doch immer davor compiliert wird, oder nich? Muss ja. Aber drei Sterne kommen nicht von ungefähr.^^ Also habe ich in meinem Ordner zwei Classdateien gelöscht, die Zeichen.class hießen. Ausgeführt und es kam:
[php]
init:
deps-jar:
compile-single:
run-single:
java.lang.NoClassDefFoundError: punkt/Zeichen (wrong name: Zeichen)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
Exception in thread "main"
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
[/php]Ich war schockiert, was ich angerichtet hab und löschte dies auch bei Netbeans und erstellte es neu. Das gleiche. Da fiel mir ein, dass es ja auch noch eine Javadatei gibt. Die hab ich dann auch gelöscht und quasi einen richtigen Neuanfang bezüglich diesem "Zeichen-Programm". Und nun seh ich zwar noch nicht die letzte Ausgabe, aber die davor schonmal. Nun jedoch meine Frage: Was hab ich nun eigentlich gemacht, weswegen der gleiche Code auf einmal anders behandelt wird?
So schauts also jetz aus:
[php]0 0
test
116
Wäre schön, wenn ich dies sehen würde: 0
ASCII-Code: 116 Zeichen: t
101
Wäre schön, wenn ich dies sehen würde: 1
ASCII-Code: 101 Zeichen: e
115
Wäre schön, wenn ich dies sehen würde: 2
ASCII-Code: 115 Zeichen: s
116
Wäre schön, wenn ich dies sehen würde: 3
ASCII-Code: 116 Zeichen: t
10
Wäre schön, wenn ich dies sehen würde: 4
ASCII-Code: 10 Zeichen:
[/php]

BenniG. 10.06.2008 13:09

AW: Warum eine Endlosschleife?
 
Ich benutze zwar kein Netbeans, aber die IDEs kommen schnell aus dem Tritt, wenn man am Projektverzeichnis irgendwas manuell löscht/ändert.

Dein Verhalten kann nur davon kommen, dass die class-Datei nicht neu generiert wurde. Vielleicht hast du bei dir kein automatisches Build aktiviert und es wurde nur beim allerersten Versuch eine Class-Datei erstellt?

Was passiert, wenn du den "Play"-Button in deiner IDE klickst, ist relativ weit konfigurierbar. ;)

Meine Sternchen hier sagen übrigens recht wenig über mein Java-Können aus ;)
Nur soviel, ich verdiene mein Geld mit programmieren ua. Java.


Edit:
Prüfe am besten das Datum von deiner Class Datei. Wenn sich das nicht ändert, wird die Datei auch nicht neu erstellt. Kannst ja im Netbeans mal nach "Build automatically" oder ähnliches ausschau halten. In deutsch müsste es sowas wie "Automatisches Erstellen" heißen.

Greeven 10.06.2008 13:47

AW: Warum eine Endlosschleife?
 
IDE war`s, na klar.

Aber auch wenn die Class-Datei nicht neu generiert wird muss ja dennoch das, was ich neu geschrieben habe, hineingeschrieben werden. Also die Ausgabe des Programms ändert sich doch deswegen nicht.

Ja stimmt, dass die drei Sterne sich nicht direkt einordnen lassen. Aber sie sagen aus, dass du dir auf jeden Fall etwas dabei gedacht hast, als du mich fragtest, ob ich noch eine alte Datei davon hätte.

BenniG. 10.06.2008 13:53

AW: Warum eine Endlosschleife?
 
[quote]Aber auch wenn die Class-Datei nicht neu generiert wird muss ja dennoch das, was ich neu geschrieben habe, hineingeschrieben werden.[/quote]
Wie meinst du das?

Wenn du die .java-Datei änderst, diese aber einen Fehler enthält, kann keine neue .class-Datei erzeugt werden.

Wenn du am Anfang der main-Methode deine Versionsnummer ausspuckst bist du auf der sicheren Seite, dass du auch siehst, ob die Datei wirklich neu erstellt wurde:

[code]
[COLOR=#000000][COLOR=#0000bb]public [/COLOR][COLOR=#007700]class [/COLOR][COLOR=#0000bb]Zeichen
[/COLOR][COLOR=#007700]{
[/COLOR][COLOR=#0000bb]public [/COLOR][COLOR=#007700]static [/COLOR][COLOR=#0000bb]void main [/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]String[/COLOR][COLOR=#007700][] [/COLOR][COLOR=#0000bb]args[/COLOR][COLOR=#007700]) [/COLOR][COLOR=#0000bb]throws Exception
[/COLOR][COLOR=#007700]{[/COLOR][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#000000][COLOR=#0000bb] System.out.println("Version 1.0");[/COLOR][/COLOR]
[COLOR=#000000][/COLOR][COLOR=#000000][COLOR=#007700]...
[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000bb] }[/COLOR][/COLOR]
}
[/code]

Bei jeder Änderung an der Datei änderst du dann einfach Version 1.0 entsprechend ab.

Erscheint dann immernoch Version 1.0 beim Starten des Programms, hast du einen Syntax-Fehler, oder deine IDE ist "falsch"* konfiguriert.

*In Anführungszeichen, weil es manchmal gewünscht sein kann, dass kein automatisches Build stattfindet.

Greeven 10.06.2008 14:13

AW: Warum eine Endlosschleife?
 
Wenn ich eine Änderung vornehme und in dieser ein Fehler ist, dann wird keine Class-Datei erstellt und quasi einfach die alte genommen? Klingt komisch für mich, da ich jetzt eine Fehlermeldung beim compilieren erwartet hätte.
Hab halt so ein Bild, dass wenn ich Run-File klicke das, was dort in meinem Fenster steht (also die Java-Datei) compiliert wird und die neue Class-Datei dann ausgeführt wird. Alles andere - das mit dem automatischen Builder - macht für mich irgendwie kein Sinn. So könnte ich neues schreiben und es nützt nix, da immer die alte Class-Datei verwendet wird.

Warum die letzte Zeile nicht ausgegeben wird, muss doch eigentlich daran liegen, dass read() nicht -1 ausgibt, oder?

BenniG. 11.06.2008 06:49

AW: Warum eine Endlosschleife?
 
Warum funktioniert die Benachrichtigung bei neuen Beiträgen immer so schlecht?!
Naja, egal..

Ich habs bei mir mal mit Eclipse ausprobiert, da treten die Probleme nicht auf. Ich weiß auch nicht, was du in deinem Netbeans eingestellt hast, welche Version du benutzt etc..

Aber dein Programm ist offensichtlich teilweise mit einem alten Stand gestartet. Sonst hätten Ausgaben vor und innerhalb der Schleide auf jeden Fall erscheinen müssen.

Die Ausgabe am Ende der Schleife funktioniert bei mir problemlos, wenn ich STRG+Z drücke. Wird das Programm innerhalb von Netbeans gestartet? Also hast du irgendwo im Netbeans einen "Console"-Reiter. Oder öffnet sich ein neues Fenster?
Hast du schonmal [STRG]+[Z], [ENTER] versucht?

Greeven 11.06.2008 15:43

AW: Warum eine Endlosschleife?
 
Habs mal mit Strg+z und Enter versucht. Leider kein Erfolg. Auch mit c, d usw.
Mein NetBeans ist definitiv nicht das neuste und wurde schon von einer Weile installiert. Aber Einstellungen habe ich nicht verändert. Müsste also noch genau so sein, wie es die Installation installiert.

Mit "Console"-Reiter meinst du innerhalb von Netbeans ein Fenster? Ein Output-Fenster erscheint innerhalb von Netbeans nachdem ich Umschalt+F6 gedrückt hab. Sowas?

Also das Programm ist also richtig. Es liegt also an der Softwareeinstellung. Das beruhigt mich schonmal.

Jetzt würde mich natürlich brennend interessieren, was genau es ist und so wie ich das kenne würde jemand, der hier vor meinem Rechner sitzt, sofort wissen, woran es liegt, aber über Inet ist es extrem schwer.
Aber wenn du Lust hast, würde ich dem gern nachgehen.
Und ein Danke an dieser Stelle für schon geleistete Hilfe ist angebracht: Danke.

BenniG. 11.06.2008 15:49

AW: Warum eine Endlosschleife?
 
Installier dir doch einfach das neuste Netbeans ;)
Ich könnte mir vorstellen, dass Netbeans das STRG+Z verschluckt..

Oder nimm Eclipse, da kann ich dir übers Inet auch Hilfe geben, mit Netbeans hab ich zuletzt vor 5Jahren gearbeitet..

Greeven 11.06.2008 22:44

AW: Warum eine Endlosschleife?
 
Kann ich zwei IDE`s parallel haben? I guess yes?!

Dann würde ich nämlich erst Eclipse installieren und sollte ich dennoch NetBeans bevorzugen dann das neueste davon.
Warum hast du zuerst NetBeans benutzt und dann Eclipse? Hatte ja sicherlich Gründe.

BenniG. 12.06.2008 07:26

AW: Warum eine Endlosschleife?
 
Bei Netbeans weiß ich aus dem Bauch heraus nicht, ob du mehrere Installationen parallel haben kannst (also z.B. unterschiedliche Netbeans-Versionen).

Eclipse wird als zip-File geliefert. Das kannst du an jeder beliebigen Stelle entpacken..
Ich habe bei mir auch verschiedene Eclipse-Versionen laufen, da manche Plugins die neuste Version benötigen, andere aber ältere Versionen (bei J2ME Plugins hatte ich da mal Probleme).

Eclipse benutz ich, weil es bei uns in der Firma die Standard-IDE ist und weil Netbeans damals (vor 5Jahren oder so) erheblich langsamer war.
Zudem gibt es für Eclipse sehr sehr viele Plugins.
Ich muss gestehen, dass ich schon länger nichtmehr in Netbeans reingeschaut habe. Bislang misse ich beim Eclipse aber nichts, daher hab ich auch nicht nach Alternativen ausschau gehalten..

Greeven 12.06.2008 08:51

AW: Warum eine Endlosschleife?
 
Ok, also wenn das so ausschaut, werde ich mir erst Eclipse holen, wenn ein zweites dieser Probleme auftaucht. Momentan läuft es nämlich (soll heißen, dass ich auch mal 20min etwas machen kann, ohne dass dauernd irgendwas ist, wesewegen ich nicht weiterkomme)

Dann ist es mir also jetzt erstmal egal, woran genau es liegt. Vllt ist ja mal ein Kenner bei mir, der sich das anschaut und sofort sagt: "Is doch klar."^^

Greeven 14.06.2008 16:03

AW: Warum eine Endlosschleife?
 
Hab grad ein anderes Problem gehabt (siehe Thread) und dies hat mich dazu geführt, dass hier nochmal aufzurollen. Das Problem ist, dass das Programm nicht aus der if-Schleife rauskommt.

[php]public class Zeichen
{
public static void main (String[] args) throws Exception
{
int c = 0;
int anzahl = 0;

while (c != -1)
{
System.out.print ("Vor read()");
c = System.in.read();
System.out.print ("nNach read()");

if (c != -1)
{
System.out.println ("nASCII-Code: " + c + " Zeichen: " + (char) c);
anzahl = anzahl + 1;
System.out.println ("Ende der if-Schleife.");
}

}

System.out.print ("Anzahl, die irgendwie nich kommt evtl.?: " + anzahl);
}
} [/php]

Und meine Ausgabe, nachdem ich dc eingegeben habe:

Vor read()
Nach read()
ASCII-Code: 100 Zeichen: d
Ende der if-Schleife.
Vor read()
Nach read()
ASCII-Code: 99 Zeichen: c
Ende der if-Schleife.
Vor read()
Nach read()
ASCII-Code: 10 Zeichen:

Ende der if-Schleife.

Jemand eine Idee woran es liegt bzw. wie ich es herausfinden könnte? Die Api hilft mir leider nicht weiter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 Uhr.

Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.