Seite 1 von 1

Berechnung Länge einer Kettenlinie m Punkte n Dimensionen

Verfasst: Mo Nov 26, 2012 7:57 pm
von schos22
hallo,

ich soll ein Programm schreiben, das die Länge einer Kettenlinie mit m Punkten und n Dimensionen berechnet. m und n werden eingegeben, die Speicherverwaltung der Struktur soll dynamisch sein.

Mein Programm stürzt aber leider immer wieder ab, ich schätze, ich mache was mit der Speicherverwaltung falsch. hat einer von euch eine idee?

Code: Alles auswählen


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double *ptr;

struct point { //Struktur point mit dynamischer Anzahl von double-Werten
    double* ptr;
};

struct point *p; //dynamische Anzahl an Punkten p aus struct point

double abstand (struct point* p , int n, int m) {
    double d [m-1]; //array zum Speichern der jeweiligen Abstände zwischen je             zwei Punkten
    double D = 0, summe = 0; //D = späteres Ergebnis, Quadratwurzel aus der Summe des obigen arrays
    int abst = 0, dim = 0, j = 0;

    for (;abst < m-1; abst++) { //solange abst kleiner als die Anzahl der Abstände
        for (dim = 0; dim < n; dim++) {
           summe = summe + (p[abst+1].ptr [dim] - p[abst].ptr [dim]) *  (p[abst+1].ptr [dim] - p[abst].ptr [dim]);
       } //wird der Hilfsvariable summe der Wert der alten Summe + der Differenz  des Quadrates der derzeitigen Koordinate zweier Punkte zugewiesen
    d [abst] = summe; //abschließend wird diese summe in einem array-Element    gespeichert und 0 gesetzt
    summe = 0;
   }

   for (j = 0; j < m-1; j++) {
      D = D + d[j]; //solange noch ein Abstand vorhanden, werden diese alle aufaddiert
   }

   D = sqrt (D); //abschließend wird die Quadratwurzel daraus gezogen

   return D; //und das Ergebnis zurückgegeben
}

int main () {

    int n = 0, m = 0, i = 0, k=0;
    char c = 'j';

    printf ("Berechnung Laenge D einer Kettenlinie zwischen m Punkten im n- dimensionalen Raum\n\n");

   while (c== 'j') {

      printf ("n = ");
      fflush (stdin);
      scanf ("%d", &n); //Einlesen der Dimension

      ptr = (double*) malloc (n*(sizeof(double))); //Reservieren Speicherplatz für die n Dimensionen

     printf ("m = ");
     fflush (stdin);
     scanf ("%d", &m); //Einlesen Anzahl Punkte

     p = (struct point*) malloc (m * (sizeof(struct point))); //Reservieren des   Speicherplatzes für die m Punkte

     for (; k<m; k++) { //solange k kleiner ist als die Anzahl der Punkte
        printf ("p%d", k); //Wird dem punkt p k
        printf ("\n");
        for (i=0; i < n; i++) { // solange i kleiner als die Dimension ist
            printf ("%d. Koordinate: ", i+1); //jeweilige Koordinate
            fflush (stdin);
            scanf ("%lf", &p[k].ptr[i]); //der Koordinate i des Punktes k wird ein Wert zugewiesen
            printf ("\n");
        }

      }
    k = 0; //Rücksetzen von k

    printf ("Abstand: %lf", abstand (p, n, m)); //Berechung Abstand zwischen den  Punkten in abstand
    printf ("\n\n");
    free (ptr); //Freigabe Speicherplatz
    free (p);

    printf ("\n\nNochmal? (j/n)");
    fflush (stdin);
    scanf ("%c", &c);
    }

}




Re: Berechnung Länge einer Kettenlinie m Punkte n Dimensione

Verfasst: Mo Nov 26, 2012 8:08 pm
von Xin
Nur mal flott drübergeguckt, muss also nicht richtig sein:

Code: Alles auswählen

   scanf ("%lf", &p[k].ptr[i]); //der Koordinate i des Punktes k wird ein Wert zugewiesen
Du forderst Speicher für p an. Wo forderst Du Speicher für p.ptr an?

Re: Berechnung Länge einer Kettenlinie m Punkte n Dimensione

Verfasst: Mo Nov 26, 2012 8:09 pm
von cloidnerux
Mein Programm stürzt aber leider immer wieder ab, ich schätze, ich mache was mit der Speicherverwaltung falsch. hat einer von euch eine idee?
Ich denke mal, es sind Indexprobleme

Code: Alles auswählen

p[abst+1].ptr [dim] - p[abst].ptr [dim]
Wenn abst dein Indexzähler ist und dein Array m Elemente besitzt, wirst du bis m-1 und dann hier m-1+1 rechnen, greifst also auf ein Element dahinter zu.

Code: Alles auswählen

   p = (struct point*) malloc (m * (sizeof(struct point)));
...
 scanf ("%lf", &p[k].ptr[i]);
Du Weist zwar deinem Array aus point-structs einen Speicherplatz zu, aber dem Array aus doubles(ptr) jedes einzelnen Punktes weist du nichts zu. Daher greifst du hier auf vollkommen willkürliche Speicherzellen zu. Du musst jedem einzelnen ptr aus dem point-struct Speicherplatz zuweisen.

Re: Berechnung Länge einer Kettenlinie m Punkte n Dimensione

Verfasst: Mo Nov 26, 2012 8:29 pm
von Fisherman

Code: Alles auswählen

struct point { //Struktur point mit dynamischer Anzahl von double-Werten
    double* ptr[];
Zumindest läuft dadurch die Abfrage der Koords komplett durch. (Array von Pointern)