2 2-Dim. Array addieren



  • Hallo!

    Dies ist meine Aufgabe!

    Ich habe jetzt erst einmal versucht die beiden Arrays zu initialisieren.

    Dies sieht wie folgt aus:

    int init_matrix()
    {
    	int i, k;
    	int matrix1[MAX_X][MAX_Y];
    	int matrix2[MAX_X][MAX_Y];
    
    	for(i=0; i < MAX_X; i++)
    		for(k=0; k < MAX_Y; k++)
    		{
    			matrix1[i][k]= 
    
    		}
    
    	for(i=0; i < MAX_X; i++)
    		for(k=0; k < MAX_Y; k++)
    		{
    			matrix2[i][k]= 		
    
    		}
    
    }
    

    Aber mir fehlen die Zahlen, die in die einzelnen Felder reinkommen! Ich weiß nicht, wie ich die formulieren soll!!!

    Kann mir jemand helfen?

    gruß sheddy



  • Erstens: So wie ich die Aufgabe verstehe, sollst du die Funktion für jede der Matrizen getrennt aufrufen (und diese nacheinander als Parameter übergeben).

    Zweitens: Als Lösungsansatz wäre sowas geeignet:

    int val=1;
    for(i=0; i < MAX_X; i++)
      for(k=0; k < MAX_Y; k++)
      {
        matrix1[i][k]=val;
        ++val;
      }
    

    Drittens: Die Definitionen matrix1 und matrix2 gehören ins Hauptprogramm - bei dir sind die Matrizen weg, sobald die Funktion zu Ende ist.



  • Drittens: Die Definitionen matrix1 und matrix2 gehören ins Hauptprogramm - bei dir sind die Matrizen weg, sobald die Funktion zu Ende ist.

    Ich weiß noch nicht genau, wie das mit der Parameterübergabe von arrays unf funktionen funktionert! Diese besch... arrays sind noch neu für mich! ich komme damit irgendwie nicht klar...

    aber trotzdem schon mal danke



  • sheddy schrieb:

    Drittens: Die Definitionen matrix1 und matrix2 gehören ins Hauptprogramm - bei dir sind die Matrizen weg, sobald die Funktion zu Ende ist.

    Ich weiß noch nicht genau, wie das mit der Parameterübergabe von arrays unf funktionen funktionert!

    Das geht (fast) genauso wie mit normalen Variablen. Nur wird dabei das Array als Pointer (auf seinen Anfang) interpretiert, wodurch die Übergabe effektiv mit Referenzsemantik funktioniert.

    Ich will mal so nett sein und dir einen Einstieg anbieten:

    typedef int Matrix[MAX_X][MAX_Y]; //nur um Schreibarbeit abzukürzen
    
    //füllt die Matrix x mit Werten (anhand von 'dir' bestimmst du die Anordnung
    typedef enum{up,down} Direction;
    void init_matrix(Matrix x, Direction dir);
    
    //addiert l und r und schreibt das Ergebnis in erg
    void add_matrix(Matrix l,Matrix r,Matrix erg);
    
    //gibt die Matrix x aus
    void print_matrix(Matrix x);
    
    int main()
    {
      Matrix m1,m2,target;
      ...
    }
    

    (Die einzelnen Funktionen und den Rest der main() darfst du jetzt selber schreiben)



  • ähm...ja...

    ich kapier das irgendwie nicht!

    ich sehe da nicht, was an welche funktion übergeben wird 😕



  • Wie jetzt? 😮
    Es ist doch sogar alles kommentiert... Du musst doch nur noch ablesen!
    init_matrix() erhält als Parameter die zu initialisierende Matrix und eine Enumeration.
    So kannst du dir eben jede Funktion angucken.



  • Muss ich da jetzt mit Zeigern arbeiten? Dann muss ich mich da erst mal reinfuchsen!

    Ansonsten weiß ich immer noch nicht, wie das mit der Parameterübergabe an Funktionen geht!

    Kannste mir nicht mal ein Beispiel geben?



  • Einfaches Beispiel:

    int add(int x, int y) { // die Funktion erwartet 2 ganzzahlige Parameter
        return x + y; // die Parameter werden addiert und das Ergebnis der Addition zurückgegeben
    }
    
    int main() {
        int c;
    
        c = add(3, 4); // 3 und 4 werden als Werte für die Parameter in die Funktion gegeben
                       // der Wert, den die Funktion zurückliefert, wird anschließend in c gesichert
        printf("Result: %d", c);
        return 0;
    }
    


  • oh...habe etwas vergessen!

    ich meine, ich weiß (noch) nicht, wie das mit der Parameterübergabe von arrays an Funktionen ist!

    ich muss das ja irgendwie nutzen; so steht es jedenfalls in der aufgabe!





  • Im Prinzip auch nicht besonders komplex:

    void outpArr(int* arr) {
    	int i;
    
    	for(i=0; i<=sizeof(arr); i++) {
    		printf("%d\n",arr[i]);
    	}
    }
    
    int main(void) {
    	int array[5];
    	int i;
    
    	for(i=0; i<5; i++) {
    		array[i] = i+2;
    	}
    
    	outpArr(array);
    
    	return 0;
    }
    

    Vielleicht solltest du den Kauf eines Buche in betracht ziehen. Das sind eigentlich Themen, die du in jeder halbwegs brauchbaren Fachliteratur nachlesen kannst...



  • Hallo Matthias

    Du hast aber auch einen schweren Fehler in deinem Programm.

    for(i=0; i<=sizeof(arr); i++)
    

    sizeof(arr) liefert die anzahl der Bytes vonn arr. Das sind 4 * die Anzahl der Feldelemente. (Da int mit 4 Bytes definiert ist). Das gibt dir eine riesige Speicherverletzung

    Korrekt muss es lauten

    for(i = 0; i < (sizeof(arr) / sizeof(int)); i++)
    

    Gruß Robert



  • Hups.. Naja, kann zu der Uhrzeit ja schon mal passieren. Merkt man dann ja auch spätestens der Debugger 😉



  • Razer_6 schrieb:

    sizeof(arr) liefert die anzahl der Bytes vonn arr. Das sind 4 * die Anzahl der Feldelemente. (Da int mit 4 Bytes definiert ist). Das gibt dir eine riesige Speicherverletzung

    Noch schlimmer: sizeof(arr) liefert die Größe EINES int-Zeigers, egal wieviele Daten dort dahinterstehen. An die tatsächliche Größe des Arrays kommst du außerhalb der main() nicht mehr portabel ran (das heißt für dich: Wenn du nicht davon ausgehen kannst, diese Größe zu kennen, mußt du sie als Parameter mitgeben).



  • Ich möchte diese Aufgabe jetzt mit Zeigern lösen und meine Lösung sieht für die erste Hälfte wie folgt aus:

    #include <stdio.h>
    
    #define MAX_X 15
    #define MAX_Y 10
    
    int init_matrix(int, int)
    
    int main(void)
    {
    	int matrix1[MAX_X][MAX_Y];
    	int matrix2[MAX_X][MAX_Y];
    
    	init_matrix(matrix1,0);
    	init_matrix(matrix2,1);
    
    	return 0;
    }
    
    void init_matrix(int (*matrix)[MAX_Y],int x)
    {
    	int i, k;
    
    	if(x==0)
    	{
    		int m=1;
    		for((*matrix)< MAX_X; (*matrix)++)
    		{
    			for(k=0; k < MAX_Y; k++)
    			{
    				*matrix(*matrix)[k]=m++;
    
    			}
    		}
    	}
    	else
    	{
    		int p=MAX_X*MAX_Y;
    		for((*matrix)< MAX_X; (*matrix)++)
    		{	
    			for(k=0; k < MAX_Y; k++)
    			{
    				*matrix(*matrix)[k]=p--; 		
    
    			}
    		}
    	}
    }
    

    Ich habe ihn noch nicht umsetzen lassen. Aber kann mir jemand jetzt schon sagen, wo meine Fehler sein könnten?!

    gruß Sheddy



  • @sheddy "Ich möchte diese Aufgabe jetzt mit Zeigern lösen und meine Lösung sieht für die erste Hälfte wie folgt aus:"
    Wenn schon mit Zeigern, dann so:

    #define MAX_X 15 
    #define MAX_Y 10 
    
    void init_matrix(int(*)[MAX_Y], int); 
    
    int main(void) 
    { 
        int matrix1[MAX_X][MAX_Y]; 
        int matrix2[MAX_X][MAX_Y]; 
    
        init_matrix(matrix1,0); 
        init_matrix(matrix2,1); 
    
        return 0; 
    } 
    
    void init_matrix(int(*matrix)[MAX_Y],int x) 
    { 
        int i, k; 
    
        if(x==0) 
        { 
            int m=1; 
            for(i = 0; i< MAX_X; i++) 
            { 
                for(k=0; k < MAX_Y; k++) 
                { 
                    matrix[i][k]=m++; 
    
                } 
            } 
        } 
        else 
        { 
            int p=MAX_X*MAX_Y; 
            for(i = 0; i < MAX_X; i++) 
            {    
                for(k=0; k < MAX_Y; k++) 
                { 
                    matrix[i][k]=p--;         
    
                } 
            } 
        } 
    }
    

    :xmas1:



  • Okay, sonst habe ich auch alles so!

    habe es nachdem ich es gepostet habe auch in deine Form gebracht un er hat ständig noch einen Fehler gebracht!

    error C2664: 'init_matrix': Konvertierung des Parameters 1 von 'int [15][10]' in 'int' nicht möglich

    Und ich glaube, es lag ständig an der Funktions-Definition im Präprozessor!

    Ich habe stundenlang nach diesem blöden Fehler gesucht!!

    Endlich, danke...

    halt moment:

    Wo liegt mein Fehler in der Präprozessoranweisung?!?!
    Wenn ich nämlich alle Funktionen vor die main-Funktion schiebe, klappt das Programm.

    So aber nicht:

    #include <stdio.h>
    
    #define MAX_X 15
    #define MAX_Y 10
    
    void init_matrix(int (*)[MAX_Y],int);
    void print_matrix(int (*)[MAX_Y],int (*)[MAX_Y],int (*)[MAX_Y]);
    void add_matrix(int (*)[MAX_Y]);
    
    int main(void)
    {
    	int matrix1[MAX_X][MAX_Y];
    	int matrix2[MAX_X][MAX_Y];
    	int matrix3[MAX_X][MAX_Y];
    
    	init_matrix(matrix1,1);
    	init_matrix(matrix2,0);
    
    	add_matrix(matrix1, matrix2, matrix3);
    
    	print_matrix(matrix1);
    	print_matrix(matrix2);
    	print_matrix(matrix3);
    
    	return 0;
    }
    
    void init_matrix(int (*imat)[MAX_Y], int x)
    {
    	int i,k;
    
    	if(x==1)
    	{
    		int m=1;
    		for(i=0;i < MAX_X; i++)
    		{
    			for(k=0; k < MAX_Y; k++)
    			{
    				imat[i][k]=m++;
    
    			}
    		}
    	}
    	else
    	{
    		int m=MAX_X*MAX_Y;
    		for(i=0;i < MAX_X; i++)
    		{	
    			for(k=0; k < MAX_Y; k++)
    			{
    				imat[i][k]=m--; 		
    
    			}
    		}
    	}
    }
    
    void add_matrix(int (*amat1)[MAX_Y],int (*amat2)[MAX_Y],int (*amat3)[MAX_Y])
    {
    	int i,k;
    	for(i=0;i < MAX_X; i++)
    	{	
    		for(k=0; k < MAX_Y; k++)
    		{
    			amat3[i][k]=amat1[i][k]+amat2[i][k]; 		
    		}		
    	}
    }
    
    void print_matrix(int (*pmat)[MAX_Y])
    {
    	int i,k;
    	for(i=0;i < MAX_X; i++)
    	{	
    		for(k=0; k < MAX_Y; k++)
    		{
    			printf("%5d",pmat[i][k]); 		
    		}
    		printf("\n");
    	}
    	printf("\n");
    }
    

    Warum?!



  • STOPP

    Habe den Flüchtigkeitsfehler gefunden!!1

    Vielen Danke für eure Hilfe


Log in to reply