Warum funzt Prozedur nicht

Status
Nicht offen für weitere Antworten.

aVoX

Mitglied
Servus!

Wir müssen in der Schule folgende 3 Sortieralgorithmen programmieren:
*) Bubblesort
*) Selectionsort
*) Insertionsort

Da nach jedem Sortiervorgang das Array neu füllen (Zufallszahlen), darum mach ich da eine Prozedur, die ich dann im Programm aufrufen kann. Tja, die Prozedur funzt aber nicht :/
Hier ein Teil des Codes:
Code:
import java.util.Scanner;
public class Sortieralgorithmus {
	static int arFuellen (int[] ar) {	//Prozedur zum Arrayfüllen
		int grenze;
		Scanner eingabe = new Scanner(System.in);
		
		System.out.print("Obergrenze (für Zufallszahlen): ");
		grenze = eingabe.nextInt();
		for (int i = 0; i < ar.length; i++) {
			ar[i] = (int)(Math.random() * grenze) + 1;
		}
		
		System.out.println("Ausgabe unsortiert:");
		for (int i = 0; i < ar.length; i++) {
			System.out.print(ar[i]+"\t");
		}
		System.out.println();
	}
	public static void main (String[] args) {
		int[] ar = new int[5];
		int help, kleinst = 0;
		
		arFuellen(12);
		
		//	Bubblesort
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < (ar.length-1); j++) {
				while (ar[j] > ar[j+1]) {
					help = ar[j+1];
					ar[j+1] = ar[j];
					ar[j] = help;
				}
			}
		}
		System.out.println("Ausgabe sortiert (Bubblesort):");
		for (int i = 0; i < ar.length; i++) {
			System.out.print(ar[i]+"\t");
		}
		System.out.println("\n");
		
		//Erneutes Füllen des Arrays
		arFuellen(15);
...
.
.
Und die Fehlerbeschreibung:
Code:
arFuellen(int[]) in Sortieralgorithmus cannot be applied to (int)
 
>Warum sollte ich keine ints verlagnen, wenn es ein int-Array ist?

Das Versteh ich wiederum nicht.

Du kannst der Methode keinen Integer (eine Zahl) übergeben (zB 12 oder 15), wenn die Methode ein Array von
int verlangt (eine Menge von Zahlen). Sagt ja auch die Fehlermeldung ( int cannot be applied to int[] )

EDIT:
>arFuellen(12);

sollte wohl

arFuellen(ar);
sein.
 
Das [HIGHLIGHT="Java"]static int arFuellen (int[] ar)[/HIGHLIGHT]
sagt ja, dass die Methode ein int zurückgibt. Entweder das tust du (mit return <hier der int-Wert den du willst>; ) oder du änderst das ganze in static void arFuellen (int[] ar).
"void" zeigt an, dass nix zurückgegeben wird. Ich hab mir die Methode jetzt nicht angeguckt und weiß nicht, ob du wirklich was zurückgeben willst, kann ich mir aber bei dem Sinn, ein Array zu füllen, nicht vorstellen.
 
Ich hab's jetzt ohne Rückgabewert gemacht, also
Code:
	static void (int[] ar) {	//<-- Fehlerort
		Blockinhalt
	}
Jetzt bekomme ich einen "<identifier> expected"-Fehler
 
Zuletzt bearbeitet:
... und den funktionsnamen haben wir gleich mit entfernt? (edit... was solls, zu spät)
 
atomrofl... da hab ich mich wohl selfgepwnt xD

Edit:
Funzen tut's noch immer nicht 🙁 bin wohl zu l4me dafür

Wenn ich mitten im Code arFuellen(); eingebe, bekomme ich den Fehler "arFuellen(int[]) in Sortieralgorithmus cannot be applied to ()"
Hier nochmal der aktuelle Prozedurencode:
Code:
	static void arFuellen (int[] ar) {	//Prozedur zum Arrayfüllen
		int grenze;
		Scanner eingabe = new Scanner(System.in);
		
		System.out.print("Obergrenze (für Zufallszahlen): ");
		grenze = eingabe.nextInt();
		for (int i = 0; i < ar.length; i++) {
			ar[i] = (int)(Math.random() * grenze) + 1;
		}
		
		System.out.println("Ausgabe unsortiert:");
		for (int i = 0; i < ar.length; i++) {
			System.out.print(ar[i]+"\t");
		}
		System.out.println();
	}
Funzen soll's so:
Immer wenn die Prozedur aufgerufen wird, soll der User eine Obergrenze für die Zufallszahlen eingeben, danach wird gleich eine unsortierte Ausgabe der Arrays durchgeführt.
 
Zuletzt bearbeitet:
Funktioniert doch...
du musst die Methode halt mit einem int-Array aufrufen.

Nur du hast einen kleinen Denkfehler: das +1 bei der Zuweisung einer zufälligen Zahl
kommt weg.

Denn Math.random() kann 1.0 zurückliefern. -> 1.0 * grenze +1 = grenze +1
 
... funktioniert allerdings nur soweit, wie per gepostetem Code nachvollziehbar...
Die Fehlermeldung oben sagt aus, das "arFuellen(int[] ar)" irgendwo ohne Parameter aufgerufen wird. Möglicherweise im nicht gepostetem Code der beiden anderen Algos?
 
Es gibt einen Unterschied zwischen der Definition einer Methode, und dem Aufruf.

Was du da gepostet hast, ist eine Methoden-Definition mit Rumpf.

D.h. es gibt diese Methode, und wenn man sie aufruft, passiert das, was drin steht.

Sie erwartet Parameter, das ist das in den runden Klammern.

Und zwar ein Array, was du ihr wolh nicht gibts. Aufruf:

[HIGHLIGHT="Java"]arFuellen(); // FALSCH! Die Methode braucht ein int-Array
arFuellen(new int[5]); // Richtig
[/HIGHLIGHT]

edit:
(glaub ich das nur, oder bin ich wirklich zu doof dafür?)
Definiere "doof" 😉
 
Aufruf:

[HIGHLIGHT="Java"]arFuellen(); // FALSCH! Die Methode braucht ein int-Array
arFuellen(new int[5]); // Richtig
[/HIGHLIGHT]
Aber die Sache zum Eingeben steht ja auch IN der Methode, warum muss ich dann schon herraussen die Größe bestimmen?
edit:

Definiere "doof" 😉
Code:
String doof;
doof = "Der versteht's nach hunterttausend erklärungen einfach nicht der Depp!";

if (meinJavaVerständnis.equals(doof)) {
    System.out.println(doof);
} else {
    System.out.println("Soo doof biste nun auch wieder net...");
}

Edit:
Na nu!? Soll ich jetzt besser HIGHLIGHT anstatt CODE benutzen, wenn ich einen Code posten will?
 
Was du doch in der Methode eingibst, soll eine Obergrenze für Zahlenwerte sein,
mit denen ein Array befüllt wird, oder?

Nun leider gibt es kein Array. Was du in den runden Klammern bei einer Methoden-
Definition schreibst, ist nur das, was du dann in der Methode benutzen kannst.

Aber was soll das denn sein? Einfach nur

[HIGHLIGHT="Java"]int[] a[/HIGHLIGHT]

ist kein gültiger Befehl, das erzeugt dir kein Array. D.h. alles was in runden Klammern
steht musst du beim Aufruf, von aussen, übergeben.
Du legst ja nirgendwo fest, wie gross das Array sein soll (also wieviele Fächer es hat).

Oder meintest du das mit deiner "Grenze"?

Wie auch immer: Das in den runden Klammern ist "nix", das definiert nur was die Methode
erwartet und unter welchem Namen du innerhalb des Rumpfes darauf zugreifen kannst.

In deinem Fall kannste die Klammern auch leer lassen, aber dann musst du in der Methode
erstmal ein neues Array anlegen.

Ein Array muss so erzeugt werden:

[HIGHLIGHT="Java"]Datentyp[] name = new Datentyp[anzahlFächer];[/HIGHLIGHT]

So, und jetzt erst kannst du das benutzen.
 
Wenn ich jetzt am Anfang der Methode
[highlight] static void arFuellen (int[] ar = new int[5]) { //Prozedur zum Arrayfüllen[/highlight]
schreibe bekomme ich fast alle vorstellbaren Fehler, die es gibt.
Funktionieren soll die Sache so: Immer wenn arFuellen() aufgerufen wird, wird der Benutzer aufgefordert ein Zufallszahl-Maximum einzugeben, danach wird das komplette ar[] mit Zufallszahlen gefüllt.
 
Das ist auch ziemlich nah dran an unvorstellbar falsch 🙂

Deklarier die Methode einfach so
[HIGHLIGHT="Java"]static void arFuellen ()[/HIGHLIGHT]
Dann erwartet sie nichts, du kannst sie mit arFuellen(); aufrufen. Nach den wichtigen Daten wird ja dann innerhalb der Methode gefragt.
 
Jetzt kommt der Fehler:
[highlight=Java]static void arFuellen () { //Prozedur zum Arrayfüllen
int grenze;
Scanner eingabe = new Scanner(System.in);

System.out.print("Obergrenze (für Zufallszahlen): ");
grenze = eingabe.nextInt();
for (int i = 0; i < ar.length; i++) { //CANNOT FIND SYMBOL VARIABLE AR
ar = (int)(Math.random() * grenze) + 1;
}

System.out.println("Ausgabe unsortiert:");
for (int i = 0; i < ar.length; i++) {
System.out.print(ar+"\t");
}
System.out.println();
}[/highlight]
 
[highlight=Java]static void arFuellen (int[] ar) { //Prozedur zum Arrayfüllen
int grenze;
Scanner eingabe = new Scanner(System.in);

System.out.print("Obergrenze (für Zufallszahlen): ");
grenze = eingabe.nextInt();
for (int i = 0; i < ar.length; i++) { //CANNOT FIND SYMBOL VARIABLE AR
ar = (int)(Math.random() * grenze) + 1;
}

System.out.println("Ausgabe unsortiert:");
for (int i = 0; i < ar.length; i++) {
System.out.print(ar+"\t");
}
System.out.println();
}
[/highlight]
Das entfernen jeglicher sinnvoller parameter hat dem atomgeroflten selfgepwnden aVoX welcher pr0f1h4ck3r hier empfohlen? -.-

Übrigens: Ich würde dringend empfehlen, das alles in viel kleinere methoden aufspalten.
1) methode die ein array mit zahlen aus dem intervall [x,y] füllt
(keine eingaben, kein System.out-gelaber)
2) Diese "Ausgabe" ist unnötig, dafür gibt es schon Arrays.toString(int[])
3) das ganze dann erst in einer weiteren userinterface-methode verwenden (die darf dann wieder labern)
 
Zuletzt bearbeitet:
Das Entfernen der Paramter ist hier nicht wirklich falsch, denn es ist eine
statische, man könnte fast Test-Methode sagen.
Für ihn hat es in diesem Anwendungsfall kaum Sinn das von außen zu übergeben,
eig. könnte er alles in die main schreiben.
Das Weglassen wurde empfohlen um zu sehen ob er es so hinkriegt.

Naja ich hab ja grad die Links gepostet, man kann jetz denk ich noch lange
labern, richtig verstehen würde er es eh nicht.

edit
hat dem atogeroflten selfgepwnden aVoX welcher pr0f1h4ck3r
...das hab ich mir auch schon gedacht, wollt mal nix sagen 😉
 
Das bezweifle ich ganz stark. Das ist nicht ein Problem in dem Sinne.
Dein Problem ist, dass du hier nicht gültige Java Syntax schreibst.
Egal wie scheiße ein Buch sein mag, das muss es wohl erklären...

Aber egal: Lies dir die Links durch, bzw. die ganze erste Hälfte der Java-Insel.
Dann verstehst du es auch.

Ich könnte dir jetzt die Lösung posten, aber du könntest es nur hinnehmen,
dass es dann geht, und nicht verstehen. Das bringt ja nix.
 
@hdi:
Ich habe mir schon "Sprechen Sie Java?" gekauft, aer da ist keine Lösung zum Problem drin.
omg... Java Insel: ist IMMER aktualisiert, bereits in der 8. Auflage, und liegt kostenlos als openbook herum, und du kaufst dir dieses "Sprechen Sie"-Dingsbums... :noe:

"Neu", "3. Auflage", "2005", "Java5"... Das ist schon eher antiquität, du kaufst dir ja kein Buch über Latein, an Java wird doch dauernd rumgeschraubt.

Aber dennoch: dass dort nichts über Arrays, Methoden und Variablen erzählt wird, das glaube ich dir nicht. Basics über den Sprachkern passen auf höchstens 50 Seiten, und für ~30€ sollte das buch wesentlich mehr als 50 Seiten beinhalten.
 
Das entfernen jeglicher sinnvoller parameter hat dem atomgeroflten selfgepwnden aVoX welcher pr0f1h4ck3r hier empfohlen? -.-

Soll ich jetzt ernsthaft nochmal laut ICH rufen? Zu deiner Verteidigung muss ich sagen, dass ich den Code nur überflog und davon ausging, dass er in der Methode auch nach der Größe des Arrays fragt.
Aber die Sache zum Eingeben steht ja auch IN der Methode, warum muss ich dann schon herraussen die Größe bestimmen?
--> daraus resultierte meine falsche Annahme. Das Array zu erzeugen, bevor er nach der Größe fragt, wäre ja reichlich unsinnig.
Vielleicht wird das ja alles besser, wenn er sich die empfohlenen Kapitel durchliest.
Aber mal nebenbei: Der Code, den du oben postest, ist doch der gleiche, wie der, mit dem die Sache hier gestartet ist oder? Vielleicht sind auch die Empfehlungen, alles aufzuteilen eher am Problem vorbei, wenn der TE hier die Grundlagen nicht beherrscht und sicher froh ist, wenn es einmal klappt... Na ja.
 
Also in meinem Buhs steht, dass eine Methode, die keinen Wert zurückgibt (also mein Fall) den Header
[highlight=Java]static void Name() {
Blockinhalt
}[/highlight] hat.
Selbiges steht in meinem Kot...hust...Code drinn, aber funzen tuts nicht :-|

Edit:
Na schön, dann lösch ich eben das Methode-Funktions-Klassen-Dingsbumms am Anfang des Programmes und schreib den Teil überall händisch hinzu.
Besser ich verstehs nicht und mach's nicht, als ich versteh's nicht und mach irgendwas, tja, dann muss ich eben eine Seite mehr ausdrucken, aber daran soll's nicht scheitern.

Edit2:
@unter mir:
Was ist eine Methoden-Defitnition? Der bescheuerte Code-Block an dem ich schon seit einer Woche arbeite
Was ist eine Methoden-Implementierung? Der Inhalt des Code-Blocks
Was ist ein Methoden-Aufruf? Das folgende: FunktionsName(Par1[,Par2,{Par3, usw]});

Edit3:
Ich hätte ne Idee woran's liegen könnte (kreuzigt mich nicht, wenn's falsch ist)
Vllt. darf ich die Funze nicht ZWISCHEN public class Name und public static void main(String[] args) schreiben, sindern erst nach dem public static void main(String[] args)
 
Zuletzt bearbeitet:
Naja du kannst ihm ja nicht vorwerfen dass er sich dieses Buch gekauft hat.
Du bist auch nicht auf die Welt gekommen und hast den Link zur Java-Insel
ans Krankenbett getaggt.

Aber er sollte nun umsteigen, und sein altes Buch liegen lassen.

edit: und dein Bsp hat ja wohl nix mit deinem Problem zu tun.
Soll das alles sen, was dein Buch über Methoden zu sagen hat?
Also...lies mal das ganze Kapitel durch.

Vllt hast du meinen Post weiter oben überlesen:
Was ist eine Methoden-Defitnition?
Was ist eine Methoden-Implementierung?
Was ist ein Methoden-Aufruf?
 
..ich seh jetz erst deine edits:

Na schön, dann lösch ich eben das Methode-Funktions-Klassen-Dingsbumms am Anfang des Programmes und schreib den Teil überall händisch hinzu.
Ich hoffe mal stark dass das nicht dein Ernst ist. Wenn doch, biste hier eh falsch sry..
 
Ich hoffe mal stark dass das nicht dein Ernst ist. Wenn doch, biste hier eh falsch sry..

Joa, ich war vorher total am Ende. Seit einer Woche hock ich an diesem Dreck und funzen tuts noch immer nicht, aber ich gugg mir mal die FAQ an
heildir.gif


Edit
Hab den Thread jetzt durchgelesen und verstanden.
Mein einziges Problem jetzt: Das Array ar kann außerhalb der Funktion nicht gefunden werden, obwohl ich es auch außerhalb deklariere und wenn ichs in der Funktion deklariere passiert dasselbe

Lest denn das keiner mehr?
 
Zuletzt bearbeitet:
**PUSH**
Auch wenn ich das Programm jetzt nicht mehr brauche, würde ich gerne wissen, was ich falsch gemacht habe!
 
Nochmal allgemein:
Wenn eine Methode mit irgendeiner Variablen rumrechnen soll, sprich sie nutzt für
ihre Aufgabe ein Objekt oder ein Primitiv, das irgendwo abgespeichert ist (und das ist bei fast jeder Methode so)
dann hast du 2 Möglichkeiten dies zu realieren:

1) Die Methode ist in der Lage, sich die Variable selbst zu erstellen, oder aber
die Methode hat direkten Zugriff auf die Variable, ohne dass man sie ihr mitgeben
muss (zB Getter auf Member-Variablen)

In diesem Fall ist ihre Parameter-Liste also leer (in den runden Klammern steht nix),
und aufrufen tut man sie entsprechend auch ohne etwas "mitzugeben".

2) Die Methode soll etwas mit einem Objekt tun, auf das sie keinen direkten Zugriff
hat.
In diesem Fall muss man in ihrer Parameterliste sagen, was sie bekommt. Bsp:

[HIGHLIGHT="Java"]public static int addiere(int a, int b){
return a+b;
}[/HIGHLIGHT]

Wenn man sie jetzt aufruft muss man sich an diese Parameterliste halten:

[HIGHLIGHT="Java"]addiere(4,2); // ok
addiere(); // falsch
addiere(23); // falsch[/HIGHLIGHT]

und vorallem zu beachten:

[HIGHLIGHT="Java"]addiere(int 5, int 8); // ganz falsch!![/HIGHLIGHT]

In deinem Bsp sieht deine Methode so aus:

[HIGHLIGHT="Java"]public static void tueEtwasMitEinemArray(int[] array){
...
}[/HIGHLIGHT]

Beim Aufruf musst du also ein int-Array mitgeben:

[HIGHLIGHT="Java"]int[] dieserNameHatNixMitDemNamenInDerMethodeZuTun = new int[10];
tueEtwasMitEinemArray(dieserNameHatNixMitDemNamenInDerMethodeZuTun);[/HIGHLIGHT]

Wichtig ist eben dass du verstehst, dass dieses "array" nur irgendein Name ist,
unter dem du das mitgegebene Objekt innerhalb deiner Methode ansprechen kannst.
Von aussen kannst du etwas übergeben das total anders heisst, es muss nur
ein int-array sein.

Wenn du das noch immer nicht so ganz verstehst, poste mal deinen Code wie
er zuletzt war mit diesem Fehler.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben