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; }