Check ob Inhalte eines Vektors in Matrix enthalten sind
-
Hallo User,
kann mir jemand bei meinem Code helfen?!?
Folgendes habe ich vor:
1. Ich erzeuge mir einen Vektor, z.b. bestehend aus 5 Zahlen
2. Ich erzeuge mir eine Matrix (Element) bestehend aus 4 Knoten
Ich erhalte die richtigen Werte als Ergebnis (16 Elemente mit je vier Knoten), allerdings habe ich zuvor Element als [4][4] definiert. (Meines Erachtens nach müsste ich Elemente als [16][4] definieren, oder?)3. Check ob einer oder mehrere der in Vektor abgespeicherten Zahlen in einem Element ist.
Hier verwundert mich die Ausgabe! (Richtig wäre, wenn lediglich Element 12, 15 und 16 mit dem Hinweis (Element No. 12/15/16 printed) alle anderen Elemente sollen den Hinweis (Element No x not printed) da in diesen Elementen je eine oder mehrere Zahlen des Vektors enthalten sind)Kann mir das jemand erklären, bzw. einen Lösungsvorschlag geben? Das wäre super.
Vielen Dank im Voraus!
/* TESTING ZONE */ int i, j, k; int Element_test [4][4]; int Vektor [5]; int found, number; int vertikal, horizontal; number= 0; vertikal= 4; horizontal= 4; found = 1; Vektor [0]=1; Vektor [1]=2; Vektor [2]=4; Vektor [3]=9; Vektor [4]=12; printf ("Vektor:\t %d\t %d\t %d\t %d\t %d\n\n", Vektor [0], Vektor[1], Vektor[2], Vektor[3], Vektor [4]); for (i=0; i<vertikal; i++ ){ for ( j=0; j <horizontal; j++ ){ number=number+1; Element_test [i][0] = i+j; Element_test [i][1] = i+1+j; Element_test [i][2] = i+10+j; Element_test [i][3] = i+j+10+1; printf ("Element %i :\t %d\t %d\t %d\t %d\n", number, Element_test [i][0], Element_test [i][1], Element_test [i][2], Element_test [i][3] ); } } printf ("\n"); for (i=1; i<=number; i++ ){ for ( j=0; j <4; j++ ){ for (k=0; k<5; k++){ if (Element_test [i][j] == Vektor [k]) found =0; } } if (found!= 0){ printf ("Element No. %i printed\n", i); } else{ printf ("Element No. %i not printed\n", i); } found = 1; }
-
Ich habe nicht so ganz verstanden was du willst, aber dies Zeile 37 passt nicht, da
number
größer als 3 ist.
Somit kann auch i größer als 4 werden und dein Index für Element_test stimmt nicht mehr.
Da komm dann sowas wie Element_test[5][0] raus. Das Element existiert nicht.Warum machst du da kein
for (i=0; i<vertikal; i++ )
?
-
Außerdem hat deine Matrix hinterher ganz andere Werte als die die du während des Befüllens ausgibst. Das fängt zum Beispiel schon damit an, dass sie nur 4x4 ist, du aber 16x4 ausgibst. Und auch sonst passt das nicht.
-
SeppJ schrieb:
Außerdem hat deine Matrix hinterher ganz andere Werte als die die du während des Befüllens ausgibst. Das fängt zum Beispiel schon damit an, dass sie nur 4x4 ist, du aber 16x4 ausgibst. Und auch sonst passt das nicht.
Richtig! Genau das Problem habe ich ja in meinem ersten Beitrag geschrieben.
Das Ergebnis soll eine 16 x 4 Matrix sein!
Wenn ich die Matrix allerdings so definiere:int Element_test [Anzahl][4]; Anzahl = horizontal * vertikal;
erhalte ich nur Müll bzw. nicht das richtige Ergebnis.
Wenn ich allerdings die Matrix als 4 x 4 definiere, werden meine zwei Schleifen genau 16 mal durchlaufen, was zu meiner gewünschten Matrix führt.
Da ist doch ein ganz großer Denkfehler, oder?!?
-
lion1981 schrieb:
Da ist doch ein ganz großer Denkfehler, oder?!?
Ja. Du durchläufst in deiner Schleife alle 16 Einzelwerte deiner 4x4 Matrix, tust aber so, als würdest du ganze Zeilen durchlaufen.
-
Wenn ich aber meine Schleifen so laufen lasse, erhalte ich eine Matrix 64 x 4 und das ist falsch. Richtig wäre wie gesagt, 16 x 4. Es tut mir total leid aber irgendwie erkenne ich den Fehler nicht...
Meine Schleife soll zunächst Zeile 1(i=0) mit 4 Werten füllen (j=0 bis 3). Im Anschluss sollen meine restlichen Zeilen (i = 1 bis 15) ebenfalls mit je 4 Werten (j=0 bis 3) gefüllt werden.Kannst du mir das ganze nochmal an dem Code verdeutlichen?!? Das wäre super, ich stehe total auf dem Schlauch...
/* TESTING ZONE */ int k; int Anzahl; int Element_test [Anzahl][4]; int Vektor [5]; int found, number; int vertikal, horizontal; number= 0; vertikal= 4; horizontal= 4; Anzahl = vertikal * horizontal; found = 1; Vektor [0]=1; Vektor [1]=2; Vektor [2]=4; Vektor [3]=9; Vektor [4]=12; printf ("Vektor:\t %d\t %d\t %d\t %d\t %d\n\n", Vektor [0], Vektor[1], Vektor[2], Vektor[3], Vektor [4]); for (i=0; i< Anzahl; i++ ){ for ( j=0; j < horizontal; j++ ){ number=number+1; Element_test [i][j] = i+j+5; Element_test [i][j] = i+1+j; Element_test [i][j] = i+10+j; Element_test [i][j] = i+j+10+1; printf ("Element %i :\t %d\t %d\t %d\t %d\n", number, Element_test [i][j], Element_test [i][j], Element_test [i][j], Element_test [i][j] ); } }
-
Mal es dir doch auf ein Blatt Papier auf.
/* TESTING ZONE */ int k; int Anzahl; // Anzahl hat hier irgendeinen beliebigen Wert aus dem Wertebereich eines int. Kann 0 sein, muss es aber nicht. int Element_test [Anzahl][4]; // mit diesem beliebigen Wert erzeugst du hier ein 2D Array. int Vektor [5]; int found, number; int vertikal, horizontal; number= 0; vertikal= 4; horizontal= 4; Anzahl = vertikal * horizontal; // Hier ist es zu spät, da das Feld schon angelegt wurde found = 1; ...
VLA (Variable Length Arrays) gibt es erst seit C99. Visual Studio von Microsoft unterstützt das z.B. nicht.
So sollte zumindest die Initialisierung stimmen:
int k; int vertikal = 4; int horizontal = 4; int Anzahl = vertikal * horizontal; int Element_test [Anzahl][horizontal]; int Vektor [5]; int found, number;