variablen array an Funktion übergeben



  • Hi,

    ich habe mir folgende Funktion geschrieben

    double gauss (int n, double a[3][3], double b[3])
    {
    }
    
    int main(int argc, char *argv[])
    {
    
    double A[3][3]={6,3,2,1,5,-3,-2,1,-4};
    double B[3]={-6,0,8};
    
    gauss(2,A,B);
    
    }
    

    zum testen der Funktion...jedoch möchte ich das jetzt variabel ausbauen, hänge jedoch an dem Problem der Variablen Matrixgröße

    double gauss (int n, double a[n+1][n+1], double b[n+1])
    

    so würd ichs gerne aufrufen.... wie kann ich das verwirklichen ? mit Zeiger (double* array) kann ich nur ein Array weiterleiten....

    dann würd ich gern ein array return-en, aber double gauss[] (...) funktioniert nicht....



  • double gauss (int n, double** a, double* b)
    {
    	//die Zeiger a und b werden je nach n unterschiedlich interpretiert
    	for (int i = 0; i <= n; ++i)
    	{
    		b[i] = 123;
    	}
    }
    
    //ein Array kann man indirekt über Parameter zurückgeben
    void return_array(double* dest, int destSize, ...);
    


  • hmm ... sorry check ich jetzt nicht ....

    normaler aufruf wäre ja mittels

    int main(int argc, char *argv[])
    {
    
    double X[3][3]={6,3,2,1,5,-3,-2,1,-4};
    double Y[3]={-6,0,8};
    gauss(2,X,Y);
    }
    

    wie schreib ich das jetzt um ?



  • hi,
    mach das doch 'eindimensional'

    #include <stdio.h>
    
    #define ZEILEN 3
    #define SPALTEN 4
    
    void matrix_anzeigen ( double* pd, int zeilen, int spalten )
    {
    	int x = spalten, y = zeilen;
    	for ( y = 0; y < ZEILEN; y++ )
    	{
    		for ( x = 0; x < SPALTEN; x++ )
    			printf(" %7.3f ", pd[y*SPALTEN+x]);
    		puts("");
    	}
    }
    
    void matrix_initialisieren ( double* pd, int zeilen, int spalten )
    {
    	int x = spalten, y = zeilen;
    	for ( y = 0; y < ZEILEN; y++ )
    		for ( x = 0; x < SPALTEN; x++ )
    			pd[y*SPALTEN+x] = y*SPALTEN+x;
    }
    
    double gib_xy ( double* pd, int x , int y )
    {
    	if ( x >= SPALTEN || y >= ZEILEN )
    	{
    		puts("Index out of range!"); exit(1);
    	}
    	return pd[y*SPALTEN+x];
    }
    
    int main()
    {
    	int x = SPALTEN, y = ZEILEN;
    	double A2D [ZEILEN*SPALTEN] = {0};
    
    	matrix_initialisieren ( A2D, x, y );
    	matrix_anzeigen ( A2D, x, y );
    
    	// Matrixelement an Position x = 2 und y = 2 anzeigen.
    	printf("%f\n", gib_xy ( A2D, 2, 2 ));
    	return 0;
    }
    

    beim gaußschen algo hat man es ja eh meist mit quadratischen
    matrizen zu tun, kannst du also aus SPALTE und ZEILE einfach einen wert machen.

    oft erzeugt man solche matrizen dynamisch,
    mit der 'eindimensionalen variante' sparst du gegenüber der
    'zweidimensionalen variante' ein bisschen ram.

    noch ein bisschen mehr flexibilität bekommst du mit einem eigenen matrix-typen:

    typedef struct 
    {
    	double* pA2D;
    	int zeilen, spalten;
    /// ... etc.
    }Matrix;
    

    gruß,
    abcok



  • joa, weil mir sowas noch nicht einfiel... mal schauen und probieren ...

    ich komm sowieso irgendwie ausserhalb vom Speicher, da die Werte schnell komisch werden (riesig e+200 und mehr), unter Win7 eher als unter XP.....



  • was mir jetzt jedoch noch kommt, ich habe den Gauß Algo jetzt mit Matrix und Vektor "Ax=B" geschrieben.... wie übergebe ich 2 Arrays an Funktion ? ...,double* a,double* b) funktioniert nicht

    zum anderen will ich einen Vektor zurück und nicht mehr die Matrix 🙂



  • tegg schrieb:

    was mir jetzt jedoch noch kommt, ich habe den Gauß Algo jetzt mit Matrix und Vektor "Ax=B" geschrieben.... wie übergebe ich 2 Arrays an Funktion ? ...,double* a,double* b) funktioniert nicht

    zum anderen will ich einen Vektor zurück und nicht mehr die Matrix 🙂

    klar funktioniert das. du kannst den ergebnisvector in der funktion erzeugen oder vorher und als dritten parameter übergeben:

    double* gauss_variante_eins ( double* a, double* b )
    {
    	double* ergebnis = malloc ( ...
    	// rechne rechne, ... gauss algo 
    	return ergebnis;
    }
    
    void gauss_variante_zwo ( double* a, double* b, double* ergebnis )
    {
    	// return nix :)
    }
    

Anmelden zum Antworten