ERLEDIGT
NEIN
NEIN
ANTWORTEN
8
8
ZUGRIFFE
4034
4034
EMPFEHLEN
-
Hallo!
Nachdem ich jetzt schon so einiges in Java programmiert habe, begreife ich immer noch nicht das Problem mit static/non-static....
Ich habe hier folgendes Proramm, dass einige zufällig erzeute Datensätze vom Typ CDatenSart in einem array per Heapsort sortiert. Der einzige Fehler, den ich bekomme, ist in der Main-funktion wenn ich den Heapsort mit der Funktion "Heap (Feldname)" aufrufen will. da sag mir der compiler irgendwas mit static, bla, bla. Was zum Teufel muss ich ändern, damit das funktioniert? und worauf genau muss ich beim Programmieren achten, um so etwas zu vermeiden?
Kann mir das jemand hier erklären?
Ach ja: sollten im Code irgendwelche konventienen verletzt oder ähnliches untypisches sein, wundert euch nicht, der stammt nämlich zu 90% von meinem Prof.!
Vielen Dank!
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
import java.util.Random; import java.util.Date; public class Heapsort { void Senke(CDatenSatz[]Feld,int Vater,int Ende){ CDatenSatz swap = Feld[Vater]; int Sohn, SohnL, SohnR; int key = swap.key; while (true) { SohnL = (Vater << 1) + 1; if (SohnL > Ende) break; SohnR = SohnL + 1; Sohn = SohnL; if (SohnR <= Ende && Feld[SohnL].key < Feld[SohnR].key) Sohn = SohnR; if (Feld[Sohn].key <= key) break; Feld[Vater] = Feld[Sohn]; Vater = Sohn; } Feld[Vater] = swap; } void Heap(CDatenSatz[] Feld) { if(Feld.length<=1) return; int Ende = Feld.length - 1; for(int Knoten = Ende/2; Knoten >= 0; Knoten--) Senke(Feld, Knoten, Ende); for(int Knoten=Ende; Knoten>=1; Knoten--){ CDatenSatz swap = Feld[Knoten]; Feld[Knoten] = Feld[0]; Feld[0] = swap; Senke(Feld, 0, Knoten - 1); } } void SenkeUp(CDatenSatz[] Feld,int Vater, int Ende) { CDatenSatz swap = Feld[Vater]; int Vater0 = Vater; int Sohn = Vater; int key = swap.key; int SohnL, SohnR; while (true) { SohnL = (Sohn << 1) + 1; if (SohnL > Ende) break; SohnR = SohnL + 1; if (SohnR <= Ende) { if (Feld[SohnL].key < Feld[SohnR].key) { Feld[Sohn]=Feld[SohnR]; Sohn = SohnR; } else { Feld[Sohn] = Feld[SohnL]; Sohn = SohnL; } } else { Feld[Sohn]=Feld[SohnL]; Sohn = SohnL; } } while (true) { if (Sohn == 0) { Feld[0]= swap; return; } Vater = (Sohn-1)/2; if (Feld[Vater].key < swap.key) { Feld[Sohn]=Feld[Vater]; Sohn = Vater; } else { Feld[Sohn]=swap; return; } } } void HeapUp(CDatenSatz[] Feld) { if(Feld.length<=1) return; int Ende = Feld.length - 1; for(int Knoten=Ende/2; Knoten>=0; Knoten--) Senke(Feld, Knoten, Ende); for(int Knoten=Ende; Knoten>=1; Knoten--) { CDatenSatz swap = Feld[Knoten]; Feld[Knoten] = Feld[0]; Feld[0] = swap; SenkeUp(Feld, 0, Knoten - 1); } } public static void main (String args[]) { int elZahl=IO.readInt("Anzahl der Werte?: ");//Eingabe Feldlänge CDatenSatz[] Feld = new CDatenSatz[elZahl]; Random random = new Random(); for (int i=0; i<elZahl; i++) { //Erzeugen von Zufallszahlen Feld[i] = new CDatenSatz(random.nextInt()); //negative Werte filtern if (Feld[i].getKey()<0) { int temp = Feld[i].getKey() * -1; Feld[i].key = temp; } //System.out.println("Erzeugtes Array: "); //System.out.print( Feld[i].getKey()+" "); } //arrayAusgeben (test); long timeA=System.currentTimeMillis(); Heap(Feld); long timeB=System.currentTimeMillis()-timeA; //arrayAusgeben (test); System.out.println("Laufzeit: "+timeB); } } class CDatenSatz { int key; public CDatenSatz (int key) { this.key = key; } public int getKey() { return this.key; } public void setKey(int key) { this.key = key; } }
-
25.05.04 14:23 #2
- Registriert seit
- Mar 2001
- Ort
- München
- Beiträge
- 4.785
static bla bla
sagt der Compiler wirklich nicht. Er wird dir sagen das du aus einer Statischen Methode nur eine Statische Methode aufrufen kannst, und keine Membermethode.
Wenn du anstatt static bla bla zu schreiben, die Fehlermeldung im genauen Wortlaut hier gepostet hättest dann hätte ich dir die Antwort geben können ohne in den Code zu schauen.
Du rufst die Methode Heap() auf. Diese Methode ist aber einer Instanz der Klasse zugehörig und nicht der Klasse selber.
Ich könnte dir jetzt raten deine Anwendung so umzuschreiben das Heap() eine statische Methode ist, das werde ich nicht machen, denn das währe Grausames OOP Design.
Du solltest deine Anwendung so umschreiben das in der Main-Methode nicht mehr als eine instanzierung und dann nur noch 2-3 Methoden aufrufe stehen. Sprich sämtliche Logic in die Klasse kapseln.
Das heisst wenn deiner Sotierer Objecte von CDatensatz sotieren soll, dann verpass ihm eine Methode sort() (Wo wir gerade dabei sind.
offizielle Java-Konvention damit wird der Code lesbarer und professioneller
Klassennamen Gross:
CDataSorter
Variablennamen klein
CDataSorter sorter = new CDataSorter();
Methoden klein:
sorter.sort(feld);
Geh bei deinem Programm davon aus das du den Sorter später wieder nutzen willst. Gleichzeitig nenne deine Methode so das es ein Sinn ergibt. Wenn ein Aufruf von Heap() sotieren soll dann nenne die Methode sort();
Code :1 2 3 4
public static void main(String[] args) { CDatenSatz[] data = { new CDatenSatz[1], new CDatenSatz[2] }; data = new CDataSorter().sort(data); }
Dann benenne Heap in sort um, bennnene die anderen Methoden wie die Konvention in kleinschrift um dann geht das auch.
grüsse.
PS
u solltest dir Zudem nochmal OOP ein bischen anlesen. Insbesondere was genau der Unterschied zwischen Instanzen und Klassen sind.
Erst wenn der letzte Programmierer eingesperrt...
...und die letzte Idee patentiert ist, werdet ihr merken, dass Anwälte nicht programmieren können.
-------------------
chris: hey Tom hast du eigentlich ne Freundin
jdar: ich bin tutorials.de Mod!
-
Original geschrieben von WebOlli
Hallo!
Nachdem ich jetzt schon so einiges in Java programmiert habe, begreife ich immer noch nicht das Problem mit static/non-static....
Ich habe hier folgendes Proramm, dass einige zufällig erzeute Datensätze vom Typ CDatenSart in einem array per Heapsort sortiert. Der einzige Fehler, den ich bekomme, ist in der Main-funktion wenn ich den Heapsort mit der Funktion "Heap (Feldname)" aufrufen will. da sag mir der compiler irgendwas mit static, bla, bla. Was zum Teufel muss ich ändern, damit das funktioniert? und worauf genau muss ich beim Programmieren achten, um so etwas zu vermeiden?
Kann mir das jemand hier erklären?
Ach ja: sollten im Code irgendwelche konventienen verletzt oder ähnliches untypisches sein, wundert euch nicht, der stammt nämlich zu 90% von meinem Prof.!
Vielen Dank!
1) Schnapp Dir ein Anfängerbuch und lies mal nach, was static bedeutet
2) public static void main(...) sollte m.E. nur als Programmstart verwendet werden. Jegliche weitere Funktionalität gehört in die entsprechenden Klassen, Konstruktoren und Methoden. Dann würde Dein Problem gar nicht auftreten. Denn: Innerhalb einer static Methode hast Du nur Zugriff auf andere static Methoden und Variablen. Im Code wird jedoch in der main(...) auf Methoden zugegriffen, die nicht static sind, -> Compilerfehlermeldung
3) Schönen Gruß an den Prof: Variablennamen beginnen mit einem Kleinbuchstaben. Nur Klassennamen beginnen mit einem Großbuchstaben, und Konstanten werden komplett in großen Buchstaben deklariert.
-
das ist mir klar... und damit ihr das nicht mir anlastet, hatte ich's ja extra erwähnt...Original geschrieben von Snape
3) Schönen Gruß an den Prof: Variablennamen beginnen mit einem Kleinbuchstaben. Nur Klassennamen beginnen mit einem Großbuchstaben, und Konstanten werden komplett in großen Buchstaben deklariert.
Auf jeden Fall Danke für die Tipps!
....auch wenn ihr mein mühsam angeeignetes Java-Wissen ganzschön nieder macht
-
25.05.04 14:53 #5
- Registriert seit
- Mar 2001
- Ort
- München
- Beiträge
- 4.785
Hey, mann fängt irgendwo immer an.Original geschrieben von WebOlli
das ist mir klar... und damit ihr das nicht mir anlastet, hatte ich's ja extra erwähnt...
Auf jeden Fall Danke für die Tipps!
....auch wenn ihr mein mühsam angeeignetes Java-Wissen ganzschön nieder macht
Und wäre es dir lieber wir würden lieber nur Ja & Amen sagen, obwohl wir sehen das
du auf der falschen Färte bist?
Das sollte kein Kommentar sein aller: Ach geh weg, und lies nochmal ...
Sondern eher in der Richtung:
Du hast da was noch nicht ganz verstanden. Ich könnte es jetzt versuchen dir zu erklären, aber dann würde ich genauso viel schreiben müssen wie das was der Author des Buches schon geschrieben hat.
PS: Richte das bitte wirklich an deinen Prof aus, das seine Benennung und Konvention allen offiziellen Java Standards widerspricht.Erst wenn der letzte Programmierer eingesperrt...
...und die letzte Idee patentiert ist, werdet ihr merken, dass Anwälte nicht programmieren können.
-------------------
chris: hey Tom hast du eigentlich ne Freundin
jdar: ich bin tutorials.de Mod!
-
Das übliche Problem eben. Viele Bücher sind mit fehlerhaftem und/oder suboptimalem Code "gesegnet". Dazu fehlen oftmals Erklärungen zu den einfachen Dingen. Deshalb ist das Lernen einer Programmiersprache autodidaktisch anhand eines oder mehrerer Bücher weder einfach noch zwangsläufig richtig.Original geschrieben von WebOlli
das ist mir klar... und damit ihr das nicht mir anlastet, hatte ich's ja extra erwähnt...
Auf jeden Fall Danke für die Tipps!
....auch wenn ihr mein mühsam angeeignetes Java-Wissen ganzschön nieder macht
(Dein Prof scheint mir auch einer aus dieser Kategorie zu sein
Ein Mann der Praxis würde es jedenfalls besser machen...)
-
25.05.04 15:16 #7
- Registriert seit
- Mar 2001
- Ort
- München
- Beiträge
- 4.785
Sorry aber da übereinstimme ich nicht mit dir.Original geschrieben von Snape
Das übliche Problem eben. Viele Bücher sind mit fehlerhaftem und/oder suboptimalem Code "gesegnet". Dazu fehlen oftmals Erklärungen zu den einfachen Dingen. Deshalb ist das Lernen einer Programmiersprache autodidaktisch anhand eines oder mehrerer Bücher weder einfach noch zwangsläufig richtig.
(Dein Prof scheint mir auch einer aus dieser Kategorie zu sein
Ein Mann der Praxis würde es jedenfalls besser machen...)
Ich kenne noch kein Buch das sich nicht mit Java Konventionen befasst.
Und ich habe doch nicht wenige Zuhause rumstehen
Das problem ist eher oftmals der Leser der solchen "nebensächlichkeiten" kein Vertrauen
schenkt das sie wirklich wichtig sind.
aber drinn stehen tuts
Erst wenn der letzte Programmierer eingesperrt...
...und die letzte Idee patentiert ist, werdet ihr merken, dass Anwälte nicht programmieren können.
-------------------
chris: hey Tom hast du eigentlich ne Freundin
jdar: ich bin tutorials.de Mod!
-
Wird aber selten explizit darauf hingewiesen, auch wenn es im Code Verwendung findet. Mir fällt nur auf, dass in letzter Zeit vermehrt Beispiele gepostet werden (nicht nur hier), die die Konventionen verletzen. Schieben wir es auf die Profs?Original geschrieben von Christian Fein
Sorry aber da übereinstimme ich nicht mit dir.
Ich kenne noch kein Buch das sich nicht mit Java Konventionen befasst.
Und ich habe doch nicht wenige Zuhause rumstehen
Das problem ist eher oftmals der Leser der solchen "nebensächlichkeiten" kein Vertrauen
schenkt das sie wirklich wichtig sind.
aber drinn stehen tuts
-
25.05.04 15:31 #9
- Registriert seit
- Mar 2001
- Ort
- München
- Beiträge
- 4.785
Ok ich habe nur OReilly, Addisson-Wesley, sAms, Sun BücherOriginal geschrieben von Snape
Wird aber selten explizit darauf hingewiesen, auch wenn es im Code Verwendung findet. Mir fällt nur auf, dass in letzter Zeit vermehrt Beispiele gepostet werden (nicht nur hier), die die Konventionen verletzen.
Kann sein das die x. Ausgabe von Java in 21 Tagen, oder Java für Dummies usw nicht drauf hinweist.
Das Buch tut es:
http://www.dpunkt.de/java/Die_Sprach...n_Java/22.html
Das auch:
http://www.galileocomputing.de/openb...0256StyleGuide
EinverstandenSchieben wir es auf die Profs?
[/B]
Erst wenn der letzte Programmierer eingesperrt...
...und die letzte Idee patentiert ist, werdet ihr merken, dass Anwälte nicht programmieren können.
-------------------
chris: hey Tom hast du eigentlich ne Freundin
jdar: ich bin tutorials.de Mod!
Ähnliche Themen
-
non-static variable cannot be referenced from a static context
Von UGG116 im Forum Java GrundlagenAntworten: 7Letzter Beitrag: 10.06.10, 23:16 -
non-static methode mit static class aufrufen?
Von Error999 im Forum JavaAntworten: 5Letzter Beitrag: 30.09.08, 16:22 -
Drupal static page mit unterseiten, alle auf die static page verweisend
Von flokli im Forum Content Management Systeme (CMS)Antworten: 0Letzter Beitrag: 07.06.08, 21:04 -
Frage zu static und static const
Von Xebov im Forum C/C++Antworten: 5Letzter Beitrag: 12.07.05, 09:38 -
Warum globale Funktionen in Treibern static?
Von jccTeq im Forum C/C++Antworten: 5Letzter Beitrag: 10.11.04, 20:17





Zitieren
Login





