problem mit zeigerübergabe



  • Hallo,

    Hab leider ein Problem mit meinem Code:
    Es soll eine Matrix an die Funktion CloneMatrix übergeben werden.
    Diese soll dann von der Funktion in eine neue Matrix kopiert werden und diese, dann zurückgegeben werden.
    Leider hab ich noch Probleme mit den Zeigern:

    double **CloneMatrix(double **m1,int dim1,int dim2)
    {
    	int i,j;
        double m2[dim1][dim2];
    	for(i=0;i<dim1;i++)
    		for(j=0;j<dim2;j++)
    			m2[i][j]=m1[i][j];
    	return m2;  
    	/* Multiple markers at this line
    	- function returns address of local 
    	 variable
    	- return from incompatible 
    	 pointer type*/
    }
    
    int main()
    {
    	int dim1=3,dim2=4,i,j;
    	double m1[dim1][dim2];
    	double m2[dim1][dim2];
    
    	for(i=0;i<dim1;i++)    // Füllt die Matrix mit Werten
    		for(j=0;j<dim2;j++)
    			m1[i][j]=i+j;
    
    	m2=CloneMatrix(m1,dim1,dim2);
    	/*Multiple markers at this line
    	- incompatible types in assignment
    	- passing arg 1 of `CloneMatrix' from incompatible 
    	  pointer type*/
    	return 0;
    }
    

    mfg



  • 1.) m2 aus Zeile 4 stirbt nach dem Funktionsaufruf wieder
    2.) mit memcpy wär's viel einfacher:

    double m1[dim1][dim2];
    double m2[dim1][dim2];
    int i, j;

    for(i=0;i<dim1;i++) // Füllt die Matrix mit Werten
    for(j=0;j<dim2;j++)
    m1[i][j]=i+j;
    memcpy(m2, m1, sizeof(m1));



  • Hallo,

    Leider muss ich die Funktion selbst programmieren und darf memcopy nicht verwenden.
    Hast du vielleicht eine Idee wie man meinen Code hinbiegen könnte?

    mfg



  • typedef char one_byte_t;
    
    void my_own_memcpy(void *dest, void *what, size_t how_much)
    {
        one_byte_t *pt1 = dest, *pt2 = what;
    
        while (how_much--)
            *pt1++ = *pt2++;
    }
    

    🙂
    Es ist einfach leichter so, außerdem viel generischer.
    So kann man alles kopieren was man will, deine Array-Dimensionen sind
    egal, solange du die gesamte Größe herausfinden kannst.



  • m2=CloneMatrix(m1,dim1,dim2);
    

    Zuweisungen an ein Array gehen sowieso nicht, deshalb muß ein vierter
    Parameter her.

    Mit meinem memcpy wäre nur noch ein Makro nötig:

    #define CloneMatrix(m2, m1, dim1, dim2) (memcpy(m2, m1, (dim1 * dim2))
    /* und dann so aufrufen: */
    double m1[dim1][dim2] = /* initialisiert */;
    double m2[dim1][dim2]; /* Wert unbestimmt */
    CloneMatrix(m2, m1, dim1, dim2);
    /* um m1 nach m2 zu kopieren */
    

    (ungetestet)
    Reicht dir das?



  • Klammer vergessen:

    #define CloneMatrix(m2, m1, dim1, dim2) (memcpy(m2, m1, (dim1 * dim2)))
    //                                                                    ^
    


  • Hallo,

    Danke so funktionierts.
    Ich muss aber leider einen Zeiger zurückgeben. Ich hab das ganze jetzt darauf abgeändert.
    Wie du oben erwähnt hast ist es leider nicht möglich m2= zu schreiben. (assignment error). Wie müsste man das sonst machen?

    void *CloneMatrix(void *m1,size_t size)
    {
        char *pt1 = m1, *pt2;
    
        while (size--)
            *pt2++ = *pt1++;
    
        return pt2;
    }
    
    int main()
    {
    	int dim1=3,dim2=4,i,j;
    	double m1[dim1][dim2];
    	double m2[dim1][dim2];
    
    	for(i=0;i<dim1;i++)    // Füllt die Matrix mit Werten
    		for(j=0;j<dim2;j++)
    			m1[i][j]=i+j;
    
    	m2=(double*)CloneMatrix(m1,sizeof(double)*dim1*dim2);
    
    	return 0;
    }
    


  • symbian schrieb:

    ...ist es leider nicht möglich m2= zu schreiben. (assignment error). Wie müsste man das sonst machen?

    #define DIM1 3
    #define DIM2 4
    
    typedef struct array_tag
    {
    	double m[DIM1][DIM2];	
    }array;
    
    int main(void)
    {
        int i, j;
    	array m1, m2;
    
        for (i=0; i < DIM1; i++)    // Füllt die Matrix mit Werten
            for (j = 0; j < DIM2; j++)
    			m1.m[i][j] = i+j;
    
    	m2 = m1;
    
        return 0;
    }
    

    😉



  • m2 = m1;

    Considered cheating.
    1.) geht das noch nicht lange, 2.) wirft's einen assignment error.

    Ich muss aber leider einen Zeiger zurückgeben.

    Du könntest mit man: malloc Speicher anfordern, aber den müßte man
    wieder mit man: free freigeben. Du könntest m2 in der CloneMatrix-Funktion
    static machen, aber dann hättest du immer nur höchstens ein m2.

    Es ist (egal, was dein Lehrer sagt) einfach mehr "C style", wenn man den Ziel-Zeiger
    als Argument übergibt. Dann kann der Aufrufer ganz frei entscheiden, woher
    der Speicher kommen soll.


Anmelden zum Antworten