Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo, ich hänge jetzt seit 3 Stunden an einem vermutlich trivialen Problem und komme einfach nicht weiter!
Kleine Skizze:
Klassenvariable a=2
Methode 1 bekommt eine variable extern und setzt dann a= variable
Methode 2 benötigt den wert aus methode 1.
Das Problem: Methode 2 nimmt immer den Wert von A zur berechnung und nicht den neuesn aus der ersten Methode!
Hier mal der Code inkl Kommentaren (das projekt selbst hat mehrere klassen):
Variable a:
Java:
Skalierer X = new Skalierer(10);
Methode1:
Java:
public void skalierer( Skalierer S){
this.X.s=S.s; //die Variable X soll durch den Wert von S ersetzt werden
}
Methode2:
Java:
public void kreis (Kreis k){
System.out.println("Skalierer X ist jetzt im kreis"+X.s); //spuckt hier immer 10aus, nie den Wert von S
k.r=k.r * X.s; //hier bräuchte man aber S....
}
HILFE! Wo ist da der Wurm drin?
Wenn gewünscht, kann ich auch das gesammte Projekt hier reinstellen, das ist allerdings etwas verschachtelt!
Der Fehler muss irgendwo anders liegen, denn die von dir gezeigten Ausschnitte sind korrekt. Mein Guess: du hast zwei verschiedene Objekte, und machst sowas:
Java:
DeineKlasse a = new DeineKlasse();
DeineKlasse b = new DeineKlasse();
a.skalierer(new Skalierer(5));
b.kreis(new Kreis()); // obwohl du wohl a.kreis(new Kreis()) machen willst
Ich formuliere es mal ohne die komischen datentypen, ich möchte es so machen:
Java:
class xy {
int a = 1;
public void skalierer (int s) {
a=s;
}
public void kreis (int k){
k*a;
/*
Beispiel: S = 2, k =5
Er spuckt mir aus 5*1=5
Er sollte aber 5*2=10 auswerfen!
wo ist der Fehler!?
*/
}
Du machst einen Fehler beim Aufrufen der Methoden o.ä. Der Code ist nämlich wieder okay und sollte das gewünschte Ergebnis liefern.
Zeig mal wie du das ganze getestet hast.
Der liegt in der Berechnung! Es wird immer der Wert von dem festen Skalierer in der Klasse EnthaeltPunkte genommen(hier die 10)...aber nie der aus der methode die ich eingebaut habe!
wenn du die Methode aufrufst, ja. Aber einfach so, aus Geisterhand? Nein. Überleg mal, was denkst du denn steht in x drinnen? Woher soll er da einen Wert haben?
Also:
Java:
class Test{
int b=5;
void aendern (int x){
this.b=x; // mit this hat das übrigens nichts zu tun, du kannst auch schreiben b = x;
}
}
Java:
Test t = new Test(); // t.b = 5
t.aendern(12); // t.b = 12
Damit müsste doch b global den wert von x erhalten oder?
Ja das ergibt alles Sinn, hätte ich auch so gemacht. Allerdigns ist bei diesem Projekt (für die Uni) diese ganze Klassenhierarchie vorgegeben und ich kann sogesehen kein Testobjekt extra erzeugen.
Die Main erzeugt ein Skaliererobjekt welches die Impelementierung aus FormBesucher zieht und mit dem muss ich irgendwie dann in der EnthaeltPunkte-Klasse arbeiten. Ich weiss nur nicht wie ich dieses übergeben Skaliererobjekt in der Methode kreis() nutzen soll.
//edit:
Also die Funktion skalierer(); wird in der main VOR der kreis() methode aufgerufen,...vond aher müsste dann doch der Wert bereits geändert sein oder?
Nein wird sie nicht. Wenn man sich eine Meldung in die Methode skalierer() einbaut und das Programm startet ist die Ausgabe die folgende:
Skalierer X ist jetzt im kreis10.0
kreis vorher0.5
kreis danach5.0
quad vorher1.0
quad danach10.0
------ Aufruf der Methode skalierer() ----------
true
In der main() wird lediglich eine Instanz der Klasse Skalierer vor einer Instanz der Klasse Kreis erzeugt. Aber das sind eben Konstuktoren, und keine Methoden-Aufrufe.
Keine Ahnung, was ist denn der Sinn des Programms? Du musst halt Step by Step durch die Logik durchgehen, ausgehend von der ersten Zeile in der main(). Irgendwo wird halt zuerst die kreis() aufgerufen, obwohl du scheinbar vorher skalierer() aufrufen musst.
Na Sinn und zweck des Programms ist, dass man nen Kreis und n Quadrat eingibt und dann fragt ob ein gewisser punkt in einem von beidem liegt also die vereinigung.
Puh.. Hirnschlag :autsch: Man kann die Logik des Programms nur sehr schwer nachvollziehen. Ich kenne Uni-Aufgaben und ich weiß auch dass die gerne mal extrem schwachsinnig aufgezogen sind. Das sieht man in diesem Bsp auch sofort. Aber ich glaube du hast da auch schon irgendwo etwas falsch gemacht. Die ersten 5 Methoden-Aufrufe des Programms sind erstmal nur Delegationen, die jeweils ein Objekt nehmen, daraus irgendein anderes komisches Objekt bauen, noch etwas dazu packen was damit gar nichts zu tun hat, und das ganze irgendwo weiter in der Hierarchie rumreichen. Was soll das alles?
Nochmal: Was genau soll das Programm tun? Was ist die Aufgabenstellung? Und: Was habt ihr vorgegeben bekommen, was hast du selber geschrieben?
Der 'Sinn' darin soll liegen, dass man anhand der Implementierung solche Sachen wie Abstraktion oder Kapselung erklärt, ich mag das Programm auch überhaupt nicht aber es war halt vorgegeben.
Mag sein, das ich Ärger bekomm wenn ich das Übungsblatt hier hochlade aber ich riskiers einfach mal:
public class Grafik {
public static void main ( String args []) {
Form k = new Kreis ( 0.5);
Form q = new Quadrat ( 1.0);
//-------------------BEGINN EINGEFÜGTER CODE--------------------
int faktor = 100;
new Skalierer(k, faktor);
new Skalierer(q, faktor);
//-------------------ENDE EINGEFÜGTER CODE--------------------
Form v = new Vereinigung ( k, q);
EnthaeltPunkt b = new EnthaeltPunkt ( 0.5 , 0.5);
v. verarbeite (b);
System .out . println ( b. get_enhaelt_xy ());
}
}
Neue Klasse (unschön)
Java:
public class Skalierer {
public Skalierer(Form form, int faktor){
if(form.getClass().equals(Kreis.class)){
((Kreis)(form)).r*=faktor;
}
if(form.getClass().equals(Quadrat.class)){
((Quadrat)(form)).a*=faktor;
}
}
}
Läuft grundsätzlich - Problem ist halt die Implementierung...die darf ich halt so nicht machen. Mal schauen ob ich da noch was ändern kann damit ich die Vorgaben erfülle.
Hi nochmal!
Hoffe ich habe die Aufgabe 3b) jetzt richtig verstanden.
Meine Mainklasse...
Java:
public class Grafik {
public static void main ( String args []) {
Form k = new Kreis ( 0.5 );
Form q = new Quadrat ( 1.0);
//-------------------BEGINN EINGEFÜGTER CODE--------------------
FormBesucher skal = new Skalierer(1);
k.verarbeite(skal);
q.verarbeite(skal);
//-------------------ENDE EINGEFÜGTER CODE--------------------
Form v = new Vereinigung ( k, q);
EnthaeltPunkt b = new EnthaeltPunkt ( 0.5 , 0.5);
v. verarbeite (b);
System .out . println ( b. get_enhaelt_xy ());
}
}
Hier mein FormBesucher namens Skalierer
Java:
public class Skalierer implements FormBesucher{
private int faktor;
public Skalierer(int faktor){
this.faktor=faktor;
}
@Override
public void kreis(Kreis k) {
k.r *= faktor;
}
@Override
public void quadrat(Quadrat q) {
q.a*=faktor;
}
@Override
public void translation(Translation t) {
// keine Ahnung warum man das hier brauchen sollte
}
@Override
public void vereinigung(Vereinigung v) {
// keine Ahnung warum man das hier brauchen sollte
}
}
Hoffe, dass es das nu' ist
Hab' leider nicht immer viel Zeit....
Warum ich dabei aber die Methoden translation und vereinigung implementieren sollte erschließt sich mir gerade nicht. Also hab' ich's einfach mal gelassen
Vergessen zu erwähnen: Die Bezeichnungen für die Klassen und Methoden haben mein Hirn fast zerfressen