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.

BenniG. 15.06.2008 00:39

AW: Warum eine Endlosschleife?
 
[url=http://if-schleife.de]if-schleife.de[/url] ;)

[quote]
Jemand eine Idee woran es liegt bzw. wie ich es herausfinden könnte? Die Api hilft mir leider nicht weiter.
[/quote]
Was genau daran ist dir unklar?
Die Ausgabe hätte ich genau so erwartet..

DonSchado 15.06.2008 09:50

AW: Warum eine Endlosschleife?
 
if-[U]Schleife[/U]!? Was'n das? ;)

Du schreibst "solange"(c != -1)...

Wo soll c den Wert -1 bekommen?

Greeven 15.06.2008 12:11

AW: Warum eine Endlosschleife?
 
Ein richtiges lol an if-schleife.de, ich werde versuchen es mir zu merken.

Nach dem letzten "Ende der if-Schleife." (tz wer das geschrieben hat... if-Schleifen gibts doch gar nicht^^) müsste noch ein "vor read()" kommen und dann ist der String zu ende und read() kommt, was dann ein -1 für c zurückgibt.
Oder nicht?

redfalcon 15.06.2008 12:40

AW: Warum eine Endlosschleife?
 
Hui, hat ne Weile gedauert, bis ich gerafft hab, was das Programm überhaupt machen soll. Gut, ich habs mal eben durch den Debugger gejagt. Die Abfrage endet nicht, weil c nicht -1 wird, sondern nach Abarbeiten des Strings 10 (LF, Linefeed) wird. Außerdem wird c am Ende des Programms immer 13 (CR, Carriage Return, "Zum Zeilenanfang") angehängt.
Ich hab das Programm mal soweit korrigiert, damit es den Sinn erfüllt, den du mMn bezwecken willst. Nicht schön, aber funzt.

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

while (c != 10)
{

System.out.print ("Vor read()");
c = System.in.read();
System.out.print ("nNach read()");

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

}

}
anzahl=anzahl-1;
System.out.print ("Anzahl: " + anzahl);
}
}
[/php]


Btw, interessant, dass das Forum das "\n" nicht zu mögen scheint.

Greeven 15.06.2008 15:50

AW: Warum eine Endlosschleife?
 
So klappts. Vielen Dank. Habe aber trotzdem noch darüber ein paar Fragen:

Vor der Eingabe, die man tätigt, kommt einmal "Vor read()". Damit das aber wirklich so ist, muss ich print() in println() umändern. Ist das bei dir auch so oder hat das einen Grund der nur in meinem Rechner liegt?
Warum gibt read() 10 wieder und nicht -1? Die 10 kenne ich ja von der Ausgabe, aber ich dachte, dass sie das Enter symbolisiert. Meine Vermutung wäre, dass bei Input halt am Ende eine 10 zurückgegeben wird und wenn man der Methode einen String anders zukommen lässt eine -1.
Das mit der 10 ist leider auch nicht der Api zu entnehmen oder?
Und noch der Debugger: Ich hätte das Problem auch selbst finden können, wenn ich mit dem Debugger hätte umgehen können? Kenne ja "Debug File" und habe das grad mal versucht, aber es öffnen sich zwar paar Fenster, aber dort passiert relativ wenig.

Sinn und Zweck der Fragen ist, dass ich nicht immer sofort hier ins Forum kommen
will. Eine gewisse Unabhängigkeit fehlt mir.

BenniG. 15.06.2008 15:52

AW: Warum eine Endlosschleife?
 
[quote]
Nach dem letzten "Ende der if-Schleife." [...] müsste noch ein "vor read()" kommen
[/quote]Das Problem können die Puffer in den Eingabe und Ausgabe-Streams sein. Die werden ggf. zu selten geflusht.
Ein
[code]
System.out.flush();
[/code]nach dem "Vor read()" könnte helfen..

Edit:
[quote]Meine Vermutung wäre, dass bei Input halt am Ende eine 10 zurückgegeben wird und wenn man der Methode einen String anders zukommen lässt eine -1.[/quote]
Die -1 _soll_ zurückkommen, wenn man [STRG]+[Z] drückt, was _normalerweise_ "End of Stream" signalisieren soll. Bei deinem Netbeans scheint das nicht zu klappen..
10 ist der ASCII-Code zu Line-Feed, was ausgelöst wird, wenn man [ENTER] drückt.

[quote]Und noch der Debugger: Ich hätte das Problem auch selbst finden können, wenn ich mit dem Debugger hätte umgehen können? Kenne ja "Debug File" und habe das grad mal versucht, aber es öffnen sich zwar paar Fenster, aber dort passiert relativ wenig.[/quote]
Hast du einen Breakpoint gesetzt? Normal geht das über doppelklick auf die Zeilennummer (bzw. den linken bereich im Editor-Fenster)

redfalcon 15.06.2008 15:59

AW: Warum eine Endlosschleife?
 
[quote=Greeven;555844]
Und noch der Debugger: Ich hätte das Problem auch selbst finden können, wenn ich mit dem Debugger hätte umgehen können? Kenne ja "Debug File" und habe das grad mal versucht, aber es öffnen sich zwar paar Fenster, aber dort passiert relativ wenig.
[/quote]

Welchen Editor nutzt du?

Greeven 15.06.2008 16:46

AW: Warum eine Endlosschleife?
 
NetBeans 5.5.1

Bezüglich dem Debuggen: Ich weiß davon nix. (Wusste auch nicht, was ein Breakpoint ist) Jetz habe ich es mal auspobiert und dort hört er dann wohl einfach auf das Programm zu compilieren etc. Aber bevor freundlicher Weise mir versucht wird zu helfen - Hilfe die mich verwirrt, da ich mit vielen Begriffen noch nichts anfangen kann - würde ich wohl erstmal ein Tutorial machen. Wenn ich damit nämlich selbst Fehler finden und Fragen beantworten kann, wäre das natürlich eine Top-Sache.

So stellt sich zum Beispiel auch jetzt die Frage: flushen? Zum ersten mal gehört und so beantworte ich mir momentan die Frage:
Wörterbuch: leeren --> gibt mir schonmal ne Vorstellung davon
Api (es heißt Api oder?) --> "Flushes the stream. This is done by writing any buffered output bytes to the underlying output stream and then flushing that stream."
Also leeren. Aber was das nun kann oder zu was das gut ist.. keine Ahnung.

BenniG. 15.06.2008 17:34

AW: Warum eine Endlosschleife?
 
[quote]
Jetz habe ich es mal auspobiert und dort hört er dann wohl einfach auf das Programm zu compilieren etc.
[/quote]Nein, mit dem compilen hat das nix zu tun. An der Stelle stoppt er die Ausführung des Programms.
Compilen: Übersetzen des Programms in Maschinensprache (bzw. bei Java in den Java Byte Code) => Erzeugen der .class Datei.

Bei einem Breakpoint kannst du die Aufrührung des Programms anhalten und dann über die verschiedenen Funktionen das Programm langsam weiter laufen lassen. Step over, Step Into, Step return sollten über verschiedene Buttons in der Debuger-Perspektive verfügbar sein. Beim angehaltenen Programmzustand kannst du dir dann die Inhalte von Variablen anschauen etc. Bei deinem Mini-Beispiel ist das aber wahrscheinlich zu trivial ;)

[quote]
So stellt sich zum Beispiel auch jetzt die Frage: flushen?
[/quote]Java benutzt bei vielen Sachen Streams. Streams sind, wie der Name schon sagt, Datenströme. Aus Performancegründen wird nicht alles, was im Stream verfügbar ist sofort geschrieben (auf den Bildschirm, die Festplatte, etc) sondern zum Teil gepuffert. Wenn man bei einer Datei jedes einzelne Byte einzeln schreiben würde, wäre das sehr langsam.
Anscheinend wird auch bei System.out (was einen Ausgabestrom darstellt) in manchen Fällen (bei mir z.B. nicht) ein Puffer benutzt. D.h. die Ausgabe erfolgt nicht zwingend sofort, sondern evtl. etwas verzögert, zusammen mit einer anderen Ausgabe..
Das Flushen des Puffers erzwingt eine Leerung des Puffers. Der Puffer wird dann auf das Ausgabemedium (Festplatte, Bildschirm) geschrieben.

Daher einfach mal ausprobieren, ob das in deinem Fall hilft..

Greeven 15.06.2008 18:13

AW: Warum eine Endlosschleife?
 
Hat nicht geholfen, aber deinen Gedankengang kann ich jetzt nochvollziehen.

BenniG. 15.06.2008 18:21

AW: Warum eine Endlosschleife?
 
Starte das Programm mal außerhalb von Netbeans.
[code]
java Zeichen
[/code]

Vielleicht auch mal Eclipse versuchen. Da kann ich dir genau sagen, wo sich welche Funktion versteckt, oder dir mal ein Demo-Projekt schicken..

Greeven 15.06.2008 18:28

AW: Warum eine Endlosschleife?
 
Wenn ich es mit (c != 10) mache läufts. Insofern habe ich das Problem erstmal aus dem Weg. (Wobei es sicherlich ja im Endeffekt ein Bedienfehler ist, da ich nicht weiß, warum es so ist. Nen Grund hat es bestimmt.)

Werde Bescheid geben an dem Tag, an dem ich mir Eclipse installiert habe. Aber erstmal freu ich mich weitermachen zu könne.

redfalcon 15.06.2008 18:48

AW: Warum eine Endlosschleife?
 
Programmierst du momentan "nur" so kleine Konsolenprogramme? Wenn ja ist Netbeans oder Eclipse doch totaler Overkill (sofern ihr es nicht in der Schule (?) nutzt). Schau dir mal den [url=http://lernen.bildung.hessen.de/informatik/javaeditor/index.htm]JavaEditor[/url] an. Kompakt, übersichtlich, simpel und alles was man für den Anfang braucht.

Greeven 15.06.2008 20:21

AW: Warum eine Endlosschleife?
 
Den JavaEditor kenn ich nicht. Java mach ich aus freien Stücken heraus. In jungen Jahren hat man ja hier und da immer mal eine Idee über die man gern sinniert. Dafür brauch ich allerdings etwas zum visualisieren.
Java wird da immer gelobt und so kam ich dazu. Habe mir aus diesem Grund ein Buch gekauft und ein Kumpel hat mir letztens eine Cd gegeben mit Videos drauf. Bei dem Buch war NetBeans dabei und auf der Cd werden NetBeans und Eclipse vorgestellt aber alles über NetBeans gezeigt.
Den vermeindlichen Overkill finde ich nicht so schlimm. So weiß man, was noch alles in etwa auf einen zukommt.
Aber ja: momentan ist das nur so kleines Zeug (und ich freue mich immer wieder, wenn es klappt^^)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 Uhr.

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