Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Wie definiert man ein großes Array voller Konstanten?

1 view
Skip to first unread message

Mark

unread,
Dec 15, 2003, 4:09:37 AM12/15/03
to
Hey Leute,

ich habe folgenden Fall vorliegen:

Ich habe in einem eigenem .java-File folgendes deklariert:

public class TestPunkte
{
public final static Punkt[] Kontur = new Punkt[]
{
new Punkt(-1, 137, 0),
new Punkt(0, 138, 1),
new Punkt(0, 139, 2),
new Punkt(1, 139, 3),
new Punkt(1, 140, 4),
new Punkt(2, 141, 5),
...
so geht es dann ca. 9000 Zeilen weiter.

};
}

Wenn ich mein Programm durchstarte (ich benutze übrigens JDK1.4.1
unter netbeans) kommt folgende Exception:

java.lang.ClassFormatError: UmrandungZuDreiecke/TestPunkte (Code of a
method longer than 65535 bytes)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:502),
blabla...


Ooops??? Das im 21. Jahrhundert unter einer modernen
Programmiersprache?
Das kann doch nicht war sein oder? Ich dachte die 8-Bit Prozessoren
haben wir nun langsam hinter uns?
Kann mir einer von Euch verraten wie man es richtig macht?
Oder wie man auf das Large-Modell umschaltet?
Aus einer Datei zur Laufzeit einparsen wollte ich prinzipiell nicht.

Danke für gute Ideen im voraus,

Mark

Stefan Matthias Aust

unread,
Dec 15, 2003, 4:34:48 AM12/15/03
to
Mark wrote:

> public final static Punkt[] Kontur = new Punkt[]
> {
> new Punkt(-1, 137, 0),
> new Punkt(0, 138, 1),
> new Punkt(0, 139, 2),
> new Punkt(1, 139, 3),
> new Punkt(1, 140, 4),
> new Punkt(2, 141, 5),
> ...
> so geht es dann ca. 9000 Zeilen weiter.

Automatisch generiert, oder?

> Wenn ich mein Programm durchstarte (ich benutze übrigens JDK1.4.1
> unter netbeans) kommt folgende Exception:
>
> java.lang.ClassFormatError: UmrandungZuDreiecke/TestPunkte (Code of a
> method longer than 65535 bytes)
> at java.lang.ClassLoader.defineClass0(Native Method)
> at java.lang.ClassLoader.defineClass(ClassLoader.java:502),
> blabla...


Tja, der Java-Compiler ist zu doof, bereits beim Übersetzen
festzustellen, dass die Methode viel zu lang ist.

> Ooops??? Das im 21. Jahrhundert unter einer modernen
> Programmiersprache?
> Das kann doch nicht war sein oder? Ich dachte die 8-Bit Prozessoren
> haben wir nun langsam hinter uns?
> Kann mir einer von Euch verraten wie man es richtig macht?

Nimm mehrere Methoden...

> Oder wie man auf das Large-Modell umschaltet?

So was gibt es nicht.

> Aus einer Datei zur Laufzeit einparsen wollte ich prinzipiell nicht.

Warumm nicht, das wäre IMHO die beste und kleinste Lösung.

Beachte bitte, dass du jetzt ungefähr den folgenden Programmcode für
jedes Array-Element erzeugst:

Schiebe 1 auf den Stack.
Schiebe 0 auf den Stack.
Schiebe 137 auf den Stack.
Erzeuge ein neues Objekt der Klasse "Punkt"
Rufe Konstruktor <init>(III)V auf
Schiebe 5 (den Index) auf den Stack
Hole Arrayobjekt aus statischer Variable
Führe a[5] = punkt aus.

Konstante Strings können übrigens bei Java beliebig lang sein, ich würde
daher eventuell die Koordinaten in einen String kodieren und diesen dann
parsen, um das Array aufzubauen.


bye
--
Stefan Matthias Aust // "Ist es normal, nur weil alle es tun?" -F4

Tobias Schulte

unread,
Dec 15, 2003, 4:37:48 AM12/15/03
to
Mark wrote:
> public class TestPunkte
> {
> public final static Punkt[] Kontur = new Punkt[]
> {
> new Punkt(-1, 137, 0),
> new Punkt(0, 138, 1),
> new Punkt(0, 139, 2),
> new Punkt(1, 139, 3),
> new Punkt(1, 140, 4),
> new Punkt(2, 141, 5),
> ...
> so geht es dann ca. 9000 Zeilen weiter.
>
> };
> }
>

Und warum dann nicht

public final static Punkt[] Kontur = new Punkt[900];
statuc {
int x = -1;
int y = 137;
for (int z = 0; z < Kontur.length; z++) {
Kontur[z] = new Punkt(x, y, z);
if ((z % 2) == 0) x++;
if (((z+1) % 3) != 0) y++;
}
}


oder welcher Algorithmus auch immer dahinter stecken mag.


Tobias

Andree Große

unread,
Dec 15, 2003, 10:01:13 AM12/15/03
to
Mark wrote:
> Hey Leute,
>
> ich habe folgenden Fall vorliegen:
>
> Ich habe in einem eigenem .java-File folgendes deklariert:
>
> public class TestPunkte
> {
> public final static Punkt[] Kontur = new Punkt[]
> {
> new Punkt(-1, 137, 0),
> new Punkt(0, 138, 1),
> new Punkt(0, 139, 2),
> new Punkt(1, 139, 3),
> new Punkt(1, 140, 4),
> new Punkt(2, 141, 5),
> ...
> so geht es dann ca. 9000 Zeilen weiter.

In eine Datei auslagern und in einer Schleife einlesen.
A.G.


Mark

unread,
Dec 15, 2003, 6:03:59 PM12/15/03
to
> Und warum dann nicht
>
> public final static Punkt[] Kontur = new Punkt[900];
> statuc {
> int x = -1;
> int y = 137;
> for (int z = 0; z < Kontur.length; z++) {
> Kontur[z] = new Punkt(x, y, z);
> if ((z % 2) == 0) x++;
> if (((z+1) % 3) != 0) y++;
> }
> }
>
>
> oder welcher Algorithmus auch immer dahinter stecken mag.
>

Weil einfach kein Algorthmus dahinter steckt. Es handelt sich um
gemessene Werte.

Aber ich nehme dann einfach mal zur Kenntnis, dass java soetwas nicht
kann und parse ein externes File ein. Schade, ich dachte ich könnte
mich mal aufs Problem konzentrieren...

Mark

Tobias Schulte

unread,
Dec 16, 2003, 4:47:46 AM12/16/03
to
Mark wrote:

> Weil einfach kein Algorthmus dahinter steckt. Es handelt sich um
> gemessene Werte.

Oh, auf den ersten Blick sah das aus wie diese Intelligenztests, wo man
mathematische Reihen ergänzen muss;)

Tobias

0 new messages