PDA

View Full Version : <identifier> expected


kommensal
29-12-2004, 11:53
Hallo allerseits,

Bin gerade bei Runde 3 bei Eprog. Und habe beim compilieren folgendes Proglem:
Geld.java:72: <identifier> expected
static boolean eingabeCheck(eingabe)
^

Der ganze Teil sieht so aus:

static boolean eingabeCheck(eingabe)
{
boolean syntax = false;
int operatoren = 0;

for (int h=0; h<eingabe.length ; h++)
{
if (eingabe.charAt(h)=='+' || eingabe.charAt(h)=='-')
if (eingabe.charAt(h-1)!="A" && eingabe.charAt(h-1)!="B" && eingabe.charAt(h-1)!="C" && eingabe.charAt(h-1)!="D")
syntax = true;

if (eingabe.charAt(h)=='=')
if (eingabe.charAt(h+1)!="A" && eingabe.charAt(h+1)!="B" && eingabe.charAt(h+1)!="C" && eingabe.charAt(h+1)!="D")
syntax = true;
else if (eingabe.charAt(h-1)!="A" && eingabe.charAt(h-1)!="B" && eingabe.charAt(h-1)!="C" && eingabe.charAt(h-1)!="D")
syntax = true;

if (eingabe.charAt(h)=='+' || eingabe.charAt(h)=='-')
operatoren++;
}

if (operatoren>4)
syntax = true;

return syntax;
}

Bin noch sehr jungfräulich in Sachen programmieren. Aber bitte wer kann mir sagen woran es da scheitert?! :shinner:

templar
29-12-2004, 12:11
Du musst bei einer Funktion auch immer den Typ der Parameter angeben, also:

static boolean eingabeCheck(String eingabe)

Paulchen
29-12-2004, 12:17
eprog-forum: http://www.informatik-forum.at/forumdisplay.php?f=12
und bitte zwecks lesbarkeit CODE-tags verwenden

kommensal
29-12-2004, 13:37
Ganz Lieb!! :)

kommensal
29-12-2004, 17:45
:ahhh:

Hab ein neues Problem:

static char[] getOperatoren(String eingabe)
{
char[] op;
int oper = 0;

for ( int i=0 ; i<eingabe.length() ; i++)
{
if (eingabe.charAt(i)=='+')
{op[oper]='+'; oper++;}
if (eingabe.charAt(i)=='-')
{op[oper]='-'; oper++;}
}
return op;
}

Bekomme folgende Meldung:
variable op might not have been initialized
return op;

das steht aber für jede zeile, in der op vorkommt.
Was könnte da hin sein?

MfG und danke im voraus.

Paulchen
29-12-2004, 17:52
der compiler überprüft, ob einer variable schon ein wert zugewiesen wurde, bevor du ihren wert abrufst. "variable op might not have been initialized" heißt hier, da es sich um ein array handelt, dass das array noch nicht dimensioniert wurde, d. h. du musst eine größe für dieses array angeben:
char[] op = new char[...];
wobei du an stelle der punkte die gewünschte größe schreibst.

a9bejo
29-12-2004, 19:43
http://www.informatik-forum.at/showpost.php?p=140998&postcount=3

kommensal
29-12-2004, 21:08
Ich glaub ich bin beschränkt.

static double getCash(double ErgebnisB,char waehrung)
{
double Bares;
double kursAB = 7.5;
double kursCB = 3.5;
double kursDB = 0.5;

if (waehrung=='A')
Bares=ErgebnisB/kursAB;
if (waehrung=='B')
Bares=ErgebnisB;
if (waehrung=='C')
Bares=ErgebnisB/kursCB;
if (waehrung=='D')
Bares=ErgebnisB/kursAB;

return Bares;
}


Der Fehler ist wieder:
variable Bares might not have been initialized.
bezogen auf die zeile mit dem return.

Paulchen
29-12-2004, 21:14
schreibe nicht
double Bares;
sondern
double Bares=0;
und das problem ist behoben.

außerdem: wäre es nicht einfacher, statt

if (waehrung=='A')
Bares=ErgebnisB/kursAB;
if (waehrung=='B')
Bares=ErgebnisB;
if (waehrung=='C')
Bares=ErgebnisB/kursCB;
if (waehrung=='D')
Bares=ErgebnisB/kursAB;

folgendes zu schreiben:

switch(waehrung) {
case 'A': Bares=ErgebnisB/kursAB; break;
case 'B': Bares=ErgebnisB; break;
case 'C': Bares=ErgebnisB/kursCD; break;
case 'D': Bares=ErgebnisB/kursAB; break;
}
und außerdem zweifle ich daran, dass

if (waehrung=='D')
Bares=ErgebnisB/kursAB;
stimmt

kommensal
29-12-2004, 21:35
Hab ich schon gemacht. Danke trotzdem.
Lässt sich jetzt endlich auch compilieren.
Andere Sache ist, dass ich dauernd FALSCHE EINGABE kommt.
Langsam finde ich es schon witzig daran herum zu basteln. :shinner:

MfG

nautiLus
29-12-2004, 23:44
Hi, ich glaube es wäre sogar auch noch kürzerer Code wenn man gleich die returns definiert:


switch(waehrung) {
case 'A': return ErgebnisB/kursAB;
case 'B': return ErgebnisB;
case 'C': return ErgebnisB/kursCD;
case 'D': return ErgebnisB/kursAB;
}

Ciao Nauti

kommensal
30-12-2004, 22:51
Also, nachdem sich das ganze endlich compilieren lies, hab ich jetzt natürlich einen Laufzeitfehler, welcher da lautet:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException; String index out of range: 4

at java.lang.String.substring(String.java1765)
at Geld.main(Geld.java:33)

der abschnitt auf den verwiesen wurde is folgender:


for (int k=0 ; k<betraege.length-1 ; k++)
werte[k]=Integer.decode(betraege[k].substring(0,betraege.length-1));


Beträge is das array, indem die Teilstrings gespeichert sind die nach dem splitten entstanden sind. Ein solcher Teilstring is zB:
300B oder 250A oder nur A (am schluss der eingabe).

Held, I need somebody!!:shinner:

Paulchen
30-12-2004, 23:31
beträge.length-1 nimmt den wert 4 an, betraege[k] ist aber nur 4 zeichen lang und endet daher mit dem zeichen mit dem index 3
schreib statt betraege.length mal betraege[k].length(), vielleicht gehts dann

EDIT: ...

kommensal
31-12-2004, 01:28
Nur kommt statt 4 der wert -1 bei String index out of range. Verdammt nochmal. Es ist ein Fluch!!

Paulchen
31-12-2004, 11:44
ok, vielleicht hab ich mich missverständlich ausgedrückt
so funktionierts nicht?
for (int k=0 ; k<betraege.length-1 ; k++)
werte[k]=Integer.decode(betraege[k].substring(0,betraege[k].length()-1));

kommensal
31-12-2004, 18:54
Trotzdem funktionierts nicht. eben wegen der Fehlermeldung die ich oben geschrieben hab. Ich bin verzweifelt.

kommensal
31-12-2004, 19:05
Hab gerade ein paar testläuft gemacht.
Bei folgenden Eingaben, passiert dass:
300 --> Falsche Eingabe (Würde ja stimmen)
300A --> String index out of Range: 3
300A-500B --> String index out of Range: 7

Immer bezogen auf die Zeile die ich oben geschrieben hab.
Vielleicht Stimmt ja was beim beim splitten der Eingabe ned(glaub ich aber ned)

String[] betraege = eingabe.split("[+-=]");

Sollte doch stimmen, oder??

MfG

Ps: Frohes neues Jahr

kommensal
02-01-2005, 18:55
static double[] getZahlen(String[] betraege, int[] werte)
{
//Definierung der Umrechnungskurse
double kursAB = 7.5;
double kursCB = 3.5;
double kursDB = 0.5;
double[] geldB = new double[5];

for (int i=0 ; i<betraege.length ; i++)
{
if (betraege[i].charAt(betraege.length-1)=='A')
geldB[i]=werte[i]*kursAB;
else if (betraege[i].charAt(betraege.length-1)=='B')
geldB[i]=werte[i];
else if (betraege[i].charAt(betraege.length-1)=='C')
geldB[i]=werte[i]*kursCB;
else if (betraege[i].charAt(betraege.length-1)=='D')
geldB[i]=werte[i]*kursDB;
}
return geldB;
}


in der Zeile mit dem If sagt er mit beim ausführen einen Fahler und zwar StringIndexOutOfBoundsException.
Womit kann das zudammen hängen??

Paulchen
02-01-2005, 20:40
ich glaube, dein problem liegt nach wie vor darin, dass es zwei verschiedene ausdrücke gibt, in denen betraege und length vorkommen:

betraege.length liefert die anzahl der elemente im array betraege
betraege[i].length() liefert die länge des strings, der im array betraege als i-tes element gespeichert ist.

Poppe
02-01-2005, 23:25
for (int i=0 ; i<betraege.length ; i++)
if (betraege[i].charAt(betraege.length-1)=='A')
//...
nehmen wir an betraege hat die 3 elemente, nämlich:
"1", "2" und "3"
nun soll die schleife betraege.lengt() mal durchlaufen werden, sprich 3 mal, also von i = 0 bis i = 2 und beim letzten durchlauf passiert folgendes:
der comp sucht betraege[2].charAt(betraege.length-1)
es gilt aber: (betraege.length-1) = 2 daher sucht der comp betrage[2].charAt(2).
betrage[2] enthält aber nur einen String, der nur aus einem Zeichen besteht, welches den Index 0 hat.
Daher gibt es kein Zeichen bei charAt(2) -> StringIndexOutOfBoundsException

Hab ich ins Schwarze getroffen?:confused:

jack83
03-01-2005, 00:05
Immer bezogen auf die Zeile die ich oben geschrieben hab.
Vielleicht Stimmt ja was beim beim splitten der Eingabe ned(glaub ich aber ned)
Schreib doch überall wo Fehler auftreten ein EprogIO.println(), wo die Daten ausgegeben werden die gerade verarbeitet werden. Das hilft oft sehr viel, um die Fehlerquelle zu finden.

Dann natürlich wieder löschen wenn die der Fehler gefunden ist ;).

Lg Jack83

kommensal
03-01-2005, 11:49
Also, das Programm läuft und gibt bei richtiger Eingabe immer die richtigen Ausgabewerte aus. Allerdings gibt es da ein kleines Problem mit flaschen eingaben. Eine der Funktionen die flasche Eingaben erkennen soll is folgende:

static boolean eingabeCheck(String eingabe)
{
boolean syntax = false;
int operatoren = 0;

for (int i=0; i<eingabe.length() ; i++)
{
if (eingabe.charAt(i)=='+' || eingabe.charAt(i)=='-')
{
if (eingabe.charAt(i-1)!='A' && eingabe.charAt(i-1)!='B' && eingabe.charAt(i-1)!='C' && eingabe.charAt(i-1)!='D')
syntax = true;
else if (!Character.isDigit(eingabe.charAt(i+1)))
syntax = true;
}
else if (eingabe.charAt(i)=='=')
{
if (eingabe.charAt(i+1)!='A' && eingabe.charAt(i+1)!='B' && eingabe.charAt(i+1)!='C' && eingabe.charAt(i+1)!='D')
syntax = true;
else if (eingabe.charAt(i-1)!='A' && eingabe.charAt(i-1)!='B' && eingabe.charAt(i-1)!='c' && eingabe.charAt(i-1)!='D')
syntax = true;
}

if (eingabe.charAt(i)=='+' || eingabe.charAt(i)=='-')
operatoren++;
}

if (operatoren>4)
syntax = true;

return syntax;
}

ABER, wenn ich nun zB 300A++300A=A eingabe, scheint er syntax ned auf true zu setzten. Ich verstehs ned.
Ich weiß, dass dass eigentlich unnötig ist.

else if (!Character.isDigit(eingabe.charAt(i+1)))
syntax = true;


f (eingabe.charAt(i-1)!='A' && eingabe.charAt(i-1)!='B' && eingabe.charAt(i-1)!='C' && eingabe.charAt(i-1)!='D')
syntax = true;

weil das ein ++ ja schon erkennen sollte, aber anscheinend tuts keines von beiden.
:(

kommensal
03-01-2005, 11:51
Schreib doch überall wo Fehler auftreten ein EprogIO.println(), wo die Daten ausgegeben werden die gerade verarbeitet werden. Das hilft oft sehr viel, um die Fehlerquelle zu finden.

Dann natürlich wieder löschen wenn die der Fehler gefunden ist ;).

Lg Jack83 Hab ich gemacht. Dank diesem "17er-Schmäh" rennts ja jetzt (zumindest fast). :)