Benutzerdefiniertes char-Array

DeChecka

Erfahrenes Mitglied
Hi!
Wollte mal fragen, wie ich ein zweidimensionales Array so definieren kann, dass beide Dimensionsgrößen bestimmt werden können...
Folgendes Problem ergibt sich nämlich dabei:
Ich will eine Funktion schreiben, die ein zweidimensionales char-Array als Parameter erwartet...

Da weiß ich ja jetzt noch nicht, wie groß dann die zweite Dimension des Arrays ist.
Jetzt suche ich einen Weg (ohne die Möglichkeit mit #define ARRAY_SIZE 20 oder so in der Art), wie ich die Größe der zweiten Dimension durch eine Variable bestimmen kann...

Also erstmal ein Beispiel, damit's verständlich wird ;) :
Code:
bool ArraysVergleichen(char array1[][], char array2[][]);

Das geht ja leider nicht, da maximal die erste Dimension ohne Größenangabe sein darf...
Gibt es jetzt eine Möglichkeit, das ganze zum Beispiel so zu machen:
Code:
bool ArraysVergleichen(char array1[][int groeße1], char array2[][int groeße2]);

Denn das geht glaub ich leider nicht...

Code:
bool ArraysVergleichen(char array1[][groeße1], char array2[][groeße2], int groeße1, int groeße2);


Das geht leider auch nicht :( ...

Kann einer helfen?

MfG
DeChecka
 
moin


Vielleicht so in der Art:
Code:
bool ArraysVergleichen(char *array1, char *array2, int x, int y)
{
    for(int i=0; i<x; i++)
        for(int l=0; l<y; l++)
            cout<< array1[i][l];

.......

}
Hoffe du verstehst wie ich das meine.


mfg
umbrasaxum
 
Hmmm, wieso bringt der Compiler folgende Fehlermeldung?
30 C:\Programme\Dev-Cpp\Vergleichen.cpp invalid types `char[int]' for array subscript

Die erscheint, wenn ich einfach nur 'nen Vergleich machen will:
Code:
if(array1[zaehlen2][zaehlen1] == '\0')

MfG
DeChecka
 
Die STL hat da schon was für dich...
Code:
#include <algorithm>
#include <iostream>

int main()
{
	const int x = 5;
	const int y = 10;

	int a[x][y];
	int b[x][y];
	
	/* ... */

	if( std::equal(*a, *(a+x*y), *b ) )
		std::cout << "Gleich";
	else
		std::cout << "Nicht gleich";
}

Kannst es auch über memcpr() machen:

Code:
if( memcmp(*a, *b, x*y) )

Achja wenn du es unbedingt selber machen willst:
Code:
template <int x, int y>
bool ArraysVergleichen(char array1[x][y], char array2[x][y])
{
    for(int i=0; i<x; ++i)
		for(int j=0; i<y; ++j)
			if(array1[i][j] != array2[i][j])
				return false;
	return true;
}
Da musst du dann aber beim Funktionsaufruf die Template-Paramater selber definieren, also so:
Code:
ArraysVergleichen<10, 15>(a, b)
 
Zuletzt bearbeitet:
Und wieso ging das bei mir so nicht, wie ich es wollte?

PS: Ich will natürlich dann zwei komplette zweidimensionale Arrays vergleichen... Das wird ziemlich kompliziert, oder? ;)

MfG
DeChecka
 
Ja ok...
Für 'nen Neuling schon noch kompliziert... ;)

Und wieso es auf meine Art nicht ging, kannst du mir das noch bitte sagen?

MfG
DeChecka
 
DeChecka hat gesagt.:
Code:
bool ArraysVergleichen(char array1[][], char array2[][]);

Geht nicht, weil der Compiler das array1[][] als **array1 ansieht. Ein Zweidimensionales Array ist kein Doppelpointer.

DeChecka hat gesagt.:
Code:
bool ArraysVergleichen(char array1[][int groeße1], char array2[][int groeße2]);
Code:
bool ArraysVergleichen(char array1[][groeße1], char array2[][groeße2], int groeße1, int groeße2);

Von der Idee ist das hier schon besser. Nur muss die dimension eines Arrays immer schon zu Compile-Zeit festliegen, das ist bei dir nicht der Fall. Wenn du Anstatt array1[][int groeße1] das hier schreibst:array1[][10] hast du ein Array aus Pointern.

Eigentlich hab ich es genauso, nur als Template. Dies funktioniert da zur Compile-Zeit feststehen muss wie die Funktion aufgerufen werden muss. (Der Compiler muss wissen welche Schablone für die Funktion er braucht)


Du kannst es aber auch ganz anderst machen (siehe meine anderen Beispiele): Bei mehrdimensionalen Arrays liegen alle Elemente direkt hintereinander im Speicher. Wenn du alse die Gesamtzahl der Elemente und die Adresse des ersten Elements hast reicht das schon. Aber du weißt dann in der Funktion nicht ob es ein 4x4 Array oder 8x2 Array ist.
 
Zurück