Zweidimensionales Array mit Wert füllen

Hallo, ich habe eine dringende Frage. Wir sollen für eine Hausübung ein zweidimensionales Array erstellen, dessen Werte immer eine Zahl sein sollen, also z.B. nur 1en oder nur 2en und so weiter.

So, das sollten wir dann alles in Klassen packen und so weiter und so weiter, das ist eigentlich uninteressant.

Mein Problem nun: Bis jetzt hat eigentlich alles ganz gut geklappt, man kann die Größe der Arrays auswählen und alles, aber beim Füllwert wirft er einen Fehler.

So wird mein Array in der Klasse Image angelegt:

				public Image (int hoehe, int breite, int pixel){
					this.hoehe = hoehe;
					this.breite = breite;
					this.pixel = pixel;
					this.j = new int[hoehe][breite];
					for (int i = 0; i<=hoehe; i++){
						for (int k = 0; k<=breite; k++){
							j**[k] = pixel;
						}
					}```

Habe natürlich vorher alles mit private Variablen initialisiert und getter und setter stimmt danach auch alles, bekomme auch keinen Fehler.

So, wenn ich allerdings jetzt dieses Array mit meiner Klasse "Imaging", welche noch über die Klasse "Display" läuft (die aber hier uninteressant ist) bekomme ich eine Fehlermeldung:

Hier erstmal die Klasse:
```Image ab = new Image(2,2,2);
	Display dd = new Display(ab);
	dd.display(ab);
	Image cd = new Image (1,4,2);
	Display dc = new Display(cd);
	dc.display(cd);```

Auch hier bekomme ich folgende Fehlermeldung erst nach dem Ausführen:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
	at Aufgabe3.Image.<init>(Image.java:28)
	at Aufgabe3.Imaging.main(Imaging.java:21)

Irgendwas stimmt also mit dem Pixelwert nicht, aber ich verstehe nicht was falsch ist, die dritte Zahl bei new Image soll ja den Füllwert des Arrays angeben und dieses soll dann ausgegeben werden. Vorher mit nur zwei Werten (also der Höhe und der Breite) ging es :(

Danke für jede Hilfe!

Dein Problem ist

                        for (int k = 0; k<=breite; k++){
                            j**[k] = pixel;
                        }
                    }```
Du initialisierts das Array ja mit hoehe und breite. Damit geht der Index des Arrays von [0,hoehe) (oder anders Ausgedrückt: [0,hoehe-1] bzw 0...hoehe-1 -> analog mit breite).

Wenn du nun i bzw k bis <= hoehe/breite laufen lässt kommst du auf ein Index der nicht zum Array gehört. (Daher auch der Name **Array**[es bezieht sich auf ein Array]**Index**[irgendwas mit dem Indexzugriff]**OutOfBounds**[Außerhalb der Bounds/Grenzen]**Exception**

Lange Rede kurzer Sinn: aus <= mach <

Wow danke ich hätte nicht gedacht dass es an einem so einfachen Fehler liegt, aber tatsächlich … es geht nun. Vielen Dank :slight_smile:

Die innere Schleife kann man sich sparen, und stattdessen Arrays.fill() verwenden.

Ich würde mir sogar zweidimensionale Arrays sparen und dann mit “index = y * breite + x” ein eindimensionales der Größe “breite * hoehe” verwenden.

Das Problem ist ja schon gelöst.

Ich möchte nur noch mal darauf hineweisen dass es kein OO-Prpblem ist und der Gebrauch von Arrays sowieso überdurchschnittlich oft zu nicht-OO-Lösungen führt.

Ich würde daher einen Moderator bitten den Titel der Diskussion passend zu ändern.

bye
TT

warum es nicht zum Thema machen, also:
‚es kein OO-Problem‘, hmm, sagt wer was anderes, etwa der Thementitel?
warum eigentlich kein OO-Problem?, unklar

Gebrauch von Arrays ist ein übliches Hilfsmittel in Java,
es ist ein Thema über Arrays (auch wenn es andere Lösungen geben kann, aber bisher haben sogar alle Vorschläge noch Arrays dabei!),
der Thementitel ist passend, die Area ist passend, es gibt keine falschen Prefixe
(falls nicht von jemanden zwischenzeitlich unerkennbar geändert, das wäre ‚aua‘)

was genau ist bitte falsch, und welcher Korrekturvorschlag? :wink:
und gleich für die Zukunft nächstes Mal deutlich schreiben

(ich habe keinen besonderen Grund für Schärfe in Nachfrage, auch wenn es so klingen mag, außer vielleicht dass das hier recht unnötig erscheint)

@SlaterB :
Ungefähr die selben Gedanken hatte ich bei TTs Bitte auch. Evtl. müssen wir ihn zum Moderator rekrutieren, damit er den Titel entsprechend ändert und uns zeigt, was er meint.
Evtl. reicht es aber auch, wenn er den Titelvorschlag hier einfach mal unterbreitet.

jetzt klingen wir im Verbund langsam wirklich unfreundlich, so soll es nicht sein,
jeder der hier ist, ist ein echter Gewinn, und Top 10-Poster hat man naturgemäß nicht dutzendweise :wink: absolut zu hegen und pflegen

wenn es nach mir ginge (und technische Möglichkeiten vorhanden) hätten eh 30 Leute alle Edit-Rechte für verantwortungsvollen Umgang, ob Moderator oder nicht

Unabhängig vom Threadtitel (ich konnte weder im Titel, noch im nicht vorhandenen Tag oder im Unterforum eine Referenz auf OOP finden) finde ich @Timothy_Truckles Einwand wichtig und hervorhebenswert:

Die Botschaft ist mMn recht eindeutig: in Java sollte man klassische Arrays vermeiden, wo es geht.

speziell hier aber schwer, oder?
pixel sind klassische ArrayDaten, ArrayList versteckte Alternative mit Autoboxing, LinkedList oder eigene Konstrukte?

abgesehen vom netten Trick „index = y * breite + x“ ist auch im besonderen das 2D-Array gegenüber 1D-Array absolut nicht außer Acht zu lassen,
hilft enorm für Strukturierung und Verständnis für Einsteiger,

Arrays.fill() braucht man dann auch nicht gleich, um es nun gleich allen zu geben :wink:
eine simple Schleife zu lernen ist auch hilfreich, wie man sieht hier Lernen dringend nötig,
besser hier als später in mächtigen Programmen Fehler versteckt

idealerweise kommt man eh nach drei solchen Schleifen darauf, sich selber eine fill()-Methode zu schreiben,
ob es die dann schon gibt und man die nutzt oder nicht ist direkt fast egal,
für höhere Stufen an lesbaren Code/ Austausch mit anderen Programmierern wieder wichtiger, auch nicht zu unterstätzen, aber eher erst nächstes Jahr

Da stimme ich dir zu, dies ist einer der Fälle, in denen man aus Performancegründen direkt Arrays verwenden sollte. Mit ArrayLists und Autoboxing zu arbeiten, dürfte ein ziemlicher Performancekiller sein. Vor allem, wenn die Bilder mal etwas größer werden.
Dass man echte Arrays verwendet, sollte man dann aber gut kapseln, sodass diese Eigenschaft von außen nicht sichtbar ist. Dazu müsste man jetzt den Rest der Klasse Image sehen.
Dass OOP in diesem Fall aber nicht konsequent umgesetzt ist, sieht man mMn schon in dem kurzen Ausschnitt: int pixel, was ist das? Ein Farbwert? Wenn ja, welches Farbmodell?
An dieser Stelle wäre in einer objektorientierteren Welt eine eigene Klasse Pixel oder ggf. auch Color angebracht.

[quote=SlaterB]‘es kein OO-Problem’, hmm, sagt wer was anderes, etwa der Thementitel?
[…]
es gibt keine falschen Prefixe[/quote]Nicht mehr, der Titel wurde geändert.

[quote=SlaterB;96098]Gebrauch von Arrays ist ein übliches Hilfsmittel in Java[/quote]Ja, aber zu oft das Falsche.

[quote=cmrudolph;96121]in Java sollte man klassische Arrays vermeiden, wo es geht.[/quote]So sehe ich das auch.

[quote=SlaterB;96124]speziell hier aber schwer, oder?[/quote]Ja, und zwar in erster Linie deshalb, weil die Aufgabenstellung einen Array-Ansatz nahe legt (wohl um das Schleifenthema zu addressieren…)

bye
TT

[QUOTE=Timothy_Truckle;96179]Nicht mehr, der Titel wurde geändert.[/QUOTE]Ach sooo… da stand vorher ein anderer Titel/anderes Präfix? Ist mir gar nicht aufgefallen.

ich habs geahnt, einige Moderatoren bzw. höheres machen das manchmal, dabei gibt es auch eine Edit-Funktion die das anzeigt :wink:

Ich war es nicht. :wink:

Ich war’s ::grins2

Bei der Frage ging es meiner Meinung nach nicht um OO (völlig unabhängig davon, ob jetzt Arrays “gut” oder “schlecht” für OO sind), sie hätte genauso gut in einem C-Forum stehen können. Insofern schien es folgerichtig, TT’s Bitte nachzukommen.

‘Moderation - Thema bearbeiten’ ist verführerisch, setzt nur leider keinen Edit-Eintrag,
nach Möglichkeit also ‘Bearbeiten’ des ersten Postings bevorzugen, da kann man dann das Gleiche erreichen mit Edit-Eintrag

soviel zum Offtopic und ich setzte das Thema nun mindestens ein drittes Mal auf ‘Gelöst’,
warum auch immer sich das ständig zurücksetzt, noch so ein Ärgernis,