call by reference bei struct Feldern



  • #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    
    struct poly 
    {
    	int x;
    	int y;
    };
    
    void Eingabe(struct poly **Feld, int N)
    {
    	int i=0;
    	for(i=0;i<N;i++){
    		printf("Wert %d.Punkt x eingeben: ",i+1);
    		fflush(stdin);
    		scanf("%d",&Feld[i]->x);
    		printf("Wert %d.Punkt y eingeben: ",i+1);
    		fflush(stdin);
    		scanf("%d",&Feld[i]->y);
    	}
    }
    
    void Berechnung_Ausgabe(struct poly Feld[], int N)
    {
    	double strecke_x;
    	double strecke_y;
    	double polylang=0;
    	int i=0;
    	for(i=0;i<N-1;i++){
    		strecke_x=fabs(Feld[i].x-Feld[i+1].x);
    		strecke_y=fabs(Feld[i].y-Feld[i+1].y);
    		polylang=polylang+sqrt((strecke_x*strecke_x)+(strecke_y*strecke_y));
    	}
    	printf("Polygonlänge = %.3lf\n", polylang);
    }
    
    int main(void)
    {
    	int N=0;
    	struct poly *Feld;
    	printf("Polygon\n\n");
    	printf("Anzahl der Punkte: ");
    	fflush(stdin);
    	scanf("%d", &N);
    	Feld=malloc(N*sizeof(struct poly));
    	Eingabe(&Feld, N);
    	Berechnung_Ausgabe(Feld, N);
    	return 0;
    }
    

    Ich bekomme keine Fehlermeldung aber ich kann über den Aufruf scanf("%d",&Feld[i]->x); (bei der Eingabe Funktion) nur auf das erste Feld Element zugreifen das zweite ist dann nicht definiert, wie schaffe ich das jeder Feldplatz über den Index angesprochen werden kann ?



  • Sachen die mir auffalen:

    • fflush(stdin) Es soll Fälle geben, wo die CPU das Mainboard deshalb zum Schmelzen gebracht hat. Echt Krass.

    - In C gibt es keine C++ Referenzen, Call-By-reference as in C++ gibt es nicht.



  • Habe jetzt nicht gross darueber nachgedacht, aber schau, dass du deinen Doppelpointer richtig dereferenzierst. Du hast einen Zeiger auf ein Array, machst aber Feld[i] (Feld[0] zeigt auf dein Array, Feld[1] zeigt irgendwo ins nirgendwo).



  • änder mal um in

    void Eingabe(struct poly **Feld, int N)
    

    entsprechend die referenzierung innerhalb der funktion und natürlich auch den aufruf.



  • soory
    so:

    void Eingabe(struct poly *Feld, int N)
    


  • #include <stdio.h>
    #include <math.h> 
    #include <stdlib.h> 
    
    typedef struct poly Poly;
    
    struct poly { 
        int x, y; 
    }; 
    
    void cb() {
    	int c = 0;
    
    	while ( (c = getchar()) != '\n'  && c != EOF ){}
    }
    
    int eingabe_punkte ( Poly* Feld, int n ) { 
        int i = 0; 
    
        for ( i = 0; i < n; i++ ) { 
            printf ( "Wert Punkt %d x eingeben: ", i+1 ); 
            if ( 1 != scanf ( "%d", &Feld[i].x ))
    			return 1;
    		cb(); 
    		printf( "Wert Punkt %d y eingeben: ", i+1 ); 
    		if ( 1 != scanf ( "%d", &Feld[i].y ))
    			return 1;
    		cb();
        } 
    	return 0;
    } 
    
    int eingabe_anzahl_punkte ( unsigned* n ) {
    	int ret = *n = 0;
    
    	printf ( "Anzahl der Punkte (mindestens 3): " ); 
    	ret = scanf ( "%u", n ), cb(); 
    	if ( ret != 1 ) {
    		puts ( "Fehler in der Eingabe!" );
    		return 1;
    	}
    	if ( *n < 3 ) {
    		puts ( "Fehler: Anzahl Punkte < 3" );
    		return 1;
    	}
    	return 0;
    }
    
    double polygonlaenge ( Poly* punkte, int n ) { 
    	int strecke_x = 0, strecke_y = 0;
    	double polylang = 0.0; 
        int i = 0; 
    
        for ( i = 0; i < n-1; i++ ) { 
            strecke_x = abs ( punkte[i].x - punkte[i+1].x ); 
            strecke_y = abs ( punkte[i].y - punkte[i+1].y ); 
            polylang += sqrt ((strecke_x * strecke_x) + (strecke_y * strecke_y)); 
        } 
        return polylang;
    } 
    
    int main() { 
    	Poly *punkte = NULL; 
        unsigned n = 0;
    	double plaenge = 0.0;
    
    	printf ( "Polygon\n\n" ); 
    
    	if ( eingabe_anzahl_punkte ( &n ))
    		return 1;
    	if ( NULL == ( punkte = malloc ( n * sizeof ( *punkte )))) {
    		puts ( "Speichermangel!" );
    		return 1;
    	}
    
    	if ( eingabe_punkte ( punkte, n )) 
    		puts ( "Fehler in der Eingabe!" );
    	else
    		plaenge = polygonlaenge ( punkte, n ); 
    
    	printf ( "Polygonlaenge = %.3lf\n", plaenge ); 
    
    	free ( punkte );
    
        return 0; 
    }
    

Anmelden zum Antworten