C++ zweidimensionalen Array an Funktion übergeben?

4 Antworten

Du kannst es als Doppelpointer übergeben, allerdings solltest du deiner Funktion die Größen des Arrays ebenfalls mit übergeben und nicht einfach in globalen Konstanten stehen haben, das ist Fehleranfällig.

Und könnte mir jemand noch erklären wie ich die Fehlermeldungen wegbekomme

Wenn du die Warnings meinst solltest du den Fehler selbst beheben in deinem Fall ist der Fehler, dass der Compiler 001000010000 nicht als eine Bitfolge sondern als Dezimalzahl interpretiert. Weil du die in einem Char Array speicherst wird die Zahl abgeschnitten.

Du solltest das Bitmuster in eine Dezimalzahl umrechnen und so angeben, dann sind auch die Warnings weg, welche in dem Fall wirklich auf einen Fehler deinerseits hindeuten.

Das abschalten von Warnings sollte nicht gemacht werden, weil man sonst eben solche Fehler leicht übersieht.


RIDDICC  09.04.2018, 17:53

als Oktalzahl... stümmt's?

0
PeterKremsner  09.04.2018, 17:59
@RIDDICC

Was meinst du mit Oktalzahl?

Bei 001000010000 handelt es sich ganz klar um eine Zahl im Binärformat. Im Oktalformat könnte zB die Zahl 715 sein.

Als Beispiel für eine Zahl in den Verschiedenen Formaten:

Dezimal: 255

Hex: FF

Octal: 377

Binär: 11111111

0
PeterKremsner  09.04.2018, 18:08
@RIDDICC

Achso du meinst dass der Compiler die Zahl eventuell im Oktalformat erkennt?

Ja das wird in dem Fall ziemlich sicher der Fall sein, ich gehe dabei aber davon aus, dass der TE die Zahl im Binärformat angeben wollte, was aber in C so nicht funktioniert.

0
Jemand1344 
Fragesteller
 09.04.2018, 18:07

Das ist eigentlich nur ein Testlauf weil ich das game of live programmieren möchte und schauen wollte ob bei Der Ausgabe alles korrekt funktioniert also das soll weder eine oktal noch eine dezimalzahl sein

0
Jemand1344 
Fragesteller
 09.04.2018, 18:25

Ich hab die frage nochmal überarbeitet da ich einen fehler gemacht habe aber es funktioniert immer noch nicht vielleicht wird dadurch der Sachverhalt etwas klarer 😂

0

C/C++ kennen nativ keine mehrdimensionalen Arrays. Rein datentechnisch gesehen sind zweidimensionale Arrays in diesen Sprachen jeweils "geschachtelte" eindimensionale Arrays: die "innere" Ebene definiert die erste Dimension, und außen drum hat man dann eine "äußere" Ebene mit einem Array of Pointer, welche dann die zwei Dimension stellt.

Das bedeutet auch, dass man ein solches Array als Funktionsparameter beispielsweise mit dem Konstrukt

int *array[]

oder

int **array

in einer Parameterliste deklarieren kann. Analog dazu läuft die Initialisierung dann z. B. in einem Konstrukt wie folgt:

int array[][5]=
    {{1,2,3,4,5},{11,12,13,14,15},{21,22,23,24,25}};

Die letzte Dimension muss in der LHS der Deklaration klar festgeschrieben werden (hier: 5). Die erste Dimension ergibt sich implizit über die Zahl der angelieferten "Zeilen" im Initializer.

Problem bei diesen ganzen Arrays: wenn man davon mehrere, und mit unterschiedlichen Größen hat, muss man sich Gedanken machen, wie man gescheite bounds checks macht. Da gibt es zwei Strategien: man arbeitet mit terminierenden Elementen (z. B. auf der "Zeilenebene" mit einem NULL-Abschluss, was hier geht, weil die "Zeilenebene" technisch ja "int *" ist). Oder man geht gleich den Weg, das ganze Ding zu typisieren und im zusammengebauten Datentypen die Arraydimensionen eben mitzuspeichern.

So eine Typisierung könnte z. B. so aussehen:

class CInt2Array {
public:
  int **data;
  int nrows,ncols;
};

Wenn man diesen Weg geht, muss man dann allerdings im Konstruktor/Destruktor erstmal das Array auch wirklich zeilenweise auf- bzw. wieder abräumen (mit new/delete-Konstrukten).

Der Charme einer Typisierung ist aber, dass man dann z. B. den Zugriffsoperator [] redefinieren kann, bzw. dort konkret einen Bounds Check einziehen und im "out of bounds"-Fall eine selbst definierte Exception werfen kann, um koordinierte Fehlerbehandlung zu ermöglichen.

Oder man arbeitet von vornherein ohne den Array-Operator, legt die Nutzdaten (Variable "array" in obigem Beispiel) in den "private"-Bereich, definiert Getter und Setter, und geht konsequent nur noch über diese Zugriffsmethoden. Und die können dann den Bounds Check machen.

Übergibt den Pointer auf einen Pointer:

void ausgeben(char **feld, int rows, int columns);

Am besten zusammen mit den jeweiligen Dimensionen. Prüfe vor der Schleife, dass der Index nicht überlaufen werden kann.

Bezüglich der Warnungen: Suche mal bei Google danach. Du wirst auch einige Compilerflags setzen müssen.

  1. was ist wenn du in der Parameter-Definition von „ausgeben()“ statt „feld[][]“ lieber „feld[8][]“ schreibst?
  2. ehm? was soll „001000010000“ sein? das ist ne Octalzahl, die 134221824 entspricht und über 3 Byte braucht... sowas geht doch nich in nen char... oder?

PeterKremsner  09.04.2018, 18:01

Warum denkst du bei 001000010000 an eine Zahl im Oktalformat, für mich siehts eher nach einer Zahl im Binärformat aus...

Als Oktalzahl würde ich es eher interpretieren wenn da nur eine 0 vorne steht, aber 2 sieht für mich nach einer Zahl im Binärformat mit 3 Byte länge aus.

0
RIDDICC  09.04.2018, 22:00
@PeterKremsner
> cat > a.c
int main() {
	return 0011;
}
^D
> c++ -o a a.c
> ./a
> echo $?
9

ich dachte schon... LOL

0
Jemand1344 
Fragesteller
 09.04.2018, 18:05

Das ist eigentlich nur ein Testlauf weil ich das game of live programmieren möchte und schauen wollte ob bei Der Ausgabe alles korrekt funktioniert

0