tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
4034
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    WebOlli WebOlli ist offline Rookie
    Registriert seit
    Apr 2004
    Beiträge
    9
    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;
        }
     
    }
     

  2. #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.

    PSu 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!

  3. #3
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    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.
     

  4. #4
    WebOlli WebOlli ist offline Rookie
    Registriert seit
    Apr 2004
    Beiträge
    9
    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.
    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
     

  5. #5
    Registriert seit
    Mar 2001
    Ort
    München
    Beiträge
    4.785
    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
    Hey, mann fängt irgendwo immer an.

    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!

  6. #6
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    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
    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...)
     

  7. #7
    Registriert seit
    Mar 2001
    Ort
    München
    Beiträge
    4.785
    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...)
    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
     
    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!

  8. #8
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    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
    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?
     

  9. #9
    Registriert seit
    Mar 2001
    Ort
    München
    Beiträge
    4.785
    Original 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.
    Ok ich habe nur OReilly, Addisson-Wesley, sAms, Sun Bücher 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


    Schieben wir es auf die Profs?
    [/B]
    Einverstanden
     
    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

  1. Antworten: 7
    Letzter Beitrag: 10.06.10, 23:16
  2. Antworten: 5
    Letzter Beitrag: 30.09.08, 16:22
  3. Drupal static page mit unterseiten, alle auf die static page verweisend
    Von flokli im Forum Content Management Systeme (CMS)
    Antworten: 0
    Letzter Beitrag: 07.06.08, 21:04
  4. Frage zu static und static const
    Von Xebov im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 12.07.05, 09:38
  5. Antworten: 5
    Letzter Beitrag: 10.11.04, 20:17