Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Parameteruebergabe » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Zum Ende der Seite springen Parameteruebergabe
Beiträge zu diesem Thema Autor Datum
 Parameteruebergabe neuling96 09.12.2014 22:32
 RE: Parameteruebergabe eulerscheZahl 10.12.2014 14:29
 RE: Parameteruebergabe neuling96 10.12.2014 16:09
 RE: Parameteruebergabe eulerscheZahl 10.12.2014 16:24
 RE: Parameteruebergabe neuling96 19.12.2014 17:39
 RE: Parameteruebergabe neuling96 10.12.2014 17:30
 RE: Parameteruebergabe eulerscheZahl 10.12.2014 17:38
 RE: Parameteruebergabe neuling96 10.12.2014 18:37
 RE: Parameteruebergabe eulerscheZahl 19.12.2014 18:52

Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
neuling96
unregistriert
Parameteruebergabe Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Welche Ausgabe erzeugt das Programm? Begründen Sie Ihre Antwort ausführlich. Geben Sie Ihre Losung in
einer Datei Parameteruebergabe.txt ab.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
public class Parameteruebergabe {
static String a = "A";
static String b = "B";
static String[] ab = { a, b };
public static void swap(String s0, String s1) {
String temp = s0;
s0 = s1;
s1 = temp;
}
public static void swap(String[] s) {
String temp = s[0];
s[0] = s[1];
s[1] = temp;
}
public static void proverb() {
System.out.println("Wer " + a + " sagt, muss auch " + b + " sagen!");
System.out.println("Also muss auch " + ab[0] + " sagen, wer " + ab[1]
+ " sagt?");
}
public static void main(String[] args) {
proverb();
swap(a, b);
proverb();
swap(ab);
proverb();
}
}



Fangen wir mit

proberb(); an

das liefert:
Wer A sagt, muss auch B sagen!
Also muss auch A sagen, wer B sagt?

Problem habe ich hier

swap(a, b);
diese Methode ist def. und macht, aber wie setzte ich mein Programm das ein?

Vermutung:
swap(a, b); greift auf


und liefert

public static void swap(String s0, String s1) {
String temp = s0;
s0 = s1;
s1 = temp;
}

die vertauschung von a und b dann wird auf

proberb();
zugegriffen
und liefert

Wer A sagt, muss auch B sagen!
Also muss auch A sagen, wer B sagt?


soweit, richtig?
09.12.2014 22:32
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Es ist (finde ich) etwas wirr, deine Erklärung zu lesen.
Die Ausgabe ist:
Zitat:
Wer A sagt, muss auch B sagen!
Also muss auch A sagen, wer B sagt?
Wer A sagt, muss auch B sagen!
Also muss auch A sagen, wer B sagt?
Wer A sagt, muss auch B sagen!
Also muss auch B sagen, wer A sagt?

Die ersten beiden Blöcke hattest du ja schon, den 3. hast du nicht erwähnt.

Bei swap(a, b)
wird
code:
1:
2:
3:
4:
5:
public static void swap(String s0, String s1) {
	String temp = s0;
	s0 = s1;
	s1 = temp;
}

aufgerufen. Hier werden zwar Strings vertauscht. Allerdings handelt es sich dabei um lokale Kopien, die nach Beenden der Funktion wieder weg sind.

Wird ein Array übergeben, handelt es sich nicht um eine Kopie, sondern um einen Verweis auf das Array. (Grund ist der, dass sonst mitunter große Datenmengen kopiert werden müssten). Daher zeigt die Vertauschung hier auch Wirkung für den Rest des Programms.

__________________
Syntax Highlighting fürs Board (Link)
10.12.2014 14:29 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

mir wird einfach nicht klar wann man
call by value und call by reference benutzt!
in java ja i.d.r call by value, aber wann reference

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public static void swap(int[] a , int[] b ) {
	int [] temp = a;
	b= a;
	b[0] = 42;
}
public static void main(String[] args) {
int[] x = new int [] {0,1}
int[] y = new int []  { 2,3}
swap(x,y);


was ist der Inhalt der variablen nach der Ausführung swap(x,y)?

Call of value-> alles bleibt beim alten!?
10.12.2014 16:09
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Da hast du dir gleich ein kompliziertes Beispiel rausgesucht:
Bei Arrays wird die Adresse übergeben, wo im Speicher sie stehen. Die Adresse wiederum wird aber per-value übergeben.
Ergo: wenn du b= a; schreibst, hat das nur Auswirkung auf die aktuelle Funktion.
Das heißt zum einen, dass b nach der Funktion unverändert vorliegen wird (wir haben keine Speicheradresse mehr von b in spaw, können also nichts mehr reinschreiben).
Zum anderen wird jetzt mit b[0] = 42 das geändert, was der Funktion als a übergeben wurde.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
	int[] a = new int [] {0,1};
	int[] b = new int []  { 2,3};
	swap(a,b);
	System.out.println("a = " + Arrays.toString(a));
	System.out.println("b = " + Arrays.toString(b));

Ausgabe:
a = [42, 1]
b = [2, 3]


Allgemein gilt:
Werte werden mit call-by-value übergeben.
Arrays und Klassen werden mit call-by-reference übergeben, wobei die Reference selbst wiederum ein value ist, was heißt, dass du die reference nicht ändern kannst.

__________________
Syntax Highlighting fürs Board (Link)
10.12.2014 16:24 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Zitat:
Original von eulerscheZahl
Da hast du dir gleich ein kompliziertes Beispiel rausgesucht:
Bei Arrays wird die Adresse übergeben, wo im Speicher sie stehen. Die Adresse wiederum wird aber per-value übergeben.
Ergo: wenn du b= a; schreibst, hat das nur Auswirkung auf die aktuelle Funktion.
Das heißt zum einen, dass b nach der Funktion unverändert vorliegen wird (wir haben keine Speicheradresse mehr von b in spaw, können also nichts mehr reinschreiben).
Zum anderen wird jetzt mit b[0] = 42 das geändert, was der Funktion als a übergeben wurde.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
	int[] a = new int [] {0,1};
	int[] b = new int []  { 2,3};
	swap(a,b);
	System.out.println("a = " + Arrays.toString(a));
	System.out.println("b = " + Arrays.toString(b));

Ausgabe:
a = [42, 1]
b = [2, 3]


Allgemein gilt:
Werte werden mit call-by-value übergeben.
Arrays und Klassen werden mit call-by-reference übergeben, wobei die Reference selbst wiederum ein value ist, was heißt, dass du die reference nicht ändern kannst.


irgendwie macht mir das noch zuschaffen folgendes habe ich im skript gelesen

"Werden statische Variablen von einem Objekt verändert, ist diese
Veränderung auch in allen anderen Objekten der gleichen Klasse
sichtbar"

d.h in diesem bsp würde die statsiche variable vom objekt- verändernd?
19.12.2014 17:39
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

kannst du bitte ein bsp/code geben für
"Klassen werden mit call-by-reference übergeben"
10.12.2014 17:30
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
public class Main {	
	public Main() {
		MeineKlasse instanz = new MeineKlasse();
		instanz.a = 3;
		System.out.println("a = " + instanz.a);
		changeVal(instanz);
		System.out.println("a = " + instanz.a);
	}
	
	private class MeineKlasse {
		public int a;
	}
	
	public static void changeVal(MeineKlasse instanz) {
		instanz.a++;
	}
	
	public static void main(String[] args) {
		new Main();
	}
}

/*Ausgabe:
a = 3
a = 4
*/

Es wird eine Klasse als Funktionsargument übergeben. Wenn ein Wert in dieser Klasse geändert wird, so hat das auch Gültigkeit für die Funktion, in der die Variable erzeugt wurde.

__________________
Syntax Highlighting fürs Board (Link)
10.12.2014 17:38 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

danke Daumen hoch
10.12.2014 18:37
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Der zitierte Auszug handelt von einem anderen Thema:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
public class Main {
	public Main() {
		MyClass instanz1 = new MyClass();
		MyClass instanz2 = new MyClass();
		instanz1.printX(); //1
		instanz2.setX(2);
		instanz1.printX(); //2
	}
	
	
	public static class MyClass{
		public static int x = 1;
		
		public void printX() {
			System.out.println(x);
		}
		
		public void setX(int x) {
			MyClass.x = x;
		}
	}
	
	public static void main(String[]args)
	{
		new Main();
	}
}

du siehst: instanz2 hat die Variable geändert, aber instanz1 zeigt plötzlich ein anderes Ergebnis an.

__________________
Syntax Highlighting fürs Board (Link)
19.12.2014 18:52 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Informatiker Board » Themengebiete » Praktische Informatik » Parameteruebergabe